keras中用于文本分类的卷积2d的尺寸错误

时间:2018-06-22 23:28:15

标签: keras nlp lstm rnn convolutional-neural-network

我的输入形状是10000x500的文本文档。 10000代表文档数,500代表单词数。

我想做的是为kera的嵌入提供文本,然后是BLSTM,然后是Conv2D,然后是2Dpooling,展平,最后是一个完全连接的密集层。

架构如下所示:

inp = Input(shape=(500,))
x = Embedding(max_features=10000, embed_size=100)(inp)
x = Bidirectional(CuDNNLSTM(50, return_sequences=True))(x)
x = Conv2D(filters=128, kernel_size=(3, 3), input_shape=(100,500,1))(x)
x = MaxPooling2D()(x)
x = Flatten()(x)
x = Dense(1, activation="sigmoid")(x)

嵌入的输出形状为(None,500,100) BLSTM隐藏状态的输出形状为(None,500,100)。 我希望Conv2D从BLSTM的隐藏层中提取局部特征。但是,我遇到尺寸差异错误。

ValueError: Input 0 is incompatible with layer conv2d_8: expected ndim=4, found ndim=3

我在When bulding a CNN, I am getting complaints from Keras that do not make sense to me.处尝试过一种解决方案,但仍然收到错误消息。

1 个答案:

答案 0 :(得分:2)

您有两个选择:

a)通过在Conv2D上添加尺寸,将rows=100cols=500channels=1x结合使用:

x = Lambda(lambda t: t[..., None])(x)
x = Conv2D(filters=128, kernel_size=(3, 3), input_shape=(100,500,1))(x)

b)将Conv1Dsteps=100input_dim=500一起使用,并使用MaxPooling1D

x = Conv1D(filters=128, kernel_size=3, input_shape=(100, 500))(x)
x = MaxPooling1D()(x)
x = Flatten()(x)