전공 과목 이수2👨‍💻/딥러닝

Pytorch입문 - 텐서 기본 문법

천숭이 2022. 1. 16. 22:35
import torch
import numpy as np

- torch 텐서 작업은 numpy 텐서작업과 비슷하다!

 

# numpy to torch
num = np.array([[1,2,3], [4,5,6]])
tor = torch.FloatTensor(num)
print(num)
print(tor)

[[1 2 3] [4 5 6]] tensor([[1., 2., 3.], [4., 5., 6.]])

- numpy 어레이로 선언하고 torch.FloatTensor 이용해 torch형 실수텐서 생성!

 

t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
print(t) # tensor([0., 1., 2., 3., 4., 5., 6.])

 

t.dim() # 1차원
t.shape # torch.Size([7])
t.size() # torch.Size([7])

 


A,B 행렬끼리의 연산 주의할 점
   - 두 행렬의 크기가 같으면 덧셈,뺄셈 가능
   - A의 마지막 차원과 B의 첫번째 차원이 일치해야 덧셈 가능

브로드캐스팅이 자동으로 크기 맞춰준다
# Vector + scalar
m1 = torch.FloatTensor([[1, 2]])
m2 = torch.FloatTensor([3]) # [3] -> [3, 3]
print(m1 + m2)  # tensor([[4., 5.]])
# 2 x 1 Vector + 1 x 2 Vector
m1 = torch.FloatTensor([[1, 2]])
m2 = torch.FloatTensor([[3], [4]])
print(m1 + m2)
# tensor([[4., 5.],
#         [5., 6.]])
 
행렬곱셈(matmul) != 원소곱셈(mul)
mul -> 변수에 변화 반영 x
mul_ -> 변수에 변화 반영 o
m1 = torch.FloatTensor([[1,2], [3,4]])
m2 = torch.FloatTensor([[1], [2]])

m3 = m1.mul(m2)
print(m3)

 

tensor([[1., 2.], [6., 8.]])

m3 = m1.matmul(m2)
# [1 2]  *   [1]
# [3 4]      [2] 
print(m3)

tensor([[ 5.], [11.]])

# 평균 구하기
s1 = torch.FloatTensor([[1., 2.],[6., 8.]])
s1.mean()  # tensor(4.2500)

# 행끼리 (다른 차원과의) 평균
s1.mean(dim=0)  # tensor([3.5000, 5.0000]

# 열끼리 (같은 차원과의) 평균
s1.mean(dim=1)  # tensor([1.5000, 7.0000])
# view를 이용해 2차원으로 변경
# .view([-1, 3]) -> 
v1 = torch.FloatTensor([[[1,2,3], [10,20,30], [100,200,300]],
                        [[4,5,6], [40,50,60], [400, 500, 600]]])

v1 = v1.view([-1, 3])

view 적용 전 :

tensor([[[ 1., 2., 3.],

                [ 10., 20., 30.],

                [100., 200., 300.]],

               [[ 4., 5., 6.],

                [ 40., 50., 60.],

                [400., 500., 600.]]])

torch.Size([2, 3, 3])

 

view 적용 :

tensor([ [ 1., 2., 3.],

             [ 10., 20., 30.],

             [100., 200., 300.],

             [ 4., 5., 6.],

             [ 40., 50., 60.],

             [400., 500., 600.] ])
torch.Size([6, 3])

 


# 텐서 관련 함수

torch.cat([x, y])        -> x와 y 연결해서 합쳐줌
torch.stack([x, y, z])   -> x,y,z 연결하는 또다른 방법
torch.ones_like(x)      -> x와 동일한 크기로 1로만 채워진 텐서 생성