如何在Keras

时间:2018-01-20 13:02:41

标签: keras lstm recurrent-neural-network pytorch

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

但是,在将Conv2D层的输出连接到LSTM层时,我遇到了困难。

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

例如:形状为 [2,1,22,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

1 个答案:

答案 0 :(得分:4)

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