잠토의 잠망경

5장 02 -케라스로 구현하는 RNN(순환신경망) 본문

Book/0003.코딩셰프의 3분 딥러닝,케라스맛

5장 02 -케라스로 구현하는 RNN(순환신경망)

잠수함토끼 2020. 1. 27. 21:36

GITHUB

https://github.com/yiwonjae/Project_Book_002/blob/master/ch05/p194.py

불러오는 중입니다...

0. 목표

항공사 탑승객의 수요를 예측한다.

 

1. DATA

# Data Read
import pandas as pd

fname='data.txt'

dataset = pd.read_csv(fname, usecols=[1],
                      engine='python',
                      skipfooter=3)

data = dataset.values.reshape(-1)

ShowMeDrawData(data)

data는 local data를 활용한다.

panda를 활용하여 csv file을 read한다.

그리고 values.reshape(-1) 통해서 data를 추출한다.

 

2. DATA 정제

X

# 정규화
# LSTM 신경망은 data가 -1~1 사이의 값을 갖고 있어야 한다.
import numpy as np

data_dn = (data - np.mean(data))/np.std(data)/5

ShowMeDrawData(data_dn)

 

data를 -1~1 사이로 정규화 한다.

기본 data

 

preprocessing data

Y

위와 동일

train/test

# data 정제
# 한 data당 12point로 data를 갖고 온다.
x, y = getXy(data_dn, D=12)

# train, Test 나누기
from sklearn import model_selection
x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.2, random_state=42)

print(x_train.shape, y_train.shape) #(104, 12, 1) (104,)
print(x_test.shape,  y_test.shape)  #(26, 12, 1) (26,)

 

3. 학습

# model 만들기
from keras import layers
from keras.layers import LSTM, Dense
from keras.models import Model

shape = x_train.shape[1:]
m_x = layers.Input(shape=shape) # 12
m_h = layers.LSTM(10)(m_x)
m_y = layers.Dense(1)(m_h)
model   = Model(m_x, m_y)

model.compile('adam', 'mse')
model.summary()

history = model.fit(x_train, y_train,
                    epochs=400,
                    validation_data=(x_test, y_test), verbose=2)

ShowMeDrawLoss(history)

pred = model.predict(x_test)

ShowMeDrawpred(y_test, pred)

LSTM을 활용하며 optimizer는 adam이고 loss 평가는 mse이다.

Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 12, 1)             0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 10)                480       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 11        
=================================================================
Total params: 491
Trainable params: 491
Non-trainable params: 0
_________________________________________________________________

Process finished with exit code 0

 

 

 

4. 표시

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

def ShowMeDrawData(data):
    plt.plot(data)
    plt.show()

def ShowMeDrawLoss(history):
    loss     = history.history['loss']
    val_loss = history.history['val_loss']

    size = len(loss)

    plt.plot(range(size), loss, 'bo')
    plt.plot(range(size), val_loss, 'r+')
    plt.show()

def ShowMeDrawpred(r, p):

    size = len(r)

    plt.plot(range(size), r, 'bo')
    plt.plot(range(size), p, 'r+')
    plt.show()

pycharm의 경우 plt가 안뜨는 경우가 있어서 아래와 같이 미리 선언해줘야 한다.

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

 

예측 비교

실제와 예측을 비교한 그림이다.

Comments