Keras - 将 3 通道图像输入 LSTM

Posted

技术标签:

【中文标题】Keras - 将 3 通道图像输入 LSTM【英文标题】:Keras - Input a 3 channel image into LSTM 【发布时间】:2018-05-20 04:24:01 【问题描述】:

我已将一系列图像读入一个形状为(7338, 225, 1024, 3) 的numpy 数组,其中7338 是样本大小,225 是时间步长,1024 (32x32) 是平面图像像素,在3 通道中( RGB)。

我有一个带有 LSTM 层的顺序模型:

model = Sequential()
model.add(LSTM(128, input_shape=(225, 1024, 3))

但这会导致错误:

Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4

documentation 提到 LSTM 层的输入张量应该是 3D tensor with shape (batch_size, timesteps, input_dim),但在我的情况下,我的 input_dim 是 2D。

在 Keras 中将 3 通道图像输入到 LSTM 层的建议方法是什么?

【问题讨论】:

你试过给 input_shape=X_train.shape[1:] 。假设 X_train 是您的输入数组 是的,我有。 X_train.shape[1:] 给了我(225, 1024, 3) 这是硬编码为input_shape 参数 【参考方案1】:

如果您希望图像的数量是一个序列(如带帧的电影),则需要将像素和通道作为特征:

input_shape = (225,3072)  #a 3D input where the batch size 7338 wasn't informed

如果您希望在将 3072 个特征投入 LSTM 之前进行更多处理,您可以组合或交错 2D 卷积和 LSTM 以获得更精细的模型(但不一定更好,每个应用程序都有其特定的行为)。

你也可以尝试使用新的ConvLSTM2D,它将接受五维输入:

input_shape=(225,32,32,3) #a 5D input where the batch size 7338 wasn't informed

在添加TimeDistributed(Flatten()) 和最后的LSTM() 之前,我可能会创建一个包含多个TimeDistributed(Conv2D(...))TimeDistributed(MaxPooling2D(...)) 的卷积网络。这很可能会提高你对图像的理解和 LSTM 的性能。

【讨论】:

我想过将我的数据从(1024, 3) 重塑为3072,但我已经拥有7338 的批量数据,并且重塑需要很多时间。 LSTM 是自动编码器的一部分,所以不确定这种重塑是否有助于我的事业。将首先尝试重塑,然后使用ConvLSTM2DTimeDistributed 层。感谢您的回答。 重塑需要时间???这听起来不太好……不过,LSTM 会非常非常慢…… 是的,我认为这是因为我将重塑 1651050 (7738*225) 实例。所以,我没有一起做,而是使用了fit_generator() 的 Keras 模型方法,在训练时我创建了一个生成器方法来重塑数据集。【参考方案2】:

现在在 keras 指南中提供了如何使用嵌套结构创建 RNN 的指南,该指南为每个时间步启用任意输入类型:https://www.tensorflow.org/guide/keras/rnn#rnns_with_listdict_inputs_or_nested_inputs

【讨论】:

以上是关于Keras - 将 3 通道图像输入 LSTM的主要内容,如果未能解决你的问题,请参考以下文章

如何为二维数据构建LSTM网络?

具有任意数量输入通道(超过 RGB)的卷积神经网络架构

CNN-LSTM图像分类

Keras 的频道优先?

Keras CNN-LSTM:制作 y_train 时出错

用Keras生成面部Python实现