Deep Learning with PyTorch: A 60 Minutes Blitz (1) – What is PyTorch?
http://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html
Deep Learning with PyTorch: A 60 Minute Blitz
Author: Soumith Chintala(http://soumith.ch)
이 튜토리얼의 목표는 아래와 같습니다.
- PyTorch의 Tensor와 neural network 라이브러리를 높은 수준에서 이해한다.
- 이미지를 분류하는 작은 신경망을 학습해본다.
이 튜토리얼은 numpy의 사용에 익숙한 사람들을 위한 것입니다.
Note: torch와 torchvision 패키지를 미리 설치해야 합니다.
What is PyTorch?
아래 사용자를 위하여 개발된 Python 기반 과학 컴퓨팅 패키지입니다.
- GPU의 힘을 이용하기 위해 numpy를 대체하려는사 람
- 최고의 유연함과 속도를 제공하는 딥러닝 연구 플랫폼
Getting Started
Tensors
Tensors는 numpy의 ndarray와 비슷한 것입니다. 하지만 Tensors는 GPU를 이용한 빠른 연산을 할 수 있습니다.
1 2 3 |
from __future__ import print_function import torch |
5x3 행렬을 초기화없이 만들어봅시다.
1 2 3 |
x = torch.Tensor(5, 3) print x |
Out:
1234567 0.0000e+00 0.0000e+00 3.1766e-274.5880e-41 3.1950e-27 4.5880e-411.9468e-22 4.5880e-41 1.9468e-224.5880e-41 2.3214e-22 4.5880e-412.2306e-22 4.5880e-41 -2.7458e+32[torch.FloatTensor of size 5x3]
크기도 얻어봅시다.
1 2 |
print(x.size()) |
Out:
12 torch.Size([5, 3])
Note:
torch.Size
는 튜플 타입이므로 == 연산을 지원합니다.
Operations
여러 문법으로 연산을 할 수가 있습니다. 예제를 살펴봅시다.
덧셈: 문법 1
1 2 3 |
y = torch.rand(5, 3) print(x+y) |
Out:
1234567 1.7700 1.7643 1.37321.3085 1.4576 0.96680.9354 0.0891 0.47270.6503 0.6814 1.23341.5436 0.9600 1.0965[torch.FloatTensor of size 5x3]
덧셈: 문법 2
1 2 |
print(torch.add(x, y)) |
Out:
1234567 1.7700 1.7643 1.37321.3085 1.4576 0.96680.9354 0.0891 0.47270.6503 0.6814 1.23341.5436 0.9600 1.0965[torch.FloatTensor of size 5x3]
덧셈: 출력 텐서를 지정
1 2 3 4 |
result = torch.Tensor(5, 3) torch.add(x, y, out=result) print(result) |
Out:
1234567 1.7700 1.7643 1.37321.3085 1.4576 0.96680.9354 0.0891 0.47270.6503 0.6814 1.23341.5436 0.9600 1.0965[torch.FloatTensor of size 5x3]
덧셈: in-place
1 2 3 4 |
# adds x to y y.add_(x) print(y) |
Out:
1234567 1.7700 1.7643 1.37321.3085 1.4576 0.96680.9354 0.0891 0.47270.6503 0.6814 1.23341.5436 0.9600 1.0965[torch.FloatTensor of size 5x3]
Note:
In-place가 일어나 Tensor가 수정되는 모든 연산은
_
로 끝납니다. 예:x.copy_(y)
,x.t_()
는x
를 변화시킵니다.
Out:
1234567 0.80260.87630.06750.14990.8487[torch.FloatTensor of size 5]
Resizing: Tensor의 크기를 변화시키거나 shape을 변화시키고 싶다면 torch.view
를 사용하면 됩니다.
1 2 3 4 5 |
x = torch.randn(4,4) y = x.view(16) z = x.view(-1, 8) # the size -1 is inferred from other dimensions print(x.size(), y.size(), z.size()) |
Out:
12 torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
Read later:
Transposing, indexing, slicing, 수학 연산, 선형 대수, random number 등 100개가 넘는 Tensor 연산은 여기에 설명되어있습니다.
Numpy Bridge
Torch의 Tensor를 numpy array로, 혹은 그 반대로 변환하는 것도 매우 쉽습니다.
Torch Tensor와 numpy array는 같은 메모리 위치를 공유하고 있으므로, 하나를 바꾸면 나머지쪽도 값이 바뀌게 됩니다.
Converting torch Tensor to numpy Array
1 2 3 |
a = torch.ones(5) print(a) |
Out:
1234567 11111[torch.FloatTensor of size 5]
1 2 3 |
b = a.numpy() print(b) |
Out:
12 [ 1. 1. 1. 1. 1.]
Numpy array의 값이 변하는지 확인해봅시다.
1 2 3 4 |
a.add_(1) print(a) print(b) |
Out:
123456789 22222[torch.FloatTensor of size 5][ 2. 2. 2. 2. 2.]
Converting numpy Array to torch Tensor
np array를 변경하면 자동적으로 torch Tensor를 바뀌는지 살펴봅시다.
1 2 3 4 5 6 7 |
import numpy as np a = np.ones(5) b = torch.from_numpy(a) np.add(a, 1, out=a) print(a) print(b) |
Out:
123456789 [ 2. 2. 2. 2. 2.]22222[torch.DoubleTensor of size 5]
CharTensor를 제외한 CPU에 만들어진 모든 Tensors는 Numpy로 변경하거나 다시 돌아오는 것이 가능합니다.
CUDA Tensors
Tensors는 .cuda
함수를 이용해서 GPU로 옮길 수 있습니다.
1 2 3 4 5 6 |
# let us run this cell only if CUDA is available if torch.cuda.is_available(): x = x.cuda() y = y.cuda() x + y |