[Pytorch] view, reshape, permute 함수 : 차원 재구성
본문 바로가기
AI 구현/Pytorch

[Pytorch] view, reshape, permute 함수 : 차원 재구성

by NEWSUN* 2024. 9. 8.

텐서의 크기를 바꾸는 view, reshape 함수와 차원 순서를 바꾸는  reshape 함수에 대해 알아봅시다.

 

view 함수

view는 텐서의 크기를 바꾸는 함수로, 기존의 데이터와 같은 메모리 공간을 공유하고 contigious 할 때 사용 가능합니다. (아닌 경우 에러 발생) 

 

import torch

x = torch.randn(4,4)
y = x.view(2,2,4)
z = x.view(-1,8)
print(x.size())
print(y.size())
print(z.size())

"""
[출력]
torch.Size([4, 4])
torch.Size([2, 2, 4])
torch.Size([2, 8])
"""

 

reshape 함수

reshape는 view 처럼 텐서의 크기를 바꿔주는 함수입니다. 약간의 다른점이 있다면, reshape는 가능한 경우 input의 view를 반환하고, 불가능한 경우 contigious한 메모리로 copy한 뒤 view를 반환합니다.

 

import torch

# 본 예제에서 view나 reshape나 결과가 동일함

x = torch.randn(4,4)
y = x.reshape(2,2,4)
z = x.reshape(-1,8)
print(x.size())
print(y.size())
print(z.size())

"""
[출력]
torch.Size([4, 4])
torch.Size([2, 2, 4])
torch.Size([2, 8])
"""

 

 

* view와 reshape 비교

view는 기존 텐서와 메모리를 공유하는 게 보장되며 크기만 변경합니다. 이러한 이유로, 원본 텐서의 값이 업데이트되면 view 함수로 만들어진 텐서 값도 함께 변경됩니다. reshape은 가능한 경우 view 처럼 메모리를 공유하지만 그렇지 않은 경우에 새로운 메모리 공간을 할당하여 데이터를 복사합니다. 따라서, 결과는 비슷할지라도 view가 아닌 reshape을 사용하면 메모리가 항상 공유된다고 보장할 수 없습니다. 메모리 주소는 (텐서 이름).storage().data_ptr()에서 확인할 수 있습니다.

 

permute 함수

permute는 딥러닝 연산에 따라 차원 간의 순서를 바꿔줄 때 쓰는 함수입니다.

 

import torch

x = torch.randn(2,3,5)
y = x.permute(2,0,1)
print(x.size())
print(y.size())

"""
[출력]
torch.Size([2, 3, 5])
torch.Size([5, 2, 3])
"""

 

Reference

[1] “torch.view — PyTorch 2.4 documentation,” Pytorch.org, 2023. https://pytorch.org/docs/stable/generated/torch.view.html (accessed Sep. 06, 2024).  

[2] “torch.reshape — PyTorch 2.4 documentation,” Pytorch.org, 2023. https://pytorch.org/docs/stable/generated/torch.reshape.html (accessed Sep. 06, 2024).

‌[3] “torch.permute — PyTorch 2.4 documentation,” Pytorch.org, 2023. https://pytorch.org/docs/stable/generated/torch.permute.html (accessed Sep. 06, 2024).

[4] “수비니움의 코딩일지,” Subinium의 코딩일지, May 26, 2020. https://subinium.github.io/pytorch-Tensor-Variable/ (accessed Sep. 08, 2024).