Boostcamp AI tech 3기/개념 이해

pytorch의 reshape and view 차이 (+ contiguity 문제)

mcdn 2022. 1. 24. 18:01
반응형

https://discuss.pytorch.org/t/in-pytorch-0-4-is-it-recommended-to-use-reshape-than-view-when-it-is-possible/17034

 

In PyTorch 0.4, is it recommended to use `reshape` than `view` when it is possible?

In PyTorch 0.4, is it generally recommended to use Tensor.reshape() than Tensor.view() when it is possible ? And to be consistent, same with Tensor.shape and Tensor.size()

discuss.pytorch.org

Tensor.size() is the original function. Tensor.shape was added to be nicer to numpy users. Both are exactly the same.

Tensor.reshape() and Tensor.view() though are not the same.

  • Tensor.view() works only on contiguous tensors and will never copy memory. It will raise an error on a non-contiguous tensor.
  • Tensor.reshape() will work on any tensor and can make a clone if it is needed.

They are similar but different. For example, if you want to change the result inplace and expect the change to reflect on the original Tensor, then you have to use view(). On the other hand, if you don’t need this behaviour, you can use reshape so that you don’t have to worry that the input has to be contiguous.

 

답변 해석 : 

tensor.shape과 tensor.size는 기능이 같다. size라는 torch의 오리지널 함수이 있지만 shape는 numpy user를 위해 더해진 것 

하지만 reshpae view는 차이가 있다. 

tensor.view()는 contiguous tensors에서만 동작하고 절대 메모리를 카피하지 않는다. 

만약 non-contiguous tensor에서 view를 쓰려고하면 에러가 난다. 

tensor.reshape()는 반면 어떤 tensor에서든지 사용 가능하며, 만약 필요하다면 새로 메모리를 할당해서 만든다. 

비슷하지만 다른 두 함수. 

 

만약 기존 오리지널 배열의 값이 바뀌었을 때 참조했던 값도 모두 바뀌길 원한다면 view를 써야한다. 

(SQL에서 view랑 비슷하다고 생각하면 될 듯)

만약 이 동작을 원하지 않고 독립적으로 값을 참조하길 원한다면 reshape를 써야한다. 

 

view를 쓰라고 권장하는 경우, 오리지널 값을 따라가길 원한다는 의미에서 말한거고 

reshape를 쓰라고 권장하는 경우, view와 독립적 패턴을 유지하길 원하는 의미에서 말한듯. 

 

반응형