본문 바로가기
Python

[DL] PyTorch: view, data, and detach

by ds31x 2024. 3. 22.

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.datatensor 인스턴스의 데이터를 의미하는 attrubte.
    • tensor 인스턴스의 gradrequires_grad와 같은 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

 

dl_tensor_detach_view_data.ipynb

dl_tensor_detach_view_data.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com