(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

인공지능 서비스 - 챗봇, 사전에 충분한 지식을 전달하고 함께 학습 하기!

[Curriculum] Sungkyunkwan University - Department of Information Security - Course Sequence by Areas of Interest