파이토치에서 튜플/텐서 목록을 단일 텐서로 처리하기
torch.cat() 사용:
torch.cat()
함수는 여러 텐서를 하나의 텐서로 결합하는 데 사용됩니다. 튜플 또는 텐서 목록을 입력으로 받아 하나의 텐서로 반환합니다.
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(4, 5)]
# `torch.cat()` 사용하여 단일 텐서로 결합
combined_tensor = torch.cat(tensors)
# 결과 출력
print(combined_tensor)
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(3, 5)]
# `torch.stack()` 사용하여 단일 텐서로 결합
combined_tensor = torch.stack(tensors)
# 결과 출력
print(combined_tensor)
루프 사용:
간단한 경우 루프를 사용하여 튜플 또는 텐서 목록을 단일 텐서로 결합할 수 있습니다.
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(4, 5)]
# 루프 사용하여 단일 텐서로 결합
combined_tensor = torch.empty((7, 9))
for i, tensor in enumerate(tensors):
combined_tensor[i * tensor.shape[0]:(i + 1) * tensor.shape[0], :] = tensor
# 결과 출력
print(combined_tensor)
사용자 정의 함수:
특정 요구 사항에 맞게 튜플 또는 텐서 목록을 단일 텐서로 결합하는 사용자 정의 함수를 만들 수 있습니다.
주의 사항:
- 텐서 목록을 결합하기 전에 모든 텐서가 동일한 크기와 차원을 가지고 있는지 확인해야 합니다.
torch.cat()
및torch.stack()
함수는 텐서의 차원을 변경할 수 있습니다.
예제 코드
import torch
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(4, 5)]
# `torch.cat()` 사용하여 단일 텐서로 결합
combined_tensor = torch.cat(tensors)
# 결과 출력
print(combined_tensor)
결과:
tensor([[ 0.0845, -0.0431, 0.2234, 0.1423],
[-0.1221, -0.0034, 0.1456, 0.0532],
[ 0.0213, 0.0423, -0.0245, 0.1345],
[ 0.0643, -0.0234, 0.0987, 0.2312],
[ 0.0876, 0.0321, -0.0324, -0.0432],
[ 0.1342, 0.2213, 0.0212, -0.0231],
[ 0.0422, 0.0343, 0.0987, 0.1232]])
import torch
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(3, 5)]
# `torch.stack()` 사용하여 단일 텐서로 결합
combined_tensor = torch.stack(tensors)
# 결과 출력
print(combined_tensor)
tensor([[[ 0.0845, -0.0431, 0.2234, 0.1423],
[-0.1221, -0.0034, 0.1456, 0.0532],
[ 0.0213, 0.0423, -0.0245, 0.1345]],
[[ 0.0643, -0.0234, 0.0987, 0.2312],
[ 0.0876, 0.0321, -0.0324, -0.0432],
[ 0.1342, 0.2213, 0.0212, -0.0231]]])
import torch
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(4, 5)]
# 루프 사용하여 단일 텐서로 결합
combined_tensor = torch.empty((7, 9))
for i, tensor in enumerate(tensors):
combined_tensor[i * tensor.shape[0]:(i + 1) * tensor.shape[0], :] = tensor
# 결과 출력
print(combined_tensor)
tensor([[ 0.0845, -0.0431, 0.2234, 0.1423, 0.0643, -0.0234, 0.0987,
0.2312],
[-0.1221, -0.0034, 0.1456, 0.0532, 0.0876, 0.0321, -0.0324,
-0.0432],
[ 0.0213, 0.0423, -0.0245, 0.1345, 0.1342, 0.2213, 0.0212,
-0.0231],
튜플/텐서 목록을 단일 텐서로 처리하는 대체 방법
torch.nn.utils.rnn.pad_sequence() 사용:
torch.nn.utils.rnn.pad_sequence()
함수는 RNN 입력 데이터를 패딩하는 데 사용됩니다. 텐서 목록을 입력으로 받아 길이가 가장 긴 텐서에 맞춰 다른 텐서를 패딩하고, 패딩된 텐서를 하나의 배치로 결합합니다.
import torch
from torch.nn.utils.rnn import pad_sequence
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(2, 5)]
# `pad_sequence` 사용하여 단일 텐서로 결합
combined_tensor = pad_sequence(tensors, batch_first=True)
# 결과 출력
print(combined_tensor)
tensor([[[ 0.0845, -0.0431, 0.2234, 0.1423],
[-0.1221, -0.0034, 0.1456, 0.0532],
[ 0.0213, 0.0423, -0.0245, 0.1345]],
[[ 0.0643, -0.0234, 0.0987, 0.2312],
[ 0.0876, 0.0321, -0.0324, -0.0432],
[ 0.0000, 0.0000, 0.0000, 0.0000]]])
예시:
def combine_tensors(tensors):
"""
텐서 목록을 단일 텐서로 결합하는 함수
Args:
tensors: 텐서 목록
Returns:
결합된 텐서
"""
combined_tensor = torch.empty((sum(t.shape[0] for t in tensors), max(t.shape[1] for t in tensors)))
for i, tensor in enumerate(tensors):
combined_tensor[i * tensor.shape[0]:(i + 1) * tensor.shape[0], :tensor.shape[1]] = tensor
return combined_tensor
# 텐서 목록 생성
tensors = [torch.randn(3, 4), torch.randn(2, 5)]
# 사용자 정의 함수 사용하여 단일 텐서로 결합
combined_tensor = combine_tensors(tensors)
# 결과 출력
print(combined_tensor)
tensor([[ 0.0845, -0.0431, 0.2234, 0.1423],
[-0.1221, -0.0034, 0.1456, 0.0532],
[ 0.0213, 0.0423, -0.0245, 0.1345],
[ 0.0643, -0.0234, 0.0987, 0.2312],
[ 0.0876, 0.0321, -0.0324, -0.0432]])
pytorch