저번시간에 anaconda를 사용해서, torch를 설치하고, jupyter notebook을 사용해봤다. 그럼 이제 torch를 본격적으로 사용해보자.
- torch란 facebook에서 제공하는 딥러닝 도구로서, numpy와 효율적인 연동을 지원하는 편리한 도구이다.
- 구글에서 만든 tensorflow나 pytorch나 기본적인 data structure은 tensor이다.
tensor란 2차원 이상의 array이며, matrix, vector의 일반화된 객체이다.
- 일반화 되었다는 것은 무슨 의미일까?
- vector는 1차원 tensor이다.
- matrix는 2차원 tensor이다.
- 색을 나타내는 RGB는 3차원 tensor이다. 사진출처1
우선 pytorch를 사용하기 위해서 import를 해보자
import torch print(torch.__version__)
1.7.1
필자의 torch는 1.7.1 version이다. version이 다르면 메소드가 안되는 경우도 있으니 주의하길 바란다.
torch.tensor((data)): tensor로 만들어 준다.
V_data = [1.,2.,3.] V = torch.tensor(T_data) print(V)
tensor([1., 2., 3.])
T_data를 [1., 2., 3.]의 float형태의 vector로 만들어주었다. 이제 T에다가 torch.tensor()를 사용해 vector를 tensor로 만들어 준 것.
※ torch가 업데이트 되면서 torch.tensor(data)를 사용해도 error가 나지 않지만,torch의 버전에 따라 torch.tensor((data))를 해야하는 경우도 있다고 하니 주의하기 바란다.
V2 = torch.tensor((T_data)) print(V2)
tensor([1., 2., 3.])
결과가 같음을 확인 할 수 있다.
matrix의 tensor생성 역시 vector와 같다.
M_data = [[1., 2., 3.], [4., 5., 6]] M = torch.tensor(M_data) print(M)
tensor([[1., 2., 3.], [4., 5., 6.]])
tensor의 슬라이싱과 인덱스 접근은 python과 다르지 않다.
print("T ="T) print('T[0] = ',T[0]) print('M =',M) print("M[0] =",M[0]) print("M[0][0]= ",M[0][0]) print("M[:,0] = ",M[:,0]) # 슬라이싱
V = tensor([1., 2., 3.]) V[0] = tensor([[1., 2.], [3., 4.]]) M = tensor([[1., 2., 3.], [4., 5., 6.]]) M[0] = tensor([1., 2., 3.]) M[0][0]= tensor(1.) M[:,0]= tensor([1., 4.])
tensor의 기본적인 타입은 float으로 되어있어, torch를 출력하면 torch의 데이터만 출력되지만, dtype을 int, double로 바꾸면 datatype이 같이 출력된다.
x_data =torch.tensor([1.,2.,3.,],dtype = torch.double) print(x_data) y_data =torch.tensor([1.,2.,3.,],dtype = torch.int) print(y_data)
tensor([1., 2., 3.], dtype=torch.float64) tensor([1, 2, 3], dtype=torch.int32)
torch.randn(size,size) 사이즈 만큼의 tensor를 0~1사이의 값을 랜덤하게 생성한다. 가우시안 분포인 만큼 평균과 표준편차를 이용해 분포를 변경할 수 있다.
x = torch.randn((3, 4, 5))# 4행 5열의 matrix를 3개 만들었다. print(x)
tensor([[[-0.4329, -0.8261, -0.3230, -0.2012, -0.7572], [ 0.9558, 0.1524, -0.5267, -0.7010, 1.6860], [-0.0171, -0.6956, -0.5280, 0.0354, -0.7516], [ 1.0376, 0.3869, -1.2719, 1.0490, 0.8589]], [[-0.5772, -0.4624, 0.3307, 0.1433, 1.5560], [ 0.4705, 1.7702, -0.6031, 1.9666, -0.0286], [-0.0192, -0.2696, 0.5941, -0.8741, -0.5719], [-1.4852, 1.0875, 0.9100, -0.4243, -0.7704]], [[-2.3253, -0.2038, 0.1531, 0.4596, -0.5290], [-0.5955, 1.5410, -0.7018, -1.0801, -0.0078], [-0.3605, 0.1488, 0.5377, -1.2628, -0.0755], [-1.9379, -0.5651, 0.4143, 0.2677, 0.8293]]])
tensor의 연산은 numpy의 array연산과 비슷하다.
x = torch.tensor([1., 2., 3.]) y = torch.tensor([4., 5., 6.]) z = x + y print(z)
tensor([5., 7., 9.])
tensor도 numpy의 np.sum(array,axis)을 지원한다.
a= torch.tensor([[1.,2.,3.],[4.,5.,6.,]]) print(a) print(a.sum()) #tensor의 전부를 합쳤다. print(a.sum(axis=0))# 열 방향으로 합침 print(a.sum(axis=1)) # 행 방향으로 합침 print(torch.sum(a)) print(torch.sum(a,axis=0)) print(torch.sum(a,axis=1))
tensor([[1., 2., 3.], [4., 5., 6.]]) tensor(21.) tensor([5., 7., 9.]) tensor([ 6., 15.]) tensor(21.) tensor([5., 7., 9.]) tensor([ 6., 15.])