我试图将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上吗?
答案 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
_________________________________________________________________