(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 torch
        from torch.utils.data import TensorDatasetDataLoader
        from sklearn.model_selection import train_test_split
        • [1] 훈련 데이터와 데스트 데이터로 분할
        • X_trainX_testy_trainy_test = train_test_split(
              Xytest_size=1/7random_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_trainy_train)
          ds_test = TensorDataset(X_testy_test)

        • [4] 끝으로, DataSet 객체를  DataLoader 객체로 변환 합니다.
        • loader_train = DataLoader(ds_trainbatch_size=64shuffle=True)
          loader_test = DataLoader(ds_testbatch_size=64shuffle=False)
    • Step 3. 신경망 구성
      • 텐서플로와 케라스 라이브러리를 사용 방법과 동일하게
      • # Keras 스타일
        model = nn.Sequential()
        model.add_module('fc1',   nn.Linear(28*28*1100))
        model.add_module('relu1'nn.ReLU())
        model.add_module('fc2',   nn.Linear(100100))
        model.add_module('relu2'nn.ReLU())
        model.add_module('fc3',   nn.Linear(10010))

      • 체이너 스타일로 신경망을 구성하는 방법도 있다.
    • 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 datatargets in loader_train:
              
                optimizer.zero_grad()  # 경사를 0으로 초기화
                outputs = model(data)  # 데이터를 입력하고 출력을 계산
                loss = loss_fn(outputstargets)  # 출력과 훈련 데이터 정답 간의 오차를 계산
                loss.backward()  # 오차를 역전파 계산
                optimizer.step()  # 역전파 계산한 값으로 가중치를 수정

            print("epoch{}:완료\n".format(epoch))
      • def test():
            model.eval()  # 신경망을 추론 모드로 전환
            correct = 0

            # 데이터로더에서 미니배치를 하나씩 꺼내 추론을 수행
            with torch.no_grad():  # 추론 과정에는 미분이 필요없음
                for datatargets 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(correctdata_num100. * correct / data_num))

    • Step 5. 학습 및 추론 실행
      • 훈련 데이터와 테스트 데이터외에 별도로 검증 데이터 준비
      • 검증 데이터와 훈련 데이터 각각에 대해 오차 함수 값 및 정확도를 모니터링
      • 적절한 횟수 만큼 학습을 진행
      •  # 6. 학습 및 추론 수행
        for epoch in range(3):
            train(epoch)


*Reference 
    : 서적: Pythrch 를 활용한 강화학습/심층 강화 학습 실전 입문 / 오가와 유타로 지음, 심효섭 옮김 











Comments

Popular posts from this blog

[MaritimeCyberTrend] Relationship and prospects between U.S. Chinese maritime operations and maritime cybersecurity

Examining the Reality of Cyber Incidents and the Shortfalls in Compliance Frameworks

Comprehensive List of Shipboard Systems in Commercial Vessels