.view()는 PyTorch에서 무엇을 합니까?
무인 does does 가 뭐죠?.view()
x
의의 값은 무??
x = x.view(-1, 16 * 5 * 5)
view()
는, numpy 와 같이, 메모리를 카피하지 않고 텐서를 재형성합니다.
어 서 서 서 텐 given given a
: 16 요소
import torch
a = torch.range(1, 16)
이 를 ㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴ.4 x 4
예, 예:
a = a.view(4, 4)
, 이제a
되다4 x 4
텐서형상 변경 후 요소의 총 수는 동일하게 유지되어야 합니다. 텐서를 텐서로 재구성하는 것은 적절하지 않을 것이다.
파라미터 -1의 의미는 무엇입니까?
원하는 행 수를 알 수 없지만 열 수를 확신할 수 있는 경우에는 -1로 지정할 수 있습니다(이 값을 더 큰 치수의 텐서로 확장할 수 있습니다). 축 값 중 하나만 -1)이 될 수 있습니다.이것은 라이브러리에게 "이렇게 많은 열을 가진 텐서를 주고 이 작업을 수행하는 데 필요한 적절한 행 수를 계산하십시오."라고 말하는 방법입니다.
이는 이 모델 정의 코드에서 확인할 수 있습니다.줄 뒤에x = self.pool(F.relu(self.conv2(x)))
순방향 기능에서는 16 깊이 피쳐 맵이 표시됩니다.이것을 평평하게 해서 완전히 연결된 층에 주어야 합니다.따라서 PyTorch에게 특정 수의 열을 가지도록 얻은 텐서를 재구성하고 행 수를 스스로 결정하도록 지시합니다.
간단한 것부터 어려운 것까지 예를 들어봅시다.
view
는 method와 합니다.self
를 들어 과 같습니다예를 들어 다음과 같습니다.a = torch.arange(1, 17) # a's shape is (16,) a.view(4, 4) # output below 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [torch.FloatTensor of size 4x4] a.view(2, 2, 4) # output below (0 ,.,.) = 1 2 3 4 5 6 7 8 (1 ,.,.) = 9 10 11 12 13 14 15 16 [torch.FloatTensor of size 2x2x4]
「 」라고 하는 에,
-1
모수 중 하나가 아닙니다. 모수를 곱할 때 결과는 텐서의 요소 수와 같아야 합니다.같은 경우:a.view(3, 3)
는, 「」, 「」를RuntimeError
쉐이프(3 x 3)는 16개의 요소가 있는 입력에는 유효하지 않기 때문입니다. 3 x9입니다.하시면 됩니다.
-1
한 번만 함수에 전달하는 매개 변수 중 하나로 사용됩니다.이 방법은 그 차원을 채우는 방법을 계산해 줍니다.를 들어, 「」입니다.a.view(2, -1, 4)
a.view(2, 2, 4)
[ 2x 4)=] [16 / (2 x 4) = 2 ]반환된 텐서는 동일한 데이터를 공유한다는 점에 유의하십시오."보기"를 변경하면 원래 텐서의 데이터가 변경됩니다.
b = a.view(4, 4) b[0, 2] = 2 a[2] == 3.0 False
이제 좀 더 복잡한 사용 사례를 살펴보겠습니다.문서에 따르면 각 새로운 뷰 치수는 원래 치수의 부분 공간이어야 하거나 모든 i = 0, ..., k - 1, strid[i] = striad[i + 1] x size[i + 1]인 다음과 같은 인접성 조건을 충족하는 d, d + 1, ..., d + k의 범위여야 한다.그렇지않으면,
contiguous()
텐서를 보려면 먼저 호출해야 합니다.예를 들어 다음과 같습니다.a = torch.rand(5, 4, 3, 2) # size (5, 4, 3, 2) a_t = a.permute(0, 2, 3, 1) # size (5, 3, 2, 4) # The commented line below will raise a RuntimeError, because one dimension # spans across two contiguous subspaces # a_t.view(-1, 4) # instead do: a_t.contiguous().view(-1, 4) # To see why the first one does not work and the second does, # compare a.stride() and a_t.stride() a.stride() # (24, 6, 2, 1) a_t.stride() # (24, 2, 1, 6)
「 」에 대해서는, 을해 주세요.
a_t
, stread[0] != stread[1] x size[1] 24 이후!= 2 x 3
view()
를 ' ' '변형'하여 ''하여 '변형'을합니다.
는 어떻게 ?view()
일?
먼저 후드 아래에 텐서가 무엇인지 살펴보겠습니다.
는 인접한 것을 볼 수 있습니다.PyTorch는 PyTorch를 .shape
★★★★★★★★★★★★★★★★★」stride
★★★★
shape
.stride
각 차원의 다음 요소에 도달할 때까지 메모리에서 몇 단계를 수행해야 하는지를 나타냅니다.
view(dim1,dim2,...)
동일한 기본 정보의 보기를 반환하지만 형상의 텐서로 재구성됩니다.dim1 x dim2 x ...
「」를해 주세요).shape
★★★★★★★★★★★★★★★★★」stride
이치노
이는 새로운 치수와 오래된 치수가 동일한 생성물을 갖는다고 암시적으로 가정한다(즉, 이전 텐서와 새로운 텐서가 동일한 부피를 갖는 것이다).
PyTorch-1
-1
는 PyTorch의 별칭으로 "기타 치수가 모두 지정되었을 때 이 치수를 더한다"(즉, 신제품에 의한 원래 제품의 비율)를 나타냅니다.그것은 에서 따온 규칙이다.
때문에, 「 」는 할 수 없습니다.t1.view(3,2)
, 이 예에서는 이 예에 됩니다.t1.view(3,-1)
★★★★★★★★★★★★★★★★★」t1.view(-1,2)
.
torch.Tensor.view()
간단히 말해서, 또는 에서 영감을 받은 새로운 모양이 원래 텐서의 모양과 양립할 수 있는 한 텐서의 새로운 뷰를 만듭니다.
구체적인 예를 들어 자세히 이해합시다.
In [43]: t = torch.arange(18)
In [44]: t
Out[44]:
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])
텐서 이 with with with로t
이 좋은(18,)
, 다음 도형에 대해서만 새 보기를 만들 수 있습니다.
(1, 18)
또는 동등하게 또는
(2, 9)
또는 동등하게 또는
(3, 6)
또는 동등하게 또는
(6, 3)
또는 동등하게 또는
(9, 2)
또는 동등하게 또는
(18, 1)
또는 동등하게 또는
알 수 요소의 위 (upupupupupupupupupupupupup as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as as:2*9
,3*6
etc)는 항상 원래 텐서의 전체 요소 수와 같아야 한다.18
★★★★★★★★★★★★★★★★★★★★★」
한 가지 할 점은 '', '우리끼리', '우리끼리', '우리끼리'를 썼다는 거예요.-1
각 모양 튜플의 각 위치 중 하나에 있습니다.「」를 사용해 .-1
우리는 스스로 계산을 하는 것을 게을리하고 오히려 새로운 뷰를 만들 때 그 도형에 대한 값을 계산하도록 PyTorch에 작업을 위임하고 있습니다.한 가지 중요한 점은 1개만 사용할 수 있다는 것입니다.-1
태플 모양으로.나머지 값은 당사에서 명시적으로 제공해야 합니다. 않으면 는 PyTorch를 이다.RuntimeError
:
RuntimeError: 하나의 차원만 추론할 수 있습니다.
따라서 위에서 언급한 모든 모양과 함께, PyTorch는 항상 원래의 텐서의 새로운 뷰를 반환할 것입니다.t
이는 기본적으로 요청된 각 새로운 뷰에 대해 텐서의 보폭 정보를 변경하는 것을 의미합니다.
다음은 새로운 뷰에 따라 텐서의 진폭이 어떻게 변화하는지를 보여주는 몇 가지 예입니다.
# stride of our original tensor `t`
In [53]: t.stride()
Out[53]: (1,)
이제 새로운 뷰의 진보를 살펴보겠습니다.
# shape (1, 18)
In [54]: t1 = t.view(1, -1)
# stride tensor `t1` with shape (1, 18)
In [55]: t1.stride()
Out[55]: (18, 1)
# shape (2, 9)
In [56]: t2 = t.view(2, -1)
# stride of tensor `t2` with shape (2, 9)
In [57]: t2.stride()
Out[57]: (9, 1)
# shape (3, 6)
In [59]: t3 = t.view(3, -1)
# stride of tensor `t3` with shape (3, 6)
In [60]: t3.stride()
Out[60]: (6, 1)
# shape (6, 3)
In [62]: t4 = t.view(6,-1)
# stride of tensor `t4` with shape (6, 3)
In [63]: t4.stride()
Out[63]: (3, 1)
# shape (9, 2)
In [65]: t5 = t.view(9, -1)
# stride of tensor `t5` with shape (9, 2)
In [66]: t5.stride()
Out[66]: (2, 1)
# shape (18, 1)
In [68]: t6 = t.view(18, -1)
# stride of tensor `t6` with shape (18, 1)
In [69]: t6.stride()
Out[69]: (1, 1)
이것이 함수의 마법입니다.새 보기의 모양이 원래 모양과 호환되는 경우, 새 보기의 각각에 대한 (원래) 텐서의 진보를 변경할 뿐입니다.
진일보한 튜플에서 관찰할 수 있는 또 다른 흥미로운 점은 0th 위치에 있는 요소의 값이 모양 튜플의 1st 위치에 있는 요소의 값과 같다는 것입니다.
In [74]: t3.shape
Out[74]: torch.Size([3, 6])
|
In [75]: t3.stride() |
Out[75]: (6, 1) |
|_____________|
그 이유는 다음과 같습니다.
In [76]: t3
Out[76]:
tensor([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
(6, 1)
0차원을th 따라 한 요소에서 다음 요소로 이동하려면 점프하거나 6단계를 걸어야 한다고 합니다.(예: 에서)0
로로 합니다.6
6개의 스텝을 밟아야 합니다.)그러나st 1차원의 한 요소에서 다음 요소로 이동하려면 한 단계만 수행하면 됩니다(예:2
로로 합니다.3
를 참조해 주세요.
따라서 계산을 수행하기 위해 메모리로부터 요소에 액세스하는 방법의 핵심은 진일보 정보입니다.
torch.reshape()
이 함수는 뷰를 반환하며 새 모양이 원래 텐서의 모양과 호환되는 한 사용하는 것과 정확히 동일합니다.그렇지 않으면 복사본이 반환됩니다.
단, 의 주의사항은 다음과 같습니다.
연속된 입력과 호환되는 진도를 가진 입력은 복사하지 않고도 모양을 바꿀 수 있지만 복사 대 보기 동작에 의존해서는 안 됩니다.
i i i i i i i i 。x.view(-1, 16 * 5 * 5)
x.flatten(1)
여기서 파라미터 1은 평탄화 프로세스가 첫 번째 치수부터 시작됨을 나타냅니다('샘플' 치수를 평탄화하지 않음).의 용법이 으로 더하고 사용하기 에 저는 후자의 용법을 선호합니다.flatten()
.
다음 예에서 보기를 이해하도록 하겠습니다.
a=torch.range(1,16)
print(a)
tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14.,
15., 16.])
print(a.view(-1,2))
tensor([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.],
[11., 12.],
[13., 14.],
[15., 16.]])
print(a.view(2,-1,4)) #3d tensor
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.]],
[[ 9., 10., 11., 12.],
[13., 14., 15., 16.]]])
print(a.view(2,-1,2))
tensor([[[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.]],
[[ 9., 10.],
[11., 12.],
[13., 14.],
[15., 16.]]])
print(a.view(4,-1,2))
tensor([[[ 1., 2.],
[ 3., 4.]],
[[ 5., 6.],
[ 7., 8.]],
[[ 9., 10.],
[11., 12.]],
[[13., 14.],
[15., 16.]]])
인수값으로서의 -1은 y, z 또는 그 반대방향의 값을 알고 있는 경우 say x의 값을 계산하는 쉬운 방법이고, y의 값을 알고 있는 경우 say x의 값을 계산하는 또 다른 방법은 y의 경우 y의 값을 알고 있는 경우 say x의 값을 계산하는 쉬운 방법입니다.
파라미터 -1의 의미는 무엇입니까?
수 .-1
동적 매개변수 수 또는 "임의"로 지정합니다.입니다.-1
view()
.
★★★★★★★라고 하면x.view(-1,1)
텐서 됩니다.[anything, 1]
의 .x
§:
import torch
x = torch.tensor([1, 2, 3, 4])
print(x,x.shape)
print("...")
print(x.view(-1,1), x.view(-1,1).shape)
print(x.view(1,-1), x.view(1,-1).shape)
유언 출력:
tensor([1, 2, 3, 4]) torch.Size([4])
...
tensor([[1],
[2],
[3],
[4]]) torch.Size([4, 1])
tensor([[1, 2, 3, 4]]) torch.Size([1, 4])
weights.reshape(a, b)
는 데이터를 메모리의 다른 부분에 복사하는 것과 같은 크기(a, b)의 가중치와 동일한 데이터를 가진 새 텐서를 반환합니다.
weights.resize_(a, b)
하다그러나 새로운 형상이 원래 텐서보다 적은 수의 요소를 초래하는 경우, 일부 요소는 텐서에서 제거됩니다(메모리에서는 제거되지 않음).새로운 셰이프가 원래 텐서보다 더 많은 요소를 가져오면, 새로운 요소는 메모리에서 초기화되지 않습니다.
weights.view(a, b)
인 (a, b)인 무게와 새 를 반환합니다.
나는 @Jadiel de Armas의 예를 매우 좋아했다.
.view(...)의 요소 오더 방법에 대한 작은 통찰력을 추가하고 싶습니다.
- 형상(a, b, c)이 있는 텐서의 경우 텐서 요소의 순서는 번호 체계에 의해 결정됩니다.첫 번째 자리에는 숫자가, 두 번째 자리에는 b 번호가, 세 번째 자리에는 c 번호가 있습니다.
- .view(...)에 의해 반환된 새 텐서의 요소 매핑은 원래 텐서의 이 순서를 유지합니다.
언급URL : https://stackoverflow.com/questions/42479902/what-does-view-do-in-pytorch
'programing' 카테고리의 다른 글
JPA/Hibernate에서의 flash()의 올바른 사용 (0) | 2022.09.29 |
---|---|
Json Array를 일반 Java 목록으로 변환 (0) | 2022.09.29 |
HTML "no-js" 클래스의 목적은 무엇입니까? (0) | 2022.09.25 |
배열 목록을 알파벳 순으로 정렬(대문자와 소문자를 구분하지 않음) (0) | 2022.09.25 |
JavaScript:파일 업로드 (0) | 2022.09.25 |