CNN с keras: вход 0 несовместим со слоем flatten_2: ожидалось min_ndim = 3, найдено ndim = 2 - PullRequest
1 голос
/ 19 июня 2020

Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found 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)

, так почему же плоская плотность требует третьего измерения? если плотный, не менять количество измерений, таких как слой встраивания или свертка?

1 Ответ

1 голос
/ 19 июня 2020

удалить Flatten layer ... не нужно его использовать. здесь полная структура

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()
...