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


83

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

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

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

답변:


89

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

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

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

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

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

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


28
torch.view는 인접한 텐서에서만 작동 할 수있는 반면 torch.reshape는 둘 다에서 작동 할 수 있다는 점을 강조하는 것도 도움이 될 수 있습니다.
p13rr0m 2018

6
@pierrom 연속 여기서 연속 메모리 또는 다른 것에 저장된 텐서를 참조합니까?
gokul_uf

3
@gokul_uf 예, 여기에 작성된 답변을 살펴볼 수 있습니다. stackoverflow.com/questions/48915810/pytorch-contiguous
MBT

"a view of a tensor"라는 문구는 pytorch에서 의미합니까?
Charlie Parker

42

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.


나뿐일지도 모르지만 연속성이 데이터를 공유 할 때와 공유하지 않을 때 사이의 결정적인 요소라는 생각에 혼란 스러웠습니다. 내 자신의 실험에서 이것은 사실이 아닌 것 같습니다. (당신 x과 그 y이상은 모두 연속적입니다). 아마도 이것은 명확히 할 수 있습니까? 모양을 변경하고 복사하지 않는 경우 에 대한 의견 이 도움이 될까요?
RMurphy

6

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.