首页 > 解决方案 > 带有 keras 的 CNN:输入 0 与 flatten_2 层不兼容:预期 min_ndim=3,发现 ndim=2

问题描述

输入 0 与 flatten_2 层不兼容:预期 min_ndim=3,发现 ndim=2

我不明白这个错误是我的模型

    L_branch = Sequential()
    L_branch.add(Embedding(vocab_size, output_dim=15, input_length=3000, trainable=True))
    L_branch.add(Conv1D(50, activation='relu', kernel_size=70, input_shape=(3000, )))
    L_branch.add(MaxPooling1D(15))
    L_branch.add(Flatten())

    # second model
    R_branch = Sequential()
    R_branch.add(Dense(14, input_shape=(14,), activation='relu'))
    R_branch.add(Flatten())

    merged = Concatenate()([L_branch.output, R_branch.output])
    out = Dense(70, activation='softmax')(merged)

    final_model = Model([L_branch.input, R_branch.input], out)
    final_model.compile(
                loss='categorical_crossentropy',
                optimizer='adam',
                metrics=['accuracy'])
    final_model.summary()
    final_model.fit(
            [input1, input2],
            Y_train,
            batch_size=200,
            epochs=1,
            verbose=1,
            validation_split=0.1
        )

其中输入 1 的形状为 (5039, 3000)

并输入 2 (5039, 14)

那么为什么扁平密集需要第三维呢?如果密集不改变嵌入层或卷积等维度的数量?

标签: kerasconv-neural-network

解决方案


删除 Flatten 层...无需使用它。这里是完整的结构

L_branch = Sequential()
L_branch.add(Embedding(vocab_size, output_dim=15, input_length=3000, trainable=True))
L_branch.add(Conv1D(50, activation='relu', kernel_size=70, input_shape=(3000, )))
L_branch.add(MaxPooling1D(15))
L_branch.add(Flatten())

# second model
R_branch = Sequential()
R_branch.add(Dense(14, input_shape=(14,), activation='relu'))

merged = Concatenate()([L_branch.output, R_branch.output])
out = Dense(70, activation='softmax')(merged)

final_model = Model([L_branch.input, R_branch.input], out)
final_model.compile(
            loss='categorical_crossentropy',
            optimizer='adam',
            metrics=['accuracy'])
final_model.summary()

推荐阅读