卡拉斯,lstm中的输入/输出形状卡住了

时间:2018-01-22 06:16:08

标签: python machine-learning keras artificial-intelligence lstm

我正在尝试使用lstm训练能量需求的时间序列。我使用了时间戳并得到了结果,但是对于这个实验,我试图将日期时间分成几天,一个月,一年,几小时。因此,在分割数据后,我的csv文件看起来像这样

timestamp     | day | month | year | hour | demand
01-07-15 1:00 |  1  |   7   | 2015 |   1  | 431607

我使用keras进行LSTM(我对它很新)。我到目前为止编写了以下代码。

from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error

dataframe = read_csv('patched_data_sorted.csv', engine='python')
dataset = dataframe.values
trainX = dataset[:, 1:5]
sampleSize = len(trainX)
trainX = trainX.reshape(1, len(trainX), 4)
trainY = dataset[:, 5]
trainY = trainY.reshape(1, len(trainY))
print(trainY)

# print(trainX)

model = Sequential()
model.add(LSTM(4, input_shape=(sampleSize, 4)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
trainPredict = model.predict(trainX)
print(trainPredict)

但我收到此错误

ValueError: Error when checking target: expected dense_1 to have shape (None, 1) but got array with shape (1, 20544)

我不确定为什么会这样,但我认为我没有正确地重塑。

1 个答案:

答案 0 :(得分:0)

在您的数据中,您有序列的每个时间步的标签。您当前的网络设置为只有一个标签用于整个序列。

要获得每个时间步的输出,您需要将return_sequences=True添加到LSTM并将Dense图层包裹在TimeDistributed图层中,以便在每个时间步都应用它。

model = Sequential()
model.add(LSTM(4, input_shape=(sampleSize, 4), return_sequences=True))
model.add(TimeDistributed(Dense(1)))