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

har*_*704 5 lstm keras recurrent-neural-network pytorch

我试图将CRNN模型移植到 Keras。

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

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

例如:形状为[2, 1, 32, 829]的输入产生形状为(2, 512, 1, 208) 的输出

现在,根据Pytorch 模型,我们必须执行挤压 (2)permute(2, 0, 1) 它将产生一个形状为 [208, 2, 512] 的张量

我试图实现这是 Keras,但我无法做到这一点,因为在 Keras 中,我们无法更改keras.models.Sequential模型中的batch_size 维度

有人可以指导我如何将这个模型的一部分移植到 Keras 吗?

移植 CNN 层的当前状态

Yu-*_*ang 6

您不需要在 Keras 中置换批处理轴。在 pytorch 模型中,您需要这样做,因为 pytorch LSTM 需要输入 shape (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))
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法验证形状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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)