코딩걸음마

[딥러닝] Pytorch 차원다루기(Shaping/squeeze) 본문

딥러닝_Pytorch

[딥러닝] Pytorch 차원다루기(Shaping/squeeze)

코딩걸음마 2022. 6. 23. 20:33
728x90

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])
728x90
Comments