Keras LSTM 模型的 batch_input_shape

Posted

技术标签:

【中文标题】Keras LSTM 模型的 batch_input_shape【英文标题】:batch_input_shape for Keras LSTM model 【发布时间】:2019-05-09 10:10:31 【问题描述】:

我正在尝试使用 Keras 库(tensorflow 后端)构建一个以 LSTM 作为第一个隐藏层的神经网络。我无法理解如何使用 batch_input_size 参数重塑我的数据并将其提供给有状态的 LSTM。

我的输入是以 10 Khz 采样的 100 秒时间序列。所以基本上,我有 100*10000 个不同的时间值。我有 3 个不同的 observables 被采样,所以特征的数量是 3。让我们将 X 称为输入矩阵,其形状为:

np.shape(X) = (1000000,1,3)

我的目标每个时间点都有一个值 --> 100*10000 个值:

np.shape(Y) = (1000000,1,1)

我希望我的模型一次花费一秒钟,因此可以预测 10000 个目标值。我想这应该是 batch_size。目标值假设我想在LSTM层中放32个节点,这是我写的:

model_LSTM = Sequential()
model_LSTM.add(LSTM(32, stateful=True, batch_input_shape=(10000,1,3)))
model_LSTM.compile(optimizer=keras.optimizers.Adam(lr=0.00039, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False), loss='mean_squared_error')

为了适应模型,我一次喂它一批:

batch_size=10000
for i in range(int(X.shape[0] / batch_size)):
    X = X_l[(i * batch_size):((i + 1) * batch_size)][:][:]
    Y = Y_l[(i * batch_size):((i + 1) * batch_size)]
    model_hist = model_LSTM.fit(X, Y, epochs=1, 
                                batch_size=batch_size, 
                                verbose=1, shuffle=False)

我这样做正确吗?该脚本运行时没有错误,但在新集合上使用 model_LSTM.predict() 时,它只会为每个时间步输出相同的值。

【问题讨论】:

【参考方案1】:

您能否提供更多信息,例如准确性和成本? 因为它一直只预测一个类,所以你的模型没有学习。也许,您的数据集是倾斜的,导致没有学习的高精度。我建议修改超参数并尝试不同的模型,例如 SimpleRNNGRU

另外,既然你问了,我建议使用fit_generator 方法,因为它会减少一次又一次调用fit 的开销。

【讨论】:

我可能误解了你,但这是一个回归问题,而不是分类问题。我所拥有的是在每个时期计算的均方损失。 哦,我的错。 LSTM 要求 input_shape(batch_size, timesteps, input_dim)。所以你的输入形状应该是(1, 100*10000, 3)。此外,由于您没有指定 return_sequences LSTM 的输出是 (batch_size, units) 即。 (1, 32)。所以每个输入只有一个时间步长。

以上是关于Keras LSTM 模型的 batch_input_shape的主要内容,如果未能解决你的问题,请参考以下文章

LSTM 模型中 epoch 图中的损失跳跃 - keras

减小 Keras LSTM 模型的大小

使用 Keras,如何将 CuDNNLSTM 生成的权重加载到 LSTM 模型中?

Keras - 向 LSTM 模型添加注意机制 [重复]

keras 中的小型 LSTM 模型不适合我的 GPU

Keras LSTM 模型过拟合