테키테크 TEKITECH

[스파르타코딩클럽] 3주차 숙제 : GAN-LSTM 모델로 주가예측 해보기 - 2. Colab에서 GAN-LSTM 모델로 주가예측 해보기 (tensorflow) 본문

Tech/ML·DL

[스파르타코딩클럽] 3주차 숙제 : GAN-LSTM 모델로 주가예측 해보기 - 2. Colab에서 GAN-LSTM 모델로 주가예측 해보기 (tensorflow)

TEKI 2021. 9. 21. 21:04

이전 글에서 데이터셋을 얻는 방법과 GAN과 LSTM에 대해 알아보았다. 이번에는 데이터셋과 숙제 base code를 분석해보고, 모델 학습 및 평가하는 과정을 기록한다. 사용한 코드는 Github에 업로드했다.
  → Github에 코드 보러가기

 

목차


1. 개념 복습 및 학습 데이터 준비
2. Colab에서 GAN-LSTM 모델로 주가예측 해보기 (tensorflow)
    2-1. 데이터 준비
    2-2. 모델 구성 
    2-3. 모델 학습
    2-4. 모델 평가
    2-5. Error Handling
    2-6. 질문
    2-7. 오늘의 생각

3. 질문 해결하기


 

데이터 준비

Yahoo Finance에서 받았던 데이터셋을 Colab에 업로드하고, Pandas로 데이터를 받아왔다. Colab에 데이터를 업로드하는 방법은 여기에 정리해놓았다.

 

 

모델 구성

[1] Generator

베이스 코드에서 Generator는 아래와 같은 구조로 LSTM을 사용하고, 활성화 함수로 LeakyReLU를 사용해서 가짜 이미지를 만든다. 베이스 코드에서 dropout 레이어는 생략 가능했는데, 딥러닝 모델을 사용해서 주가 예측을 시도할 때 가장 흔히 발생하는 overfitting 문제에 대응하여 시도해볼 수 있는 방법이 아니었나 생각이 되었다.

Generator 구조

 

[2] Discriminator

베이스 코드에서 Discriminator는 아래와 같은 구조로 Dense 레이어와 LeakyReLU 레이어가 반복되도록 설계하였다. Discriminator는 학습이 아닌 판별을 하는 것이 목적이다. 따라서 연산을 통해 얻은 가중치를 Generator에게 전달하는 역할을 한다.  

Discriminator 구조

 

[3] Optimizer

Generator와 Discriminator 구조를 모델링했으면, GAN 모델을 완성하고 이를 최적화(optimize)해주어야 한다. 먼저 keras.model.Model로 GAN 모델을 구성해준다. 그리고 keras의 Optimizer 중 RMSprop을 사용하고, loss function으로는 sigmoid계열인 binary_crossentropy를 사용해서 모델을 컴파일해준다.

 

 

모델 학습

데이터셋을 모델에 맞게 가공하고, train set과 test set으로 나눈다. 그리고 iterations, batch size 등 파라미터를 설정해주면 학습을 할 준비가 되었다. 데이터 가공과 파라미터는 숙제 코드에서 세팅된 그대로 사용했다. 코드를 좀 더 자세히 들여다봐야 파라미터 튜닝이 가능할 것 같다.

 

 

모델 평가

학습을 마치고 결과를 얻었으니 이제 모델의 성능을 평가해야 한다. GAN 모델의 경우, 모델 성능을 평가하기 위해 Generator가 생성한 가짜 데이터와, 그에 대해 Discriminator가 판단한 결과를 사람이 직접 확인한다고 한다. 하지만 G와 D가 경쟁하는 과정과 그 결과를 처리하는 코드를 좀 더 이해한 후 파라미터 튜닝을 통해 여러 번 학습을 거쳐야 이러한 방법으로 모델 평가가 가능할 것 같다. 

 

 

Error Handling

 

[1] AttributeError: module 'keras.optimizers' has no attribute 'RMSprop'

keras optimizers 중에서 RMSprop을 사용한다.

import keras

...(생략)...

discriminator_optimizer = keras.optimizers.RMSprop(lr=8e-4, clipvalue=1.0, decay=1e-8)

여기에서 Attribute 에러가 발생했다.

AttributeError: module 'keras.optimizers' has no attribute 'RMSprop'

keras와 tensorflow를 다시 설치해보아도 해결이 안됐는데 import 방식을 바꿨더니 해결됐다.

from keras import optimizers

...(생략)...

discriminator_optimizer = optimizers.RMSprop(lr=8e-4, clipvalue=1.0, decay=1e-8)

이 오류를 해결하면서 Grepper라는 사이트를 참고했는데, 다양한 에러 케이스와 해결 방법을 에러 메시지 별로 잘 정리해놓았다. 그 외에도 프로그래밍 언어 별 오류를 정리해놓았는데 좀 더 활용해보고 리뷰를 써봐야겠다.

Grepper (이미지를 눌러서 페이지 이동)

 

 

▣ 질문

2. generator에서 output을 하나만 내야 하기 때문에 마지막 dense 레이어에서 유닛 하나로만 연산을 수행해서 하나의 output만을 내도록 한다. T/F?

3. Discriminator에서 유닛 개수를 여러 번 반복적으로 바꾸어주는 과정을 통해 어떤 효과를 기대하고, 실제로 어떤 효과를 얻었나?

 

오늘의 생각

머신러닝/딥러닝은 여러 연산과 모델들을 이해했다고 생각했어도 실제로 모델을 구현하고 학습시키는 것은 정말 다르다. GAN과 LSTM을 각각 이해했다고 생각했지만, 이 둘을 결합시킨 GAN-LSTM 모델은 코드를 봐야 이해할 수 있었기 때문이다.

빨리 코드를 이해해서 모델 튜닝도 해보고, 모델 비교/평가까지 해보고 싶은데 수강 기간이 거의 끝나가서 아쉽지만 추가 공부는 잠시 보류해야할 것 같다 ㅠㅠ

 


※ 참고 자료와 이미지 출처 ※

더보기
더보기

[1] 세상에 없는 얼굴 GAN, 오토인코더
[2] Keras, LSTM layer
[3] [YouTube - [딥러닝] LSTM 쉽게 이해하기

[4] Keras에서 binary_crossentropy와 categorical_crossentropy 차이

 

※ 학습 데이터와 모델 선택은 스파르타 코딩클럽 <실무에 바로쓰는 AI 예측/추천> 수업을 따름
※ Python 코드는 스파르타 코딩클럽 <실무에 바로쓰는 AI 예측/추천> 수업에서 제공한 코드를 바탕으로 함

 

반응형
Comments