如何修复 ValueError: Input 0 is incompatible with layer CNN: expected shape=(None, 35), found shape=(None, 31)

时间:2021-04-07 10:21:01

标签: python keras deep-learning

我正在使用卷积神经网络训练文本分类任务,使用 Keras、Conv1D。当我将下面的模型运行到我的多类文本分类任务时,出现如下错误。我花时间去理解错误,但我不知道如何修复它。有人可以帮我吗?

数据集和评估集形状如下:

df_train shape: (7198,)
df_val shape: (1800,) 

np.random.seed(42)
#You needs to reshape your input data according to Conv1D layer input format - (batch_size, steps, input_dim). Try


# set parameters of matrices and convolution
embedding_dim = 300
nb_filter = 64
filter_length = 5
hidden_dims = 32
stride_length = 1

from keras.layers import Embedding

embedding_layer = Embedding(len(tokenizer.word_index) + 1,
                            embedding_dim,
                            input_length=35,
                            name="Embedding")
inp = Input(shape=(35,), dtype='int32')
embeddings = embedding_layer(inp)



conv1 = Conv1D(filters=32,  # Number of filters to use
                    kernel_size=filter_length, # n-gram range of each filter.
                    padding='same',  #valid: don't go off edge; same: use padding before applying filter
                    activation='relu',
                    name="CONV1",
                    kernel_regularizer=regularizers.l2(l=0.0367))(embeddings)

conv2 = Conv1D(filters=32,  # Number of filters to use
                    kernel_size=filter_length, # n-gram range of each filter.
                    padding='same',  #valid: don't go off edge; same: use padding before applying filter
                    activation='relu',
                    name="CONV2",kernel_regularizer=regularizers.l2(l=0.02))(embeddings)

conv3 = Conv1D(filters=32,  # Number of filters to use
                    kernel_size=filter_length, # n-gram range of each filter.
                    padding='same',  #valid: don't go off edge; same: use padding before applying filter
                    activation='relu',
                    name="CONV2",kernel_regularizer=regularizers.l2(l=0.01))(embeddings)



max1 = MaxPool1D(10, strides=1,name="MaxPool1D1")(conv1)
max2 = MaxPool1D(10, strides=1,name="MaxPool1D2")(conv2)
max3 = MaxPool1D(10, strides=1,name="MaxPool1D2")(conv3)

conc = concatenate([max1, max2,max3])
flat = Flatten(name="FLATTEN")(max1)
....

错误如下:

ValueError: Input 0 is incompatible with layer CNN: expected shape=(None, 35), found shape=(None, 31)

模型:

Model: "CNN"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_19 (InputLayer)        [(None, 35)]              0         
_________________________________________________________________
Embedding (Embedding)        (None, 35, 300)           4094700   
_________________________________________________________________
CONV1 (Conv1D)               (None, 35, 32)            48032     
_________________________________________________________________
MaxPool1D1 (MaxPooling1D)    (None, 26, 32)            0         
_________________________________________________________________
FLATTEN (Flatten)            (None, 832)               0         
_________________________________________________________________
Dropout (Dropout)            (None, 832)               0         
_________________________________________________________________
Dense (Dense)                (None, 3)                 2499      
=================================================================
Total params: 4,145,231
Trainable params: 4,145,231
Non-trainable params: 0
_________________________________________________________________
Epoch 1/100

1 个答案:

答案 0 :(得分:1)

当您没有匹配网络的输入层形状和数据集的形状时,就会出现该错误。如果您收到这样的错误,那么您应该尝试:

  1. (None, 31) 处设置网络输入形状,使其与数据集的形状相匹配。
  2. 检查数据集的形状是否等于 (num_of_examples, 35)。(首选)

如果所有这些信息都正确并且数据集没有问题,则可能是网络本身的错误,其中两个相邻层的形状不匹配。