PyTorch에서 특정 새 차원에서 텐서를 반복하는 방법
PyTorch에서 특정 새 차원에서 텐서를 반복하는 방법
repeat 함수 사용
torch.repeat
함수는 텐서를 지정된 횟수만큼 반복하는 가장 간단한 방법입니다. 예를 들어 다음 코드는 텐서 x
를 새 차원 dim
에서 3번 반복합니다.
import torch
x = torch.tensor([1, 2, 3])
# 새 차원 `dim`에서 텐서 `x`를 3번 반복
y = x.repeat(1, 3, 1)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
repeat
함수는 사용하기 간단하지만 새 차원을 맨 앞에 추가한다는 단점이 있습니다. 만약 새 차원을 맨 끝에 추가하고 싶다면 다음과 같이 unsqueeze
함수를 사용해야 합니다.
y = x.unsqueeze(dim).repeat(1, 1, 3)
view 함수 사용
torch.view
함수는 텐서의 크기와 형태를 변경하는 데 사용할 수 있습니다. 새 차원을 추가하려면 다음과 같이 -1
을 사용할 수 있습니다.
y = x.view(1, -1, 3)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
view
함수는 repeat
함수보다 더 유연하지만 사용하기 조금 더 복잡합니다. 특히 텐서의 크기가 크거나 복잡한 형태를 가지고 있는 경우에는 더욱 그렇습니다.
루프 사용
루프를 사용하여 텐서를 반복하는 방법도 있습니다. 이 방법은 가장 느리지만 가장 유연한 방법입니다.
y = torch.empty(1, 3, x.size(0))
for i in range(x.size(0)):
y[0, :, i] = x[i]
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
방법 비교
방법 | 장점 | 단점 |
---|---|---|
repeat 함수 | 간단 | 새 차원을 맨 앞에 추가 |
view 함수 | 유연 | 사용하기 조금 더 복잡 |
루프 사용 | 가장 유연 | 가장 느림 |
결론
PyTorch에서 텐서를 특정 새 차원에서 반복하는 방법은 여러 가지가 있습니다. 가장 적합한 방법은 특정 상황에 따라 다릅니다. 간단하고 빠른 방법을 찾고 있다면 repeat
함수를 사용하는 것이 좋습니다. 더 유연한 방법을 찾고 있다면 view
함수 또는 루프를 사용하는 것이 좋습니다.
예제 코드
repeat
함수 사용
import torch
x = torch.tensor([1, 2, 3])
# 새 차원 `dim`에서 텐서 `x`를 3번 반복
y = x.repeat(1, 3, 1)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
view
함수 사용
y = x.view(1, -1, 3)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
루프 사용
y = torch.empty(1, 3, x.size(0))
for i in range(x.size(0)):
y[0, :, i] = x[i]
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
추가 예제
- 텐서
x
를 새 차원dim
에서 2번 반복하고 새 차원dim2
에서 3번 반복하려면 다음과 같이repeat
함수를 사용할 수 있습니다.
y = x.repeat(1, 2, 3, 1)
- 텐서
x
를 2x3 배열로 변환하려면 다음과 같이view
함수를 사용할 수 있습니다.
y = x.view(2, 3)
- 텐서
x
를 3x3 배열로 변환하고 각 행에 1을 추가하려면 다음과 같이 루프를 사용할 수 있습니다.
y = torch.empty(3, 3)
for i in range(3):
y[i, :] = x
y[i, 0] = 1
print(y)
# 출력: tensor([[1, 1, 2, 3],
# [1, 1, 2, 3],
# [1, 1, 2, 3]])
PyTorch에서 텐서를 특정 새 차원에서 반복하는 대체 방법
torch.expand 함수 사용
import torch
x = torch.tensor([1, 2, 3])
# 새 차원 `dim`에서 텐서 `x`를 3번 반복
y = x.expand(1, 3, -1)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
expand
함수는 repeat
함수와 비슷하지만 텐서의 크기를 변경하지 않는다는 점에서 차이가 있습니다. 즉, expand
함수를 사용하면 원본 텐서의 메모리가 공유됩니다.
torch.stack 함수 사용
y = torch.stack([x, x, x], dim=0)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
stack
함수는 텐서를 복사하므로 원본 텐서의 메모리가 공유되지 않습니다.
NumPy 사용
NumPy를 사용하여 PyTorch 텐서를 조작할 수도 있습니다. NumPy 배열을 새 차원으로 확장하려면 다음과 같이 repeat
함수 또는 reshape
함수를 사용할 수 있습니다.
import numpy as np
x = torch.tensor([1, 2, 3])
# NumPy 배열로 변환
x_numpy = x.numpy()
# 새 차원 `dim`에서 NumPy 배열 `x_numpy`를 3번 반복
y_numpy = np.repeat(x_numpy, 3, axis=dim)
# NumPy 배열을 PyTorch 텐서로 변환
y = torch.from_numpy(y_numpy)
print(y)
# 출력: tensor([[1, 2, 3],
# [1, 2, 3],
# [1, 2, 3]])
NumPy를 사용하면 PyTorch에서 제공하지 않는 다양한 기능을 활용할 수 있습니다.
결론
참고 자료
pytorch repeat