import numpy as np
import tensorflow as tf
import matplotlib as mpl
import pandas as pd
from matplotlib import pyplot as plt
HIDDEN_SIZE =128
NUM_LAYERS=2
TIMESTEPS=10
TRAINING_STEPS=10000
BATCH_SIZE=60
def generate_data(seq):
x=[]
y=[]
for i in range(len(seq)-TIMESTEPS):
x.append([seq[i:i+TIMESTEPS]])
y.append([seq[i+TIMESTEPS]])
return np.array(x,dtype=np.float32),np.array(y,dtype=np.float32)
def lstm_model(x,y,is_training):
lstm_cell=tf.nn.rnn_cell.BasicLSTMCell
cell=tf.nn.rnn_cell.MultiRNNCell([lstm_cell(HIDDEN_SIZE) for _ in range(NUM_LAYERS)])
'''
cell=tf.nn.rnn_cell.MultiRNNCell(
[tf.nn.rnn_cell.DropoutWrapper(lstm_cell(HIDDEN_SIZE))
for _ in range(NUM_LAYERS)])
'''
outputs,_=tf.nn.dynamic_rnn(cell,x,dtype=tf.float32)
output=outputs[:,-1,:]
predictions=tf.contrib.layers.fully_connected(output,1,activation_fn=tf.nn.relu)
if not is_training:
return predictions,None,None
loss=tf.losses.mean_squared_error(labels=y,predictions=predictions)
train_op=tf.contrib.layers.optimize_loss(loss,tf.train.get_global_step(),optimizer="Adam",learning_rate=0.01)
return predictions,loss,train_op
def train(sess,train_x,train_y):
ds=tf.data.Dataset.from_tensor_slices((train_x,train_y))
ds=ds.repeat().shuffle(1000).batch(BATCH_SIZE)
x,y=ds.make_one_shot_iterator().get_next()
with tf.variable_scope("model"):
predictions,loss,train_op=lstm_model(x,y,True)
sess.run(tf.global_variables_initializer())
for i in range(TRAINING_STEPS):
_,l=sess.run([train_op,loss])
if i%100==0:
print("train step:"+str(i)+", loss:"+str(l))
def run_eval(sess,test_X,test_y):
ds=tf.data.Dataset.from_tensor_slices((test_X,test_y))
ds=ds.batch(1)
x,y=ds.make_one_shot_iterator().get_next()
with tf.variable_scope("model",reuse=True):
prediction,_,_=lstm_model(x,[0.0],False)
predictions=[]
labels=[]
for i in range(200):
p,l=sess.run([prediction,y])
predictions.append(p)
labels.append(l)
predictions=np.array(predictions).squeeze()
labels=np.array(labels).squeeze()
rmse=np.sqrt(((predictions-labels)**2).mean(axis=0))
print("Mean Square Error is %f" % rmse)
plt.figure()
plt.plot(predictions,label='predictions')
plt.plot(labels,label='real')
plt.legend()
plt.show()
f=open('IBM.csv')
df=pd.read_csv(f)
seq=df.iloc[:,1].values
train_data=seq[2:504]
test_data=seq[505:750]
train_x,train_y=generate_data(train_data)
test_x,test_y=generate_data(test_data)
with tf.Session() as sess:
train(sess,train_x,train_y)
run_eval(sess,test_x,test_y)