앞의 포스팅에 이어 텐서를 조작하는 방법을 알아보겠습니다!
포스팅은 밑의 출처에서 보고 공부한 것을 정리하였습니다.
4) 뷰(View)
- 파이토치에서 텐서의 뷰는 Numpy에서의 reshape 같은 역할을 합니다.
- 텐서에서 원소의 수를 유지하면서 텐서의 크기를 변경합니다.
t = np.array([[[0, 1, 2],
[3, 4, 5]],
[[6, 7, 8],
[9, 10, 11]]])
ft = torch.FloatTensor(t)
print(ft.shape)
4 - 1) 3차원 텐서에서 2차원으로 변경
print(ft.shape)
print(ft.view([-1, 3]))
print(ft.view([-1, 3]).shape)
출력)
- view([-1, 3])에서 -1이 가지는 의미 : 첫 번째 차원은 사용자가 설정하지 않으니 파이토치에 맡기겠다는 의미
- view([-1, 3])에서 3이 가지는 의미 : 두 번째 차원의 길이는 3으로 하라는 의미
- 결국 내부적으로 (2, 2, 3)의 형태에서 (?, 3)의 형태로 되는데 view는 원소의 개수는 유지하면서 텐서의 크기를 변경 함으로 2x2x3 = 12 이며 ? x 3 = 12가 되려면 ? 이 4가 되어야 하므로 ([4, 3])의 형태가 된 것을 볼 수 있습니다.
- view에서 -1로 설정되면서 파이토치에게 맡기겠다는 의미가 다른 차원으로부터 값을 유추하는 것입니다.
4 - 2) 3차원 텐서의 크기 변경
- 3차원 텐서에서 3차원 텐서로 바꾸는 것은 차원을 유지하면서 shape를 바꾸는 작업입니다.
- 예를 들면 ( 2 x 2 x 3 ) = 12 에서 ( ? x 1 x 3 ) = 12가 되기 위해 ? = 4 인 것을 예상할 수 있습니다.
print(ft.view([-1, 1, 3]))
print(ft.view([-1, 1, 3]).shape)
출력)
5) 스퀴즈(Squeeze)
- 스퀴즈는 차원이 1인 것을 제거하는 함수입니다.
ft = torch.FloatTensor([[0], [1], [2]])
print(ft)
print(ft.shape)
출력)
- ( 3 x 1 ) 텐서를 만들었고 스퀴즈를 적용하여 ( 3, )의 1차원 텐서로 변경해보겠습니다
print(ft.squeeze())
print(ft.squeeze().shape)
출력)
- 1차원 벡터로 변경된 것을 볼 수 있습니다.
6) 언스퀴즈(Unsqueeze)
- 언스퀴즈는 스퀴즈와 반대로 특정 위치에 1인 차원을 추가하는 것입니다.
ft = torch.Tensor([0, 1, 2])
print(ft.shape)
출력)
print(ft.unsqueeze(0))
print(ft.unsqueeze(0).shape)
출력)
- 차원을 바꿀 때 view를 사용하여도 언스퀴즈와 동일한 결과를 나오는 것을 확인할 수 있습니다.
- view로 차원을 추가하면서 첫 번째 차원이 1이길 원한다면 view에서 (1, -1)을 사용하여 바꿉니다.
print(ft.view(1, -1))
print(ft.view(1, -1).shape)
출력)
결론 : view(), squeeze(), unsqueeze()는 텐서의 원소 수를 유지하면서 텐서의 모양과 차원을 조절한다.
pytorch로 텐서를 조작하는 것을 알아보았고
다음 포스팅에는 텐서 조작을 마지막으로 포스팅하겠습니다
틀린 점이나 질문이 있으시면 댓글로 남겨주세요
감사합니다 :)
'AI > Pytorch' 카테고리의 다른 글
[Pytorch] Transform(변형) (0) | 2021.07.27 |
---|---|
[Pytorch] Dataset과 Dataloader (0) | 2021.07.26 |
[Pytorch] 텐서(Tensor) 조작 기초(3) (0) | 2021.07.22 |
[Pytorch] 텐서(Tensor) 조작 기초(1) (0) | 2021.06.28 |