PyTorch에서 tensor.view()
와 tensor.data
를 제공하며 이들은 다음과 같은 용도로 사용됨.
tensor.view()
tensor.view(*shape)
메서드는 tensor 인스턴스의 dimension을 수정하는데 사용됨.- 이 메서드는 새로운 shape를 가진 같은 데이터의 새로운 tensor 인스턴스를 반환하지만, 원본 tensor 인스턴스와 underlying memory를 공유하여 같은 데이터를 공유함.
- 즉, 메모리를 재할당하지 않고 tensor의 shape와 각 축의 stride만이 바뀜.
view()
를 사용할 때 반환되는 tensor 인스턴스는 기본 텐서 인스턴스와 데이터를 공유하기 때문에,
하나를 변경하면 다른 하나도 변경됨.
- 이는 Nueral Network를 구축할 때, 각 layer에서 tensor를 입력할 때, shape를 수정해야하는 경우 이용됨.
view()
를 사용하기 위해서는 원본 tensor 인스턴스의
데이터가 contiguous memory layout을 가지고 있어야 함.
만약 연속적이지 않다면 tensor.contiguous()
를 먼저 호출하고 view를 호출.
다른 방법으로는 tensor.reshape()
를 이용하는 방법도 있음.
tensor.data (~ .detach)
tensor.data
는 tensor 인스턴스의 데이터를 의미하는 attrubte.- tensor 인스턴스의
grad
와requires_grad
와 같은 tensor의 메타데이터를 가지고 있지 않은 순수한 데이터를 의미.
- tensor 인스턴스의
- 주로 autograd에서 미분 계산을 하지 않고 원본 데이터를 직접 조작할 때 사용되었음.
- 현재 tensor.data를 직접 접근하는 방식은 권장되지 않으며,
- PyTorch 0.4 이후부터는
.detach()
메서드를 사용하여 계산 그래프에서 해당 텐선 인스턴스를 분리하는 방식이 권장됨.
.detach()
를 사용하여 계산 그래프에서 해당 텐서를 분리하면 gradient 계산에서 제외되나 여전히 데이터는 공유함.tensor.data
를 직접 수정할 경우, 계산 그래프의 무결성이 깨질 수 있으며 이는 예상치 못한 버그의 원인이 됨.- 직접적인 데이터 조작이 필요할 때는
.detach()
를 사용하는 것이 권장되는 방법임.
결론
view()
는 텐서의 모양을 변경하는 데 사용됨.
data
는 텐서의 데이터 자체에 접근하기 위해 사용되었으나,
현재는 계산 그래프의 무결성을 위해 .detach()
메서드 사용이 권장됨.
다음 .ipynb 는 .view()
, .contiguous()
, .data
, .detach()
에 대한 사용법을 알 수 있는 소스코드임.
https://gist.github.com/dsaint31x/1234a2642d3ce81649fdd274c9cdcd00
'Python' 카테고리의 다른 글
[OOP] Example: MObject, Point, and Class (0) | 2024.03.23 |
---|---|
[DL] PyTorch: Autograd (Basic) (1) | 2024.03.22 |
[DL] PyTorch: TPU사용하기 (0) | 2024.03.21 |
[DL] Storage: PyTorch 텐서를 위한 메모리 관리 (0) | 2024.03.21 |
[Tensor] NaN Safe Aggregation Functions (0) | 2024.03.20 |