如何在 Keras 中建模卷积循环网络 (CRNN)
Posted
技术标签:
【中文标题】如何在 Keras 中建模卷积循环网络 (CRNN)【英文标题】:How to model Convolutional recurrent network ( CRNN ) in Keras 【发布时间】:2018-06-29 14:26:14 【问题描述】:我试图将 CRNN 模型移植到 Keras。
但是,我在将 Conv2D 层的输出连接到 LSTM 层时卡住了。
CNN 层的输出将具有 (batch_size, 512, 1, width_dash) 的形状,其中第一个取决于 batch_size,最后一个取决于输入的输入宽度(此模型可以接受变量宽度输入)
例如:形状为 [2, 1, 32, 829] 的输入结果输出形状为 (2, 512, 1, 208)
现在,按照Pytorch model,我们必须先执行 squeeze(2),然后执行 permute(2, 0, 1) 它会产生一个形状为 [208, 2, 512 ]
的张量我试图用 Keras 来实现,但我没能做到,因为在 Keras 中,我们无法更改 keras.models.Sequential 模型中的 batch_size 维度
有人可以指导我如何将此模型的上述部分移植到 Keras 吗?
Current state of ported CNN layer
【问题讨论】:
更新:Successfully ported Pytorch 模型进入 Keras,我能够使用 Keras-js 在 Web 浏览器中运行经过训练的模型。 【参考方案1】:您不需要在 Keras 中置换批处理轴。在 pytorch 模型中,您需要这样做,因为 pytorch LSTM 需要输入形状 (seq_len, batch, input_size)
。然而在 Keras 中,LSTM
层需要(batch, seq_len, input_size)
。
因此,在定义 CNN 并挤出轴 2 之后,您只需要置换最后两个轴即可。举个简单的例子('channels_first'
Keras 图像格式),
model = Sequential()
model.add(Conv2D(512, 3, strides=(32, 4), padding='same', input_shape=(1, 32, None)))
model.add(Reshape((512, -1)))
model.add(Permute((2, 1)))
model.add(LSTM(32))
您可以使用model.summary()
验证形状:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_4 (Conv2D) (None, 512, 1, None) 5120
_________________________________________________________________
reshape_3 (Reshape) (None, 512, None) 0
_________________________________________________________________
permute_4 (Permute) (None, None, 512) 0
_________________________________________________________________
lstm_3 (LSTM) (None, 32) 69760
=================================================================
Total params: 74,880
Trainable params: 74,880
Non-trainable params: 0
_________________________________________________________________
【讨论】:
你能看看this question 如果 input_shape 是 (1, 3, 28) 有含义(通道、时间步、特征),那么卷积的输出将是 (512, channels, 3, 28)?跨度>以上是关于如何在 Keras 中建模卷积循环网络 (CRNN)的主要内容,如果未能解决你的问题,请参考以下文章