如何在 Keras 中对卷积循环网络 ( CRNN ) 建模

How to model Convolutional recurrent network ( CRNN ) in Keras

我正在尝试将 CRNN 模型移植到 Keras。

但是,我在将 Conv2D 层的输出连接到 LSTM 层时卡住了。

CNN 层的输出将具有 ( batch_size, 512, 1, width_dash) 的形状,其中第一个取决于 batch_size,最后一个取决于input的输入宽度(该模型可以接受可变宽度输入)

例如:形状为 [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 维度35=] 型号

有人可以指导我如何将此模型的上述部分移植到 Keras 吗?

Current state of ported CNN layer

您不需要在 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
_________________________________________________________________