使用keras的LSTM

时间:2019-07-09 12:06:58

标签: python keras time-series lstm

使用带有Python的Keras库的LSTM尝试预测家庭的热水消耗情况。观看了一些教程并参加了Udemy课程,但没有找到对您有太大帮助的课程(建议多加推荐)。由于这只是一次问题,所以我真的不想阅读有关这方面的书籍,这就是为什么我希望我可以依靠SO专家的帮助。任务:

输入的结果是大约1,5年的耗电量,分辨率为1分钟。我将此配置文件放入csv,并将其命名为“ labels.csv”。 顾名思义,第二个csv包含“ features.csv”,其中包含最重要的功能:一天中的分钟,一天中的小时,一周中的一天。这个想法是,通常在工作日的上午6点至上午8点至下午6点至晚上8点之间以及周末稍晚一些才进行消费。其他影响因素(如假期,一年中的月份等)均被忽略。输出应为下一周的消费概况,即10080行。

首先,我导入相关模型并上传csv文件。

import pandas as pd
import plotter
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense

features = pd.read_csv('features.csv')
labels = pd.read_csv('labels.csv')

然后我将其分为训练和测试集:

x_train, x_test, y_train, y_test = train_test_split(features,labels,test_size=0.2)

现在,我定义我的模型。

model = Sequential()

现在,我添加了图层(我仍然不知道如何确定应该取多少层以及应该取多少层,但是我可以通过尝试并发现错误。):

model.add(LSTM(24,activation='relu',input_shape=(1,3)))
model.add(Dense(1))

按如下方式编译模型:

model.compile(loss='mse', optimizer="adam")

最后,拟合模型:

model.fit(x_train,y_train,epochs=60,verbose=2)

执行最后一行会产生错误:

Traceback (most recent call last):
  File "/home/bruno/Desktop/Python Projects/lstm_dhw_data2/lstm.py", line 24, in <module>
    model.fit(x_train,y_train,epochs=60,verbose=2)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training.py", line 751, in _standardize_user_data
    exception_prefix='input')
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (838860, 3)

所以我什至都不去...

results=model.predict(x_test)

print(results)

如果任何人都可以指出我做错了什么,请将我指向一个合适的(新手可理解的)教程,或者将我指向一个可以回收的类似项目-我将不胜感激:)

我将项目添加到了GitHub

编辑:即使

,我也会收到很多弃用警告
pip install --upgrade tensorflow

返回所有内容都是最新的...

1 个答案:

答案 0 :(得分:1)

唯一遗漏的是,在时间序列中,您需要为模型输入序列。因此,您的输入应具有以下形状[batch_size, lenght_sequence, n_features]。目前,我们可以认为您的数据集由一个大序列组成。因此,您应该调整数据集的形状,使其具有不止1个序列以适合模型。例如,使用来自keras(doc hereTimeseriesGenerator,您可以从数据集中创建长度为10的序列(或任何最适合您数据的参数),如下所示:

from keras.preprocessing.sequence import TimeseriesGenerator

sequence_length = 10

data_gen = TimeseriesGenerator(x_train, y_train,
                               length=sequence_length,
                               batch_size=16)

model = Sequential()
model.add(LSTM(24,activation='relu',input_shape=(sequence_length, 3)))
model.add(Dense(1))
model.compile(loss='mse', optimizer="adam")
model.fit_generator(data_gen)