[08.17] Day11 - 👊 'PyTorch 기본'
PyTroch
: TensorFlow와 함께 가장 많이 쓰이는 딥러닝 프레임워크이다.
[수업 내용]
강사 : 최성철 교수님
딥러닝은 코드를 처음부터 다짠다?!
→ 실제로 예전에 이렇게 짰다.. 그런데 이렇게 짜면 힘들어 죽는다.. 그래서 지금은 다른 사람들이 만든 것을 가져다 쓴다. 예를들어 Tensorflow와 PyTorch 등등. 자료도 많고 관리도 잘 되고, 표준이라서 사용한다.
가장 큰 차이는 : 미분, 즉 BackPropagation을 해야한다. 현재 데이터들을 그래프로 표현해햐하는데, 어떤식으로 표현하느냐에 큰 차이가 있다. Static 하게 그래프를 그리고 PyTorch 같은 경우 실행 시점에서 동적으로 그래프를 그린다고 한다.
TensorFlow : Define and Run(그래프를 먼저 정의 → 실행 시점에서 데이터를 뿌려준다.) 장점은 Production, Cloud 연결, Multi-GPU 같은 것에 장점이다.
PyTorch : Define and Run(실행을 하면서 그래프를 생성하는 방식) 장점은 코드가 간결해지고, 디버깅할 때도 더 효과적이라고 한다.
Numpy + AutoGrad + Function
- Numpy 구조를 가지는 Tensor 객체로 Array를 표현한다.
- 자동미분을 지원해서 DL 연산을 지원한다.
- 다양한 형태의 DL을 지원하는 함수와 모델을 지원한다.
Tensor
: 다차원 Array들을 표현하는 PyTorch 클래스(Numpy의 ndarray와 동일하다.) 또한 Tensor를 생성하는 함수도 거의 동일하다.
import numpy as np
n_array = np.arrange(10).reshape(2,5)
import torch
t_array = torch.FloatTensor(n_array)
#둘이 거의 동일한 개념으로 사용된다.
data = [[]]
x1 = torch.tensor(x1)
#data to tensor
x2 = np.array(data)
tenso_array = torch.from_numpy(x2)
#ndArray To Tensor
x_data.device
#메모리에 올릴지, GPU에 올릴지 확인
if torch.cuda.is_avaiable():
x_data_cuda = x_data.to('cuda')
reshape을 쓰는 것보다는 view를 써라!
tensor_ex = torch.rand(size=(채널,행,열))
tensor_ex.view([-1,6])
# -1은 그냥 여러개의 값, 뒤에 6이 열의 개수를 맞춰주고 그거에 맞춰서 자동으로 행이 맞춰진다.
#차이점(reshape와 view의 약간의 차이)
A = torch.zeros(3,2)
B = A.view(2,3)
A.flil_(1)
# 둘이 같은 것을 가르키니 copy가 아니라 같이 바뀐다.
A = torch.zeros(3,2)
B = A.reshape(6)
A.fill_(1)
# A에서 reshape할때, 기존에 틀을 깨서 바뀐다면 copy가 되어버린다.
Tensor Operation
T1 = np.arrange(10).reshape(2,5)
T2 = np.arrange(10).reshape(5,2)
T1 = torch.FloatTensor(T1)
T2 = torch.FloatTensor(T2)
T1 + 10 #scalar 덧셈(가능)
T2 - 10 #scalar 뺄셈(가능)
T1 + T2 #차원이 다르면 Error(불가능)
T1 + T1 #차원이 같으니 (가능)
(중요!) 행렬 곱셈 연산은 dot이 아닌 mm을 사용한다.
T1.mm(T2)
#matmul 같은 경우, broadcasting 지원을 한다는 차이가 있다.
#dot연산은 Vector이거나 그냥 리스트에서 가능
Tensor Operations for ML/DL formula
import torch
import torch.nn.functional as F
tensor = torch.FloatTensor([0.5,0.7,0.1])
result = F.sofmax(tensor, dim = 0)
#PyTorch에서 dim은 Numpy에서 axis와 동일한 역할을한다.
AutoGrad
w = torch.tensor(2.0, requires_grad=True)
y = w**2
z = 10*y + 25
z.backward() #핵심!
w.grad()
#backward시 편미분을 하고 싶다면
z.backward(gradient = '크기')
PyTorch 프로젝트 구조 이해하기
질문
언제나 Jupyter를 통해서만 ML/DL을 영원히 개발을 해야하나?
→ 개발 초기 단계에서는 대화식 개발 과정이 유리하다.(학습과정이나 디버깅 등 지속적으로 확인할 수 있어서) 하지만, 이를 배포 or 공유 하기 위해서 nodebook의 공유는 어렵다. DeepLearning 코드도 하나의 프로그램으로 개발 용이성 확보와 유지보수 향상이 필요하다.
그래서 코드도 레고 블록처럼! OOP + 모듈 ⇒ 프로젝트를 만들자.
다양한 프로젝트 탬플릿들이 존재한다. 사용자에 필요에 따라 다양한 형태로 나눈다. 실행, 데이터, 모델, 설정, 로깅, 지표 등등으로 구분 짓는다.
Pytorch-template
pytorch-template/
│
├── train.py - main script to start training
├── test.py - evaluation of trained model
│
├── config.json - holds configuration for training
├── parse_config.py - class to handle config file and cli options
│
├── new_project.py - initialize new project with template files
│
├── base/ - abstract base classes
│ ├── base_data_loader.py
│ ├── base_model.py
│ └── base_trainer.py
│
├── data_loader/ - anything about data loading goes here
│ └── data_loaders.py
│
├── data/ - default directory for storing input data
│
├── model/ - models, losses, and metrics
│ ├── model.py
│ ├── metric.py
│ └── loss.py
│
├── saved/
│ ├── models/ - trained models are saved here
│ └── log/ - default logdir for tensorboard and logging output
│
├── trainer/ - trainers
│ └── trainer.py
│
├── logger/ - module for tensorboard visualization and logging
│ ├── visualization.py
│ ├── logger.py
│ └── logger_config.json
│
└── utils/ - small utility functions
├── util.py
└── ...
GitHub - victoresque/pytorch-template: PyTorch deep learning projects made easy.
해당 template을 통해서 VsCode와 Colab을 통해서 진행하는 방법을 이야기 해주셨다.
알아둘 내용들
- train.py 로 실행한다.
- config.json 는 환경 파일이다. 아키텍쳐, optimizer, loss, device 등등을 설정해놓고 사용하는 것이다.
- Trainer 는 model, config, device, data_loader, loss 등등 의 정보를 가지고 훈련을 시작하게 된다.
#핵심 코드
self.optimizer.zero_grad() #gradient 초기화
output = self.model(data) #y 예측값을 구한다.
loss = self.criterion(output,target) #loss 값을 구한다.
loss.backward() #BackPropagation, AutoGrad
self.optimizer.step() #각각의 Gradient를 업데이트
==================한번의 배치=======================
[피어세션 정리]
- 8/17 강의 자료를 보면서 질문과 뭘 배웠는지 정리하고 넘어갔다.
- required_True가 있는 변수만 미분이 가능하다는 것을 다같이 알았다.
- 과제 내용 중 hook에 대한 코드 자세히 살펴보면서 원하는 추가적 기능을 custom 할 수 있다는 것을 알게 되었다.
[수업 회고]
- Tensor라는 객체를 통해서 Numpy를 그대로 받을 수 있다는 점을 새로 알게 되었다.
- Template이 있기 때문에 앞으로 다양한 Github 프로젝트들에서 각 파일들의 역할을 미리 유추할 수 있을 것 같다.
- 과제를 통해서 optimizer, loss 같은 것이 어떻게 코드에 들어가는 지 느낌을 알았다.
- 사실 딥러닝 코드를 매번 보면 조금씩 만드는 방식이 다르기 때문에 더 공부해야겠다.