파이토치 텐서에 새로운 차원을 추가하는 방법
파이토치 텐서에 새로운 차원을 추가하는 방법
view() 함수 사용:
view()
함수는 텐서의 크기와 모양을 변경하는 데 사용됩니다. 새로운 차원을 추가하려면 원하는 차원의 크기를 지정하면 됩니다. 예를 들어, 2차원 텐서에 새로운 차원을 추가하여 3차원 텐서로 만들려면 다음과 같이 하면 됩니다.
import torch
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# 새로운 차원 추가 (3차원 텐서로 변환)
new_tensor = tensor.view(2, 3, 1)
print(new_tensor.shape)
# 출력: torch.Size([2, 3, 1])
unsqueeze() 함수 사용:
unsqueeze()
함수는 텐서에 새로운 차원을 추가하는 데 사용됩니다. 원하는 차원 위치를 지정하면 해당 위치에 새로운 차원이 추가됩니다. 예를 들어, 2차원 텐서에 첫 번째 차원에 새로운 차원을 추가하려면 다음과 같이 하면 됩니다.
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# 첫 번째 차원에 새로운 차원 추가
new_tensor = tensor.unsqueeze(0)
print(new_tensor.shape)
# 출력: torch.Size([1, 2, 3])
expand() 함수 사용:
expand()
함수는 텐서를 반복하여 새로운 차원을 추가하는 데 사용됩니다. 원하는 차원의 크기를 지정하면 해당 차원에 따라 텐서를 반복합니다. 예를 들어, 2차원 텐서를 3차원 텐서로 만들려면 다음과 같이 하면 됩니다.
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# 3차원 텐서로 변환
new_tensor = tensor.expand(2, 3, 1)
print(new_tensor.shape)
# 출력: torch.Size([2, 3, 1])
cat() 함수 사용:
cat()
함수는 여러 텐서를 연결하여 새로운 차원을 추가하는 데 사용됩니다. 원하는 차원을 따라 텐서를 연결하면 됩니다. 예를 들어, 2개의 1차원 텐서를 연결하여 2차원 텐서를 만들려면 다음과 같이 하면 됩니다.
# 1차원 텐서 생성
tensor1 = torch.randn(3)
tensor2 = torch.randn(3)
# 2차원 텐서로 변환
new_tensor = torch.cat((tensor1, tensor2), dim=0)
print(new_tensor.shape)
# 출력: torch.Size([6])
위의 방법 중 상황에 맞는 방법을 선택하여 파이토치 텐서에 새로운 차원을 추가할 수 있습니다.
참고:
view()
함수는 텐서의 크기와 모양만 변경하며, 텐서의 값은 변경하지 않습니다.unsqueeze()
함수와expand()
함수는 텐서의 값을 복제하여 새로운 차원을 추가합니다.cat()
함수는 여러 텐서를 연결하여 새로운 차원을 추가합니다.
예제 코드
import torch
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# **1. view() 함수 사용**
# 새로운 차원 추가 (3차원 텐서로 변환)
new_tensor1 = tensor.view(2, 3, 1)
print(new_tensor1)
# 출력:
# tensor([[[ 0.0902, 0.0157, -0.0244],
# [ 0.0441, 0.0573, -0.0284],
# [ 0.0034, -0.0445, 0.0401]],
# [[ 0.0342, 0.0802, -0.0613],
# [ 0.1284, 0.0449, 0.1101],
# [-0.0082, 0.0231, 0.0508]]])
# **2. unsqueeze() 함수 사용**
# 첫 번째 차원에 새로운 차원 추가
new_tensor2 = tensor.unsqueeze(0)
print(new_tensor2)
# 출력:
# tensor([[[ 0.0902, 0.0157, -0.0244],
# [ 0.0441, 0.0573, -0.0284],
# [ 0.0034, -0.0445, 0.0401]],
# [[ 0.0342, 0.0802, -0.0613],
# [ 0.1284, 0.0449, 0.1101],
# [-0.0082, 0.0231, 0.0508]]])
# 두 번째 차원에 새로운 차원 추가
new_tensor3 = tensor.unsqueeze(1)
print(new_tensor3)
# 출력:
# tensor([[[ 0.0902],
# [ 0.0441],
# [ 0.0034]],
# [[ 0.0342],
# [ 0.1284],
# [-0.0082]]])
# **3. expand() 함수 사용**
# 3차원 텐서로 변환
new_tensor4 = tensor.expand(2, 3, 1)
print(new_tensor4)
# 출력:
# tensor([[[ 0.0902, 0.0157, -0.0244],
# [ 0.0441, 0.0573, -0.0284],
# [ 0.0034, -0.0445, 0.0401]],
# [[ 0.0902, 0.0157, -0.0244],
# [ 0.0441, 0.0573, -0.0284],
# [ 0.0034, -0.0445, 0.0401]]])
# **4. cat() 함수 사용**
# 1차원 텐서 생성
tensor5 = torch.randn(3)
tensor6 = torch.randn(3)
# 2차원 텐서로 변환
new_tensor5 = torch.cat((tensor5, tensor6), dim=0)
print(new_tensor5)
# 출력:
# tensor([ 0.0902, 0.0157, -0.0244, 0.0441, 0.0573, -0.0284, 0.0034,
# -0.0445, 0.0401])
파이토치 텐서에 새로운 차원을 추가하는 대체 방법
torch.nn.functional.pad() 함수 사용:
torch.nn.functional.pad()
함수는 텐서 주변에 패딩을 추가하는 데 사용할 수 있습니다. 패딩을 추가하는 방식으로 새로운 차원을 추가할 수 있습니다. 예를 들어, 2차원 텐서에 첫 번째 차원에 새로운 차원을 추가하려면 다음과 같이 하면 됩니다.
import torch
import torch.nn.functional as F
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# 첫 번째 차원에 새로운 차원 추가
new_tensor = F.pad(tensor, (1, 0))
print(new_tensor.shape)
# 출력: torch.Size([3, 2])
numpy.expand_dims() 함수 사용:
파이토치 텐서는 NumPy 배열로 변환할 수 있으며, NumPy 배열에는 expand_dims()
함수가 있습니다. expand_dims()
함수를 사용하여 새로운 차원을 추가할 수 있습니다. 예를 들어, 2차원 텐서에 첫 번째 차원에 새로운 차원을 추가하려면 다음과 같이 하면 됩니다.
import torch
import numpy as np
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# NumPy 배열로 변환
np_tensor = tensor.numpy()
# 첫 번째 차원에 새로운 차원 추가
new_tensor = np.expand_dims(np_tensor, axis=0)
# 다시 PyTorch 텐서로 변환
new_tensor = torch.from_numpy(new_tensor)
print(new_tensor.shape)
# 출력: torch.Size([3, 2])
직접 구현:
직접 for 루프를 사용하여 새로운 차원을 추가할 수도 있습니다. 예를 들어, 2차원 텐서에 첫 번째 차원에 새로운 차원을 추가하려면 다음과 같이 하면 됩니다.
import torch
# 2차원 텐서 생성
tensor = torch.randn(2, 3)
# 새로운 차원을 위한 리스트 생성
new_list = []
for i in range(tensor.shape[0]):
new_list.append([tensor[i, :]])
# 새로운 텐서 생성
new_tensor = torch.cat(new_list, dim=0)
print(new_tensor.shape)
# 출력: torch.Size([3, 2])
python pytorch