【问题标题】:Stuck with input/output shapes in keras, lstm卡在 keras、lstm 中的输入/输出形状
【发布时间】:2018-06-30 17:35:41
【问题描述】:

我正在尝试使用 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)

我不确定为什么会发生这种情况,但我认为我没有正确重塑。

【问题讨论】:

  • 为什么trainX有3维。你为什么要把trainY改成.reshape(1, len(trainY))
  • 因为 lstm 需要 3d 形状数组(样本、时间步长、特征)。并且对于输出形状应该有相同的样本数
  • 在这种情况下,为什么要在代码中保留 1 代替样本,而 sampleSize 代替时间步长
  • 我在关注这个帖子machinelearningmastery.com/…

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多