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 是自动编码器的一部分,所以不确定这种重塑是否有助于我的事业。将首先尝试重塑,然后使用ConvLSTM2D
和TimeDistributed
层。感谢您的回答。
重塑需要时间???这听起来不太好……不过,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的主要内容,如果未能解决你的问题,请参考以下文章