Study/AI

[Pytorch] 파이토치 기초

motti 2023. 3. 19. 20:17
반응형

프레임워크

  • 딥러닝 프레임워크는 텐서플로우, 케라스, 파이토치 등등 엄청나게 많다
  • 사실상 텐서플로우와 파이토치가 표준으로 자리 잡고 있다.
  • 파이토치는 페이스북에서 만들었고, 텐서플로우는 구글에서 만든 프레임워크이다.

Keras TensorFlow Pytorch

Level-of-Api high-level-api how+low level api lower-level api
Speed slow high high
Architechture simple complex complex
Debugging 디버그 필요없음 디버그가 어려움 디버그가 쉬움
데이터셋 느리고 작음 빠르고 큼 빠르고 큼
사용성 유저친화적 어려운 api 파이썬에 통합된 언어
인기도 1 2 3
그래프 연산 Static-graphs Static-graphs Dynamic computation graphs

 

  • 케라스는 자체적으로 연산해주는 프레임워크기 보단 wrapper로서 의미가 강하다.

 💡 파이토치는 Dynamic Computation Graph 기법을 사용하고 텐서플로우는 Define and run 기법을 사용한다.

 

Computational Graph

  • 연산의 과정을 그래프로 표현

Define and Run(텐서플로우)

  • 그래프를 먼저 정의하고(코드를 작성하고) 실행시점에 데이터를 넣어주는 것이다.

Define by Run(Dynamic computation Graph, 파이토치)

  • 코드를 실행하면서 그래프를 생성하는 방식

 💡 텐서플로우는 직접 코드에 데이터까지 입력해주는 방식이지만 파이토치는 바로바로 데이터를 넣을 수 있어서, 훨씬 코드가 간결하고 디버그가 편하다.

텐서플로우는 production,클라우드 연결, 멀티gpu,scalability에 장점을 가진다. 반면, 파이토치는 개발적인 성격에 강해 논문을 읽고 구현하는 것에 더 장점을 가진다.

왜 파이토치인가

  • Define by Run의 장점을 가진다.
    • 즉시 결과를 확인할 수 있고 pythonic code로 개발이 편하고 이해가 쉽다.
  • Gpu를 지원하고, api 사용과 커뮤니티가 잘되어있다.
  • 사용하기가 편하다
  • Numpy + AutoGrad(자동미분) + Function(다양한 딥러닝 함수)이 사용 가능하다
  • Dataset, multi-gpu를 지원해주어 딥러닝 구현이 쉽다.

💡 Autograd가 무엇이고 어떻게 작동하는가?

  • Autograd를 사용하면 backprop를 위한 미분 값을 자동으로 계산해준다.
  • requires_grad = True로 작동하고 .backward()을 통해 연산이 된다

 

파이썬의 기초 문법

[Numpy + AutoGrad]

  • 넘파이 연산이 전반적으로 사용된다.

Tensor

  • 다차원의 arrays를 표한하는 pytorch 클래스
  • 넘파이의 ndarray와 동일(텐서플로우에서 tensor와도 동일)
  • 함수도 거의 동일
###numpy - ndarray
import numpy as np
n_array = np.arange(10).reshape(2,5)
print(n_array)
print("ndim :", n_array.ndim, "shape :", n_array.shape)

###pytorch - tensor
import torch
t_array = torch.FloatTensor(n_array)
print(t_array)
print("ndim :", t_array.ndim, "shape :", t_array.shape)
  • 넘파이의 대부분 사용법이 파이토치에서도 그대로 사용됨(ones_like,flatten,shape,dtype 등등)
  • 파이토치의 tensor는 gpu에서 사용이 가능하다.

주의할점 : 코랩에서 gpu를 사용할려할때는 런타임을 바꿔주고 실행해야한다. 런타임을 바꾸면 앞의 리소스가 다 사라지니 알아둘 것

Handling

  • view : reshape 와 동일하게 tensor의 shape을 변환(메모리 주소를 그대로 가져와 형태를 변경해줘. 데이터의 값을 변경하면 복사한 값도 변경됨, reshape은 복사까지 하진 않음)
    • reshape보단 view를 쓰는것을 추천
  • squeeze : 차원의 개수가 1인 차원을 삭제(압축), 따로 차원을 설정하지 않으면 1인 차원을 모두 제거
import torch

x = torch.rand(3, 1, 20, 128)
x = x.squeeze() #[3, 1, 20, 128] -> [3, 20, 128]
  • unsqueeze : 차원의 개수가 1인 차원을 추가(어느 차원에 1인 차원을 생성할지 지정해주어야한다.)
import torch

x = torch.rand(3, 20, 128)
x = x.unsqueeze(dim=1) #[3, 20, 128] -> [3, 1, 20, 128]

tensor 연산

  • 뺼셈, 덧셈, 스칼라 곱 다 가능
  • 행렬곱셈 연산은 dot이 아닌 mm을 사용(내적을 곱할땐 dot을 써도 됨, 오히려 mm이 벡터 연산을 지원해주지 않음)
  • 즉, 벡터연산은 dot, 행렬연산은 mm(matmul)
  • mm과 matmul은 broadcasting 지원차이
a = torch.rand(5,2,3) #5는 batch
b = torch.rand(3)
a.mamul(b) ## [5,2,1] 연산이 나온다.
  • nn.functional 모듈을 통해 다양한 수식을 지원

AutoGrad

  • Pytorch의 핵심은 자동 미분의 지원 → backward 함수 사용
 
반응형

'Study > AI' 카테고리의 다른 글

[AI] Convolutional Neural Networks(CNN)  (0) 2023.03.26
[Pytorch] 모듈과 데이터셋 + 데이터로더  (0) 2023.03.19
[AI] 딥러닝 기초  (0) 2023.03.12
[Math] 경사하강법  (0) 2023.03.12
[Math] 벡터와 행렬  (0) 2023.03.12