상세 컨텐츠

본문 제목

[python] LSTM 예제 코드

카테고리 없음

by Deep python 2020. 6. 4. 23:41

본문

python lstm 예제 코드 

from keras.layers import Input, Dense, Reshape, LSTM, Dropout
from keras.models import Model, Sequential, load_model
from keras.optimizers import Adam
from keras import losses
from keras.callbacks import ModelCheckpoint, LearningRateScheduler, TensorBoard, CSVLogger
#from tensorboardX import SummaryWriter
import tensorflow as tf
import keras
import matplotlib.pyplot as plt
from data_processing_single_lstm_new_data import *

import numpy as np
import pandas as pd
import sys
import os

def dataset_length_by_day(data, p): #only for dataset, not for label data
data = np.transpose(data.values)[1:]
if p != 1:
data = np.delete(data, slice(-(p-1),len(data)), axis=0)
return data

def LSTM_Network(X_train, Y_train, X_val, Y_val, X_test, Y_test, N, loss='l2',lam=0.): # X : data, Y : label, M : day, N : input dimension(288)
M = int(see_day)

N_batch = 500
N_epoch = 2000
Drop_rate = 0.5

print(X_train.shape)
X_train = X_train.reshape(X_train.shape[0], M, N)
print(X_train.shape[0], X_train.shape[1])
X_val = X_val.reshape(X_val.shape[0], M, N)
X_test = X_test.reshape(X_test.shape[0], M, N)

#realtest = realtest.reshape(realtest.shape[1], M, N)

print(len(X_train), len(Y_train),len(X_val), len(Y_val),len(X_test), len(Y_test))

loss = 'mae' if loss == 'l1' else 'mse'

In = Input(shape=(M,N))

lstm_hidden1 = LSTM(5, trainable=True, name='fix0')(In)

lstm_hidden1 = Dense(32, trainable=True, name='fix1')(lstm_hidden1)
lstm_hidden1 = Dense(32, activation='relu', trainable=True, name='fix2')(lstm_hidden1)
lstm_hidden1 = Dense(32, activation='relu', trainable=True, name='fix3')(lstm_hidden1)
lstm_hidden1 = Dense(32, activation='relu', trainable=True, name='fix4')(lstm_hidden1)


output = Dense(1, name='output')(lstm_hidden1)

model = Model(input=In, outputs=output)

#model.load_weights('./lstm_model/weights/20x5lstm/weights.h5', by_name=True)
#model = load_model('./lstm_model/weights/100x15lstm/weights00259.hdf5')

#/home/finance/GE/Posco/lstm_model/weights/100x15lstm/weights00259.hdf5
#/home/finance/GE/Posco/lstm_model/weights/50x4lstm/weights0000.hdf5
#/home/finance/GE/Posco/lstm_model/weights/50x15lstm/weights0158.hdf5
model.compile(optimizer='adam', loss= loss)

# adjust learning rate
lrList = []
def step_decay(epoch):
    lrate = 0.01
    if epoch >= 1000:
        lrate = 0.0005
    elif epoch >= 3000:
        lrate = 0.00006
    elif epoch >= 8000:
        lrate = 0.00006
    elif epoch >= 92400:
        lrate = 0.00001
    elif epoch >= 4300:
        lrate = 0.000001
    #elif epoch >= 600:
    #    lrate = 0.0001
    lrList.append(lrate)
    return lrate
lr = LearningRateScheduler(step_decay)
csv_logger = CSVLogger("./plt/train_loss.csv")

#save weights
save_dir = './lstm_model/weights/'+str(see_day)+'x'+str(predict_day)+'lstm'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)
checkpoint = ModelCheckpoint(''+save_dir+'/weights{epoch:04d}.hdf5', save_best_only=True)

checkpoint = ModelCheckpoint(''+save_dir+'/weights.{epoch:04d}.h5', save_best_only=True)

#model.save_weights(''+save_dir+'/weights.{epoch:04d}.h5')
tb = TensorBoard(log_dir='./lstm_model/logs/'+str(see_day)+'x'+str(predict_day), histogram_freq=0, write_graph=True, write_images=False)

callbacks_list = [checkpoint, lr, tb, csv_logger]

history = model.fit(X_train, Y_train, batch_size=N_batch, epochs=N_epoch, validation_data=(X_test, Y_test), callbacks=callbacks_list)

predict_x = model.predict(X_val, batch_size=1, verbose=0)


y_vloss=history.history['val_loss']
y_loss = history.history['loss']

#print(model.summary())
#for i in range(len(X_train)-300):
#    print(",",i, predict_x[i][0], Y_train[i], predict_x[i][0]-Y_train[i],",")

#predict_val = model.predict(X_val, batch_size=1, verbose=0)

#for i in range(len(X_val)):
#    print (",",i, predict_val[i][0], Y_val[i], predict_val[i][0]-Y_val[i],",")



predict = model.predict(X_test, batch_size=1, verbose=0)
#print(X_test.shape)
#print("%%%%%%%%%%%%%%%%%%%%")
#print(realtest.shape)
a = 0
#for i in range(len(X_test)):
#    print (",",i, predict[i][0], Y_test[i], predict[i][0]-Y_test[i],",")
#if i == len(X_test)-1 :
#    print(X_test[i])

score1 = model.evaluate(X_train, Y_train, verbose=0)
score2 = model.evaluate(X_val, Y_val, verbose=0)
score3 = model.evaluate(X_test, Y_test, verbose=0)

print (score1, score2, score3)

#predict1 = model.predict(realtest, batch_size=1, verbose=0)

plt.figure(figsize = (12,12))
plt1=plt.subplot(311)
plt1.plot(Y_val,color="red", label='Price')
plt1.plot(predict_x,color="blue", label='Train')
plt1.legend(loc='upper right') 
plt1.grid(True)
plt2=plt.subplot(312)
plt2.plot(Y_test,color="red", label='Price')
plt2.plot(predict,color="blue", label='Test') 
plt2.legend(loc='upper right') 
plt2.grid(True)
plt3=plt.subplot(313)
plt3.plot(y_vloss[100:],color="red", label='Val_loss')
plt3.plot(y_loss[100:],color="blue", label='Train_loss') 
plt3.legend(loc='upper right') 
plt3.grid(True)


plt.savefig("./plt/"+"fffffffff"+"1.png")
plt.close()




#print ("Predict!! %s weeks later Iron price : %s " % (predict_day, predict1))
#print ("Predict!! %s weeks later Iron price : %s " % (predict_day, predict1))

def main():

#global writer_lstm

TrainLoss = -1
ValLoss = -1

#load data
#trainset, valset, trainlabel, vallabel = get_csv_data(see_day, predict_day)
dataset = getData(see_day, predict_day, N) #472 x 10 x 2
labelset = getLabelData(see_day, predict_day)
#realtestdata = getRealTest(see_day, predict_day)
#print(labelset)
#print dataset.shape

# Trainset : 70%, Validationset : 20%, Testset : 10%
train_ratio = 2050-see_day   # 2009/06/01 - 2015/10/09
val_ratio = 0      # 2015/10/05 - 2017/07/28
#test_ratio = int(0.1*len(dataset))    # 2017/07/24 - 2018/06/22
trainset = dataset[:train_ratio]
valset = dataset[:]
testset = dataset[train_ratio+val_ratio:]

trainlabel = labelset[:train_ratio]
#print(trainlabel)
vallabel = labelset[:]
testlabel = labelset[train_ratio+val_ratio:]

#realtest = realtestdata[:]

#print realtest

#print trainset.shape, trainlabel.shape
#print valset.shape, vallabel.shape
#print testset.shape, testlabel.shape

#start training
#writer_lstm = SummaryWriter('./lstm_model/logs/'+str(see_day)+'x'+str(predict_day))
#print (trainset)
#print (trainlabel)
#print (valset)
#print (vallabel)
LSTM_Network(trainset, trainlabel, valset, vallabel, testset, testlabel, N)
#TrainLoss, ValLoss, Model = LSTM_Network(trainset, trainlabel, valset, vallabel)

#export to excel
#from openpyxl import load_workbook, Workbook
#wb = load_workbook(filename='loss.xlsx')
#sheetList = wb.get_sheet_names()
#ws = wb.get_sheet_by_name(sheetList[0])

#row = 3+sidx*16
#col = 2+pidx*7
#ws.cell(row=row+int(n_model)-1, column=col).value = TrainLoss
#ws.cell(row=row+int(n_model)-1, column=col+1).value = ValLoss

#wb.save('loss.xlsx')  

if name == "main":

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.90)

# Init session
session = tf.InteractiveSession(config=tf.ConfigProto(gpu_options=gpu_options))
keras.backend.set_session(session)
global see_day
global predict_day
#global n_model

#n_model = sys.argv[1]
#n_hidden = int(sys.argv[2]) # hidden layer num of features
#s_idx = int(sys.argv[3])-1
#p_idx = int(sys.argv[4])-1

#see_day_list = ['1', '3', '5', '10']
#predict_day_list = ['1', '3', '5', '10']
#see_day = see_day_list[s_idx]
#predict_day = predict_day_list[p_idx]
see_day = 100             # day
predict_day = 5          # week
N = 4

#main(s_idx, p_idx)
main()

댓글 영역