-
[08.17] Day11 - 👊 'PyTorch 기본'네이버 부스트캠프 AI Tech 2기 2021. 8. 21. 19:29728x90반응형
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 같은 것이 어떻게 코드에 들어가는 지 느낌을 알았다.
- 사실 딥러닝 코드를 매번 보면 조금씩 만드는 방식이 다르기 때문에 더 공부해야겠다.
반응형'네이버 부스트캠프 AI Tech 2기' 카테고리의 다른 글
[08.19] Day13 - 👏 'PyTorch 구조2' (0) 2021.08.21 [08.18] Day12 - 👍 'PyTorch 구조' (0) 2021.08.21 [08.10 Special 강의] 📊 기본적인 차트 활용 (0) 2021.08.21 [08.13] Day10 - 'Generative Models'💫 (0) 2021.08.13 [08.12] Day9 - 'Sequential Models(RNN + Transformer)' (0) 2021.08.13