유원준 님의 위키독스에 정리된 PyTorch로 시작하는 딥 러닝 입문의 챕터 2 '파이토치 기초'를 읽고 내용을 정리해본다.
(출처: https://wikidocs.net/52846)
딥러닝은 기본적으로 텐서연산으로 이루어진다.
차원이 없는 값 - scalar,
1d로 구성된 값 - vector
2d로 구성된 값 - Matrix
3d,4d...로 구성된 값 - 3차원 Tensor, 4차원 Tesnor..
(vector를 1차원 Tensor, Matrix를 2차원 Tensor로 일반적으로 언급하기도 한다!)
matmul은 행렬 곱셈이며, mul은 원소별 곱셈이다.
넘파이의 reshape와 같은 역할을 한다.
t = np.array([[[0, 1, 2],
[3, 4, 5]],
[[6, 7, 8],
[9, 10, 11]]])
ft = torch.FloatTensor(t)
ft는 현재 와 같은 모습이다
print(ft.view([-1, 3]))
tensor([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.],
[ 9., 10., 11.]])
view([-1,3]) < 2차원 shape로 변경한다 행(1번째 차원)은 되는대로 열(2번째 차원은)은 3의 길이를 가지도록 하라
따라서 위의 view 연산을 거친 ft는 와 같은 모습이다.
squeeze, unsqueeze는 tensor의 차원 축을 추가,제거하는 역할을 한다.
squeeze는 1인 차원을 제거한다.
tensor t가 (3,1)의 2차원 tensor일 때 t.squeeze()연산을 하면 (3,)의 1차원 tensor로 변경된다.
unsqueeze는 squeeze와 반대로 특정위치에 1인 차원을 추가하는 역할을 한다.
(3)의 1차원 tensor t에 t.unsqueeze(0) 연산을 하면 (1,3)의 2차원 tensor t로 변경된다. unsqueeze안의 인자는 1인 차원을 추가할 축의 index이다.
x = torch.FloatTensor([[1, 2], [3, 4]])
y = torch.FloatTensor([[5, 6], [7, 8]])
print(torch.cat([x, y], dim=0))
>>> tensor([[1., 2.],
[3., 4.],
[5., 6.],
[7., 8.]])
tensor를 concat하는 역할을 하는 cat이다.
dim은 pandas에서 axis와 같은 역할을 하는 듯 싶다.
dim=1 으로 설정하면
tensor([[1., 2., 5., 6.],
[3., 4., 7., 8.]])
와 같은 결과를 얻을 수 있다.
stack은 앞서 언급한 unsqueeze와 cat을 한번에 수행한다.
x = torch.FloatTensor([1, 4])
y = torch.FloatTensor([2, 5])
z = torch.FloatTensor([3, 6])
print(torch.stack([x, y, z]))
>>> tensor([[1., 4.],
[2., 5.],
[3., 6.]])
위를 cat,unsqueeze를 통해 구현하려면
torch.cat([x.unsqueeze(0), y.unsqueeze(0), z.unsqueeze(0)], dim=0)
와 같이 보다 긴 코드가 필요하다.
x = torch.FloatTensor([[1, 2], [3, 4]])
y = torch.FloatTensor([[5, 6], [7, 8]])
cat = torch.cat([x,y])
print(cat)
>>>tensor([[1., 2.],
[3., 4.],
[5., 6.],
[7., 8.]])
#########vs ########
stack = torch.stack([x,y])
print(stack)
>>>tensor([[[1., 2.],
[3., 4.]],
[[5., 6.],
[7., 8.]]])
위와 같이 서로 다른 방향의 연결이기 때문에 개념을 숙지할 필요가 있닷