[pytorch] pytorch에서 모양 변경과보기의 차이점은 무엇입니까?

numpy에서는 ndarray.reshape()배열을 재구성하는 데 사용 합니다.

나는 pytorch에서 사람들 torch.view(...)이 같은 목적을 위해 사용 하지만 동시에 torch.reshape(...)기존의 것도 있음을 알았습니다 .

그래서 나는 그들 사이의 차이점이 무엇이며 언제 둘 중 하나를 사용 해야하는지 궁금합니다.



답변

torch.view오랫동안 존재 해 왔습니다. 새로운 모양의 텐서를 반환합니다. 반환 된 텐서는 원본 텐서와 기본 데이터를 공유합니다. 여기 에서 설명서를 참조 하십시오 .

반면 torch.reshape 최근 0.4 버전에서 도입 된 것으로 보인다 . 문서 에 따르면 이 방법은

입력과 동일한 데이터 및 요소 수를 사용하지만 지정된 모양을 사용하는 텐서를 반환합니다. 가능한 경우 반환 된 텐서는 입력보기가됩니다. 그렇지 않으면 사본이됩니다. 연속 된 입력과 호환되는 보폭이있는 입력은 복사하지 않고도 모양을 변경할 수 있지만 복사 대보기 동작에 의존해서는 안됩니다.

이는 torch.reshape원래 텐서의 복사본 또는보기를 반환 할 수 있음을 의미합니다 . 보기 또는 사본을 반환하는 데는 믿을 수 없습니다. 개발자에 따르면 :

복사본이 필요한 경우 동일한 스토리지가 필요하면 clone ()을 사용하십시오. view ()를 사용하십시오. reshape ()의 의미는 저장소를 공유 할 수도 있고 공유하지 않을 수도 있으며 사용자는 미리 알지 못합니다.

또 다른 차이점은 reshape()연속 텐서와 비 연속 텐서 모두에서 작동 할 수있는 반면 연속 텐서 view()에서만 작동 할 수 있다는 것입니다. 의 의미에 대해서는 여기 를 참조 하십시오contiguous .


답변

torch.view및 둘 다 torch.reshape텐서의 모양을 바꾸는 데 사용 되지만 여기에 그 차이가 있습니다.

  1. 이름에서 알 수 있듯이 torch.view단순히 원래 텐서 의 보기 를 생성합니다 . 새 텐서는 항상 원래 텐서와 데이터를 공유합니다. 즉, 원래 텐서를 변경하면 모양이 변경된 텐서가 변경되고 그 반대의 경우도 마찬가지입니다.
>>> z = torch.zeros(3, 2)
>>> x = z.view(2, 3)
>>> z.fill_(1)
>>> x
tensor([[1., 1., 1.],
        [1., 1., 1.]])
  1. 새 텐서가 항상 원본과 데이터를 공유하도록하기 위해 torch.view두 텐서의 모양에 몇 가지 연속성 제약을 부과합니다 [ 문서 ]. 종종 이것은 문제가되지 않지만 torch.view두 텐서의 모양이 호환되는 경우에도 오류가 발생하는 경우 가 많습니다 . 여기에 유명한 반례가 있습니다.
>>> z = torch.zeros(3, 2)
>>> y = z.t()
>>> y.size()
torch.Size([2, 3])
>>> y.view(6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: invalid argument 2: view size is not compatible with input tensor's
size and stride (at least one dimension spans across two contiguous subspaces).
Call .contiguous() before .view().
  1. torch.reshape연속성 제약을 부과하지 않지만 데이터 공유를 보장하지도 않습니다. 새 텐서는 원래 텐서의보기 일 수도 있고, 모두 새 텐서 일 수도 있습니다.
>>> z = torch.zeros(3, 2)
>>> y = z.reshape(6)
>>> x = z.t().reshape(6)
>>> z.fill_(1)
tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
>>> y
tensor([1., 1., 1., 1., 1., 1.])
>>> x
tensor([0., 0., 0., 0., 0., 0.])

요약 :
텐서의 모양을 변경하려면 torch.reshape. 메모리 사용량도 염려하고 두 텐서가 동일한 데이터를 공유하도록하려면 torch.view.


답변

Tensor.reshape()더 강력합니다. 동시에 그것은 어떤 텐서에서 작동 Tensor.view()텐서에서만 작동 tt.is_contiguous()==True.

비 연속적이고 연속적인 것에 대해 설명하는 것은 또 다른 시간 이야기이지만, 항상 텐서를 t연속적으로 만들 t.contiguous()수 있습니다. 그러면 호출 view()하면 오류없이 호출 할 수 있습니다 .


답변