본 게시글은 PyTorch 공식 홈페이지의 "파이토치로 딥러닝하기 : 60분만에 끝장내기"를 진행하면서 작성한 글입니다!
머신 러닝 (인공 지능)을 활용하면서 가장 많이 들어보는 라이브러리는 텐서플로우와 파이토치일 것이다.
아무래도 라이브러리의 이점은 기울기를 계산해주는거랑, 이미 만들어진 모델 사용 가능 등등 하여튼 엄청나게 편리하다는 점이다.
파이토치와 텐서플로우 모두 사용해 본 적이 없기 때문에 구체적인 비교는 할 수 없고.. 수업에서 파이토치를 사용한다고 해서 파이토치 먼저 학습해보려고 한다...
파이토치 홈페이지에서는 이런 사람들이 파이토치를 사용한다고 한다.
- NumPy를 대체하면서 GPU를 이용한 연산이 필요한 경우
- 최대한의 유연성과 속도를 제공하는 딥러닝 연구 플랫폼이 필요한 경우
우선, 가장 중요한 개념이 텐서이다.
Tensor : 벡터 계산을 단순화하려고 여러 같은 성질의 벡터를 한 행렬 안에 표기하고 단순화하여 표기한 것. (나무위키)
1차원은 배열, 2차원은 행렬, 여기서 3차원 이상을 텐서라고 한다. (그아래 배열도 1차원 텐서 이렇게 말할 수 있다 한다)
하여튼 이러한 텐서는 학습하는데 있어서 무조건적으로 사용되는 단위이고, 가장 중요하다고 한다.
간단한 텐서 생성하기
from __future__ import print_function
import torch
#텐서 생성
x = torch.empty(4, 2)
print(x)
#랜덤으로 초기화
x = torch.rand(4, 2)
print(x)
#long type의 0으로 초기화
x = torch.zeros(4, 2, dtype=torch.long)
print(x)
#직접 tensor 생성
x = torch.tensor([5.5, 3])
print(x)
#사이즈 구하기
print(x.size())
tensor([[1.6691e-07, 1.7281e-04],
[2.0682e+20, 5.3479e+22],
[1.3223e+22, 1.6804e-04],
[1.6970e-07, 1.0441e+21]])
tensor([[0.1075, 0.1622],
[0.9876, 0.1117],
[0.8244, 0.8719],
[0.1879, 0.7262]])
tensor([[0, 0],
[0, 0],
[0, 0],
[0, 0]])
tensor([5.5000, 3.0000])
torch.Size([2])
덧셈 해보기
#랜덤으로 초기화
x = torch.rand(4, 2)
y = torch.rand(4, 2)
#바로 더하기
print(x + y)
#add로 더하기
print(torch.add(x, y))
#더해서 다른곳에 넣기
result = torch.empty(5,3)
torch.add(x,y, out= result)
print(result)
#y에다 x 더하기 (바꿔치기 -> 뒤에 _가 붙음)
y.add_(x)
print(y)
#numpy처럼 출력 (열별로)
print(result[:, 0])
print(result[:, 1])
tensor([[0.9661, 0.6545],
[0.9329, 1.0765],
[1.8769, 0.7259],
[1.8828, 0.8955]])
tensor([[0.9661, 0.6545],
[0.9329, 1.0765],
[1.8769, 0.7259],
[1.8828, 0.8955]])
tensor([[0.9661, 0.6545],
[0.9329, 1.0765],
[1.8769, 0.7259],
[1.8828, 0.8955]])
tensor([[0.9661, 0.6545],
[0.9329, 1.0765],
[1.8769, 0.7259],
[1.8828, 0.8955]])
tensor([0.9661, 0.9329, 1.8769, 1.8828])
tensor([0.6545, 1.0765, 0.7259, 0.8955])
텐서 크기 바꾸기
#torch.view로 텐서의 크기, 모양 바꾸기
x = torch.randn(3, 2)
y = x.view(6) #이때 3*2와 관련된 것만 가능 -> 뜬금없이 8 x
z = x.view(-1, 3) #-1은 다른 차원으로 (역시 3*2관련만)
print(x.size(), y.size(), z.size())
#값이 하나면 item으로 숫자 얻어내기
x = torch.randn(1)
print(x)
print(x.item())
torch.Size([3, 2]) torch.Size([6]) torch.Size([2, 3])
tensor([2.1518])
2.151798963546753
Numpy로 바꿔보기
위에서 만져본 Torch Tensor를 Numpy 배열로 변환, 반대로 하기.
Tensor가 CPU상에 있다면 Numpy와 메모리 공간을 공유하기 때문에 (같은애) 하나를 변경하면 나머지도 변경된다고 한다.
(CharTensor를 제외하고는 모두 변환이 가능하다!)
a = torch.ones(5)
print(a)
#torch -> numpy
b = a.numpy()
print(b)
#torch에 3씩 추가
a.add_(3)
print(a)
print(b)
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
tensor([4., 4., 4., 4., 4.])
[4. 4. 4. 4. 4.]
import numpy as np
a = np.ones(5)
print(a)
#numpy -> torch
b = torch.from_numpy(a)
print(b)
#numpy에 3씩 추가
np.add(a, 3, out=a)
print(a)
print(b)
[1. 1. 1. 1. 1.]
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
[4. 4. 4. 4. 4.]
tensor([4., 4., 4., 4., 4.], dtype=torch.float64)
CUDA Tensor
CUDA는 NVIDIA에서 개발한 GPU 툴이다.
간단하게 GPU와 머신러닝이 무슨 상관이 있는지 말하자면,
기존의 컴퓨터 연산은 CPU를 사용해 RAM에 의존하여 복잡한 연산을 빠르게 진행하였다. 8~16개의 코어를 사용한다.
GPU는 그래픽을 처리하기 위해 비슷비슷한 연산들을 대량의 코어(수천개)를 사용한다.
물론 속도는 CPU가 GPU보다 훨씬 빠르지만, 간단한 연산 (행렬의 덧셈) 같은 경우엔 양으로 압도시키는 것이다.
위 짤은 NVIDEA에서 CPU와 GPU를 비교하는 영상에서 나온 짤이다
하여튼, CUDA의 과정으로는 메모리를 GPU메모리로 복사하고, CPU가 GPU에 프로세스를 지시하면 GPU가 수행해서 결과물을 메인 메모리로 돌려주는데, 내 수준에선 간단하게 GPU를 써서 빠르게 한다고 이해했다.
CUDA 설치는 GPU, 가능한 윈도우 버전, VisualStudio가 있으면 쉽게 설치할 수 있다.
https://developer.nvidia.com/cuda-downloads 에 가서 시키는대로 하면 쉽다.
# ``torch.device`` 를 사용하여 tensor를 GPU 안밖으로 이동
if torch.cuda.is_available(): # CUDA가 가능하면
device = torch.device("cuda") # CUDA 장치 객체(device object)로
y = torch.ones_like(x, device=device) # GPU 상에 직접적으로 tensor를 생성하거나
x = x.to(device) # .to("cuda") 사용
z = x + y
print(z)
print(z.to("cpu", torch.double)) # .to 는 dtype도 함께 변경
tensor([1.8994], device='cuda:0')
tensor([1.8994], dtype=torch.float64)
뭐 실행하면 이렇다는데 눈물나는 점은 pytorch에서 3.5 이상의 CUDA부터 지원한다는 점이다. CUDA를 설치할 때 GPU마다 레벨이 있다. 내 데스크톱은 눈물나는 3.0이라 아마 CUDA는 사용하지 않을 (못할) 듯 싶다...
'코딩 > 이미지 분류 [PyTorch]' 카테고리의 다른 글
Flask를 이용하여 파이토치를 REST API로 베포하기 (0) | 2020.11.02 |
---|---|
REST API란? [특징, 규칙] (0) | 2020.11.02 |
머신러닝 : CIFAR-10 성능향상 [Conv, Linear, Dropout] (2) | 2020.10.07 |
머신러닝 : CNN (합성곱신경망) [Convolution, Pooling] (0) | 2020.10.06 |
머신러닝 : 파이토치로 사진 분류하기 [CIFAR-10 CLASSIFIER] (2) | 2020.10.05 |
Comment