(Deep Learning) Practice/Summary - Pytorch 으로 딥러닝 구현하기
Pytorch 으로 딥러닝 구현하기
Pytorch 로 Deep learning 을 구현하는 절차 및 방법 그리고 요구되는 Library 에 대하여 정리해 보고자 합니다.
Deep learning 을 TensorFlow 가 아닌 Pytorch 로 시작 하고자 하는 분들에게 도움이 되길 바랍니다.
- Pytorch 환경 설정
- 공식 사이드 : https://pytorch.org/
- 개발환경
- Pytorch 설치)
- conda install pytorch-cpu -c pytrorch
- pip install torchvision #이미지 데이터를 다루는 패키지
- 사용
- import torch #임포트 할때의 명칭은 pytorch 가아닌 torch
- Pytorch 로 딥러닝 구현하는 과정 (요약)
- Step 1. 데이터 전처리
- 데이터를 신경망에 입력 할 수 있도록 가공합니다.
- 주어진 데이터가 없는 경우,
- "sklearn.datasets 의 fetch_mldata" 를 활용 했었으나 //서비스 종료
- from sklearn.datasets import fetch_mldata
- 이제는 "sklearn.datasets 의 fetch_openm" 를 사용하여 MNIST 등과 같이 공개된 데이터 집합을 다운 받아 학습 등의 목적에 맞게 활용이 가능 하다
- from sklearn.datasets import fetch_openml
- Step 2. DataLoder 구현
- 정규화 등을 마친 데이터를 파이토치 신경망에서 다룰수 있게 DataLoader 객체로 변화하는 단계 입니다.
- import torchfrom torch.utils.data import TensorDataset, DataLoaderfrom sklearn.model_selection import train_test_split
- [1] 훈련 데이터와 데스트 데이터로 분할
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/7, random_state=0)
- [2] 주어진 자료 구조 예로 Numpy 배열 등을 Tensor 객체로 변환 합니다.
- X_train = torch.Tensor(X_train)X_test = torch.Tensor(X_test)y_train = torch.LongTensor(y_train)y_test = torch.LongTensor(y_test)
- [3] DataSet 객체를 생성 합니다.
- ds_train = TensorDataset(X_train, y_train)ds_test = TensorDataset(X_test, y_test)
- [4] 끝으로, DataSet 객체를 DataLoader 객체로 변환 합니다.
- loader_train = DataLoader(ds_train, batch_size=64, shuffle=True)loader_test = DataLoader(ds_test, batch_size=64, shuffle=False)
- Step 3. 신경망 구성
- 텐서플로와 케라스 라이브러리를 사용 방법과 동일하게
- # Keras 스타일model = nn.Sequential()model.add_module('fc1', nn.Linear(28*28*1, 100))model.add_module('relu1', nn.ReLU())model.add_module('fc2', nn.Linear(100, 100))model.add_module('relu2', nn.ReLU())model.add_module('fc3', nn.Linear(100, 10))
- 체이너 스타일로 신경망을 구성하는 방법도 있다.
- Step 4. 오차 함수 및 최적화 기법 선택
- 신경망의 출력과 실제 정답에 해당하는 기대 출력 간의 오차를 계상 하는 방법으로
- from torch import optim
- 분류 문제를 풀 경우에는 교차 엔트로피 함수를 오차 함수로 사용 한다.
- # 오차함수 선택loss_fn = nn.CrossEntropyLoss() # criterion을 변수명으로 사용하는 경우가 많다
- 최적화 기법은 신경망의 결합 가중치를 어떤 알고리즘으로 수정하여 학습 할것인지를 의미
- 경사 하강법 알고리즘 중 Adam 의 경우, lr 은 학습율을 의미한다.
- # 가중치를 학습하기 위한 최적화 기법 선택optimizer = optim.Adam(model.parameters(), lr=0.01)
- Step 5. 학습 및 추론 설정
- 학습 단계와 추론 단계의 동작을 각각 설정 해야 한다.
- 학습 시작시 model.train() 으로 학습 모드로 변경
- model.train() # 신경망을 학습 모드로 전환
- 추론 계산시 model.eval() 으로 추론 모드로 변경
- model.eval() # 신경망을 추론 모드로 전환
- 추론 단계의 경우 미분이 필요 없다.
- with torch.no_grad(): # 추론 과정에는 미분이 필요없음
- def train(epoch):model.train() # 신경망을 학습 모드로 전환# 데이터로더에서 미니배치를 하나씩 꺼내 학습을 수행for data, targets in loader_train:optimizer.zero_grad() # 경사를 0으로 초기화outputs = model(data) # 데이터를 입력하고 출력을 계산loss = loss_fn(outputs, targets) # 출력과 훈련 데이터 정답 간의 오차를 계산loss.backward() # 오차를 역전파 계산optimizer.step() # 역전파 계산한 값으로 가중치를 수정print("epoch{}:완료\n".format(epoch))
- def test():model.eval() # 신경망을 추론 모드로 전환correct = 0# 데이터로더에서 미니배치를 하나씩 꺼내 추론을 수행with torch.no_grad(): # 추론 과정에는 미분이 필요없음for data, targets in loader_test:outputs = model(data) # 데이터를 입력하고 출력을 계산# 추론 계산_, predicted = torch.max(outputs.data, 1) # 확률이 가장 높은 레이블이 무엇인지 계산correct += predicted.eq(targets.data.view_as(predicted)).sum() # 정답과 일치한 경우 정답 카운트를 증가# 정확도 출력data_num = len(loader_test.dataset) # 데이터 총 건수print('\n테스트 데이터에서 예측 정확도: {}/{} ({:.0f}%)\n'.format(correct, data_num, 100. * correct / data_num))
- Step 5. 학습 및 추론 실행
- 훈련 데이터와 테스트 데이터외에 별도로 검증 데이터 준비
- 검증 데이터와 훈련 데이터 각각에 대해 오차 함수 값 및 정확도를 모니터링
- 적절한 횟수 만큼 학습을 진행
- # 6. 학습 및 추론 수행for epoch in range(3):train(epoch)
*Reference
: 서적: Pythrch 를 활용한 강화학습/심층 강화 학습 실전 입문 / 오가와 유타로 지음, 심효섭 옮김
: source code : https://github.com/shipjobs/Deep-Reinforcement-Learning-Book/blob/master/program/4_3_PyTorch_MNIST.ipynb
Comments
Post a Comment