코딩걸음마
[딥러닝] Pytorch 차원다루기(Shaping/squeeze) 본문
1. Tensor shape 파악하기 (.shape / .size() )
Tensor를 눈으로 보고 바로 몇차원이며 몇개의 원소가 들어가 있는지 한번에 파악하기에는 현실적으로 너무 어렵다.
하지만, 한번에 파악할 수 있는 방법이 다행히(?) 있다.
x = torch.FloatTensor([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]],
[[9, 10],
[11, 12]]])
print(x.shape)
print(x.size())
torch.Size([3, 2, 2])
torch.Size([3, 2, 2])
.shape
.size()
를 입력하면 torch.Size([ 3 ,2 , 2])라고 나오는데 이를 도식화 하면 다음과 같다
1-2. Tensor shape 변경하기 (reshape)
한번 정해진 shape가 계속 유지되는 경우는 드물다. 때에 따라 목적에 맞게 조정해줄 필요가 있는데
이때 사용되는 방법이 .reshape()이다.
reshape를 사용하기 전에 무조건 .shape 나 .size()를 사용해서, tensor size를 파악하고 있어야 한다.
tensor의 구조를 잘보면 data가 몇개 있는지 파악할수 있는데 ,
예를들어, tensor의 size가 torch.Size([ 3 ,2 , 2]) 라면 data가 3 * 2 * 2개
즉, 12개가 존재하는 것이다.
이를 만약 1차원으로 바꾼다면, 12개를 한 줄로 세우는 방법
2차원으로 바꾼다면 (1,12) (2,6) (3,4) (4,3) (6,2),(12,1) 등 여러 방법이 있다.
(3차원은 많으니 생략..)
(3,5)로는 만들수 없는건가?
만들수 없다. 3*5 은 15개의 공간을 사용하는데 존재하는 데이터는 12개 뿐이기 때문이다.
다음의 예시로 충분히 익혀보자
print(x.reshape(12)) # 12 = 3 * 2 * 2
print(x.reshape(-1)) #알아서 해줘..
print(x.reshape(2,6)) # 12 = 2 * 6
print(x.reshape(3,-1)) #알아서 해줘.
print(x.reshape(3,1,4)) # 12 = 3 * 1 * 4
print(x.reshape(3,2,-1)) # 12 = 3 * 2 * 2
tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.])
tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.])
tensor([[ 1., 2., 3., 4., 5., 6.],
[ 7., 8., 9., 10., 11., 12.]])
tensor([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]])
tensor([[[ 1., 2., 3., 4.]],
[[ 5., 6., 7., 8.]],
[[ 9., 10., 11., 12.]]])
tensor([[[ 1., 2.],
[ 3., 4.]],
[[ 5., 6.],
[ 7., 8.]],
[[ 9., 10.],
[11., 12.]]])
2. 차원 축소 (squeeze)
squeeze 메소드는 차원 내 원소가 1개인 차원을 축소하는 기능을 가졌습니다.
차원을 축소? 한다는 개념이 생소할수 있는데 차근차근 따라와보자.
x = torch.FloatTensor([[[1, 2],
[3, 4],
[5 ,6]]])
print(x.size())
torch.Size([1, 3, 2])
torch.size()로 형태를 확인해보니 위와 같은 형태의 tensor로 파악되었다.
그럼 차원을 줄여보자
print(x.squeeze())
print(x.squeeze().size())
tensor([[1., 2.],
[3., 4.],
[5., 6.]])
torch.Size([3, 2])
원소가 1개였던 1차원이 사라지고, 그 자리에 2차원 원소가 들어오고, 2차원에는 3차원 원소가 들어왔다.
아래의 예시를 추가로 보자
x = torch.FloatTensor([[[1],[2]],
[[3],[4]]]
)
print(x.size())
torch.Size([2, 2, 1])
이 tensor를 축소해보자
print(x.squeeze())
print(x.squeeze().size())
엥 변한게 없나? 하지만 변한게 있다.
tensor([[1., 2.],
[3., 4.]])
torch.Size([2, 2])
우선 Size가 [2 ,2, 1] 에서 [2, 2]로 바뀌었다.
tensor([[[1., 2.],
[3., 4.]]])
tensor([[1., 2.],
[3., 4.]])
[ ] 가 한단계 낮아진것도 확인할 수 있다.
2 - 1. 차원 추가 (unsqueeze)
unsqueeze 메소드는 지정한 차원을 추가해주는 기능을 가졌습니다.
x = torch.FloatTensor([[1, 2],
[3, 4]])
print(x.size())
(2, 2) 차원을 하나 만들었습니다.
그럼 3차원을 추가해봅시다.
print(x.unsqueeze(2))
unsqueeze(index) index를 넣어주면 해당 인덱스의 차원을 추가해줍니다.
x.unsqueeze(2)는 3차원을 추가한다는 의미입니다.
x.unsqueeze(-1)는 마지막 차원 이 데이터에서는 3차원을 추가한다는 의미입니다.
tensor([[[1.],
[2.]],
[[3.],
[4.]]])
shape를 보면 3차원이 추가된 것을 확인할 수 있습니다.
print(x.unsqueeze(2).shape)
torch.Size([2, 2, 1])
'딥러닝_Pytorch' 카테고리의 다른 글
[딥러닝] Pytorch 주요함수 expand/randperm/argmax/topk/masked_fill/Ones , Zeros (0) | 2022.06.24 |
---|---|
[딥러닝] Pytorch 슬라이싱/합치기(concat),stack/split,chunk/ index_select (0) | 2022.06.23 |
[딥러닝] Pytorch 기초연산 (0) | 2022.06.23 |
[딥러닝] Pytorch의 기초 (0) | 2022.06.23 |
[딥러닝] pytorch 설치하기 (0) | 2022.06.23 |