텐서의 크기 변경 - view(), reshape(), flatten()
view(size)
- 텐서의 크기를 변경하며, 텐서가 메모리에 연속적으로 할당된 경우에 사용이 가능
- is_contiguous(): 텐서의 메모리가 연속적으로 할당되었는지 확인
- contiguous():
contiguous
여부를 True
로 변경
-> is_contiguous()
결과가 True
인 경우에만 view()
사용 가능
a = torch.tensor([[1, 2, 3],
[4, 5, 6]])
print(a.is_contiguous())
a = a.view(1, -1)
print(a)
b = torch.tensor([[1, 2, 3],
[4, 5, 6]])
b = b[:, :2]
print(b.is_contiguous())
b = b.contiguous()
b = b.view(1, -1)
print(b)
reshape(size)
- 텐서의 크기를 변경하며,
view()
와 달리 메모리가 연속적이지 않아도 사용 가능
- 안전하고 유연하나, 성능 저하의 단점이 있음
-> 메모리의 연속성이 확실하고, 성능이 중요하면 view()
사용할 것
x = torch.randn(4, 4)
y = x.reshape(2, 8)
print(y.shape)
flatten(size)
- 텐서를 1차원 텐서로 평탄화
- 다차원 데이터를 신경망 모델에 적합한 형태로 전처리할 때 활용
x = torch.randn(3, 2, 2)
y = x.flatten()
print(y.shape)
텐서의 차원 변경 - transpose(), permute()
transpose(size)
x = torch.randn(2, 3)
y = x.transpose(0, 1)
print(y.shape)
permute(size)
transpose()
의 일반화된 버전
- 여러 축의 순서를 한 번에 변경
x = torch.randn(2, 3, 4)
y = x.permute(2, 0, 1)
print(y.shape)
텐서의 차원 추가/제거 - unsqueeze(), squeeeze()
unsqueeze(dim)
x = torch.randn(3, 2)
y = x.unsqueeze(0)
print(y.shape)
squeeze(dim)
x = torch.randn(1, 3, 2)
y = x.squeeze(0)
print(y.shape)
텐서 합치기 - stack(), cat()
stack(tensors, dim)
a = torch.tensor([[0, 1],
[1, 0]])
b = torch.tensor([[2, 3],
[3, 2]])
c = torch.tensor([[4, 5],
[5, 4]])
d = torch.stack((a, b, c), dim=0)
print(d)
print(d.shape)
tensor([[[0, 1],
[1, 0]],
[[2, 3],
[3, 2]],
[[4, 5],
[5, 4]]])
torch.Size([3, 2, 2])
cat(tensors, dim)
- dim 차원을 따라 텐서들을 연결
stack()
과 달리 새로운 차원을 추가하지 않고 기존 차원을 유지
a = torch.tensor([[0, 1],
[2, 3]])
b = torch.tensor([[4, 5]])
c = torch.cat((a, b))
print(c)
print(c.shape)
tensor([[0, 1],
[2, 3],
[4, 5]])
torch.Size([3, 2])
텐서 확장 - expand(), repeat()
expand(size)
- 텐서의 특정 차원의 크기가 1일 때, 해당 차원의 크기를 확장
x = torch.randn(3, 1)
y = x.expand(3, 4)
print(y.shape)
repeat(size)
- 텐서를 특정 차원에 대해 반복
expand()
와 달리 차원 중 일부의 크기가 1이어야 하는 제약 없음
- 그러나 추가 메모리를 할당하므로 그렇지 않은
expand()
보다 메모리 효율이 떨어짐
x = torch.tensor([[1, 2], [3, 4]])
y = x.repeat(2, 1)
print(y)
Outro
더 읽어볼 것