[PyTorch] Tensor 차원, 크기 다루기

A = torch.ones(2, 3, 4)
A
>>> tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])

  • Tensor의 차원을 반환
    - dim()
    - ndim
print(A.dim())
print(A.ndim)
>>> 3
3

  • Tensor의 크기를 반환
    - shape
    - size()
print(A.shape)
print(A.shape[1])

print(A.size())
print(A.size(2))

>>> torch.Size([2, 3, 4])
3
torch.Size([2, 3, 4])
4

  • Tensor 사이즈를 변경
    - view()
    - reshape()
# 원소의 개수는 유지한 채 사이즈를 바꾼다.

A.reshape(8,3)
>>> tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
        
A.view(3, -1)
>>> tensor([[1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1.]])

A.view(-1, 4)
>>> tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

  • 크기가 1인 차원을 제거
    - squeeze()
B = torch.FloatTensor([[0], [1], [2]])
print(B)
print(B.shape)
>>> tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])

print(B.squeeze())
print(B.squeeze().shape)
>>> tensor([0., 1., 2.])
torch.Size([3])

  • 크기가 1인 차원을 추가
    - unsqueeze()
C = torch.Tensor([0, 1, 2])
print(C.shape)
>>> torch.Size([3])

C.unsqueeze(0).shape # 0번쨰 차원에 추가
>>> torch.Size([1, 3])

print(B.view(1, -1)) # view(1, -1)로 같은 기능 구현
print(B.view(1, -1).shape)
>>>tensor([[0., 1., 2.]])
torch.Size([1, 3])

  • 차원 바꾸기
    - transpose(): 두 개의 차원은 맞교환
    - permute(): 모든 차원을 맞교환
x = torch.rand(16, 32, 3)
y = x.tranpose(0, 2)  # [3, 32, 16]
z = x.permute(2, 1, 0)  # [3, 32, 16]
반응형