lstm的tensorflow实现
多变量输入(通过输入五个点(二维,x,y),预测第十个点),我是在jupyter notebook上实现的,如果想在pycharm上运行,需要稍作修改。
读取的excel文件是n行2列的连续点,另外,还有python和c++的lstm实现(通过加载训练好的权重进行预测)在我其他博客里,整个项目可以去我github下载。

#!/usr/bin/env python
# coding: utf-8
# In[108]:
import numpy
import matplotlib.pyplot as plt
from pandas import read_csv,read_excel
import math
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import TimeDistributed
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
import tensorflow as tf
import os
#os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
#os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
# In[109]:
dataframe = read_excel('./data-lstm/lstm1.xlsx', usecols=[0,1], skipfooter=3)
dataset = dataframe.values
# 将整型变为float
dataset = dataset.astype('float32')
# In[110]:
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
predict_len = 5
for i in range(len(dataset)-look_back-1 -predict_len):
a = dataset[i:(i+look_back), 0:2]
dataX.append(a)
dataY.append(dataset[i +look_back + predict_len , 0:2])
return numpy.array(dataX), numpy.array(dataY)
# In[111]:
# fix random seed for reproducibility
numpy.random.seed(7)
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
# split into train and test sets
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:2], dataset[train_size:len(dataset),:2]
# use this function to prepare the train and test datasets for modeling
look_back = 5
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# In[100]:
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(10, input_shape=(look_back,2)))
model.add(Dense(2))
model.compile(loss='mean_squared_error', optimizer='adam')
# In[101]:
print(trainX.shape)
#trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1]),2)
#testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1]),2)
#print(trainX.shape)
# In[112]:
#model = tf.keras.models.load_model(r'C:\Users\gj7520\Desktop\pythob_files\lstm\lstm2\lstm1_best2.h5')
# In[102]:
callbacks = [
tf.keras.callbacks.ModelCheckpoint('./models/lstm.pbtxt',
monitor='loss',
save_best_only=True)]
model.fit(trainX, trainY, epochs=50, batch_size=1, verbose=2)
model.save(r'C:\Users\gj7520\Desktop\pythob_files\lstm\lstm2\lstm1.h5')
model.save('./data-lstm/lstm2.pbtxt')
# In[103]:
model.save_weights('lstm.ckpt')
# In[113]:
# make predictions
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform(trainY)
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform(testY)
# In[114]:
plt.plot(testY)
plt.plot(testPredict)
plt.show()
# In[115]:
# shift train predictions for plotting
predict_len=5
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+predict_len, :] = trainPredict
# shift test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+(predict_len*2)+1:len(dataset)-1, :] = testPredict
# In[116]:
# plot baseline and predictions
plt.plot(scaler.inverse_transform(dataset))
#plt.plot(dataset)
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()