如何在 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)的主要内容,如果未能解决你的问题,请参考以下文章

CRNN文本识别网络

keras中卷积的两种padding方式

如何在keras中可视化卷积神经网络中间层的输出?

关于keras构建的神经网络的输出结果解释

如何在 keras 中拥有并行卷积层?

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别