Модель Encoder-Decoder: Keras ValueError: Размеры должны быть одинаковыми в последнем плотном слое декодера - PullRequest
0 голосов
/ 04 марта 2020

Я работаю над прототипом модели кодировщика-декодера для проекта чат-бота, и у меня возникает следующая ошибка:

ValueError: Dimensions must be equal, but are 31 and 400001 for 'loss/dense_11_loss/mul' (op: 'Mul') with input shapes: [?,31], [?,31,400001].

Вот код для модели:

# the encoder
encoder_inputs = tf.keras.Input(shape=(None, ))
# the embedding layer for the encoder (max_sequence_length = 30)
encoder_embedder = tf.keras.layers.Embedding(input_dim=400001, output_dim=200, weights=[emb_matrix], input_length=30,
                                                trainable=False)
encoder_embeddings = encoder_embedder(encoder_inputs)
encoder = tf.keras.layers.LSTM(128, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_embeddings)
encoder_states = [state_h, state_c]

# the decoder
decoder_inputs = tf.keras.Input(shape=(None, ))
# the embedding layer for the decoder (max_sequence_length = 31)
decoder_embedder = tf.keras.layers.Embedding(input_dim=400001, output_dim=200, weights=[emb_matrix], input_length=31,
                                               trainable=False)
decoder_embeddings = decoder_embedder(decoder_inputs)
decoder_lstm = tf.keras.layers.LSTM(128, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_embeddings, initial_state=encoder_states)
decoder_dense = tf.keras.layers.Dense(400001, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit([encoder_input_data, 
           decoder_input_data],
           decoder_target_data,
           batch_size=32,
           epochs=2)

где входные массивы имеют следующие формы:

encoder_input_data: (num_of_sentences, 30)
decoder_input_data: (num_of_sentences, 31)
decoder_target_data: (num_of_sentences, 31)

Каждое предложение в decoder_input_data имеет <s>, добавленное к его началу, и каждое предложение в decoder_target_data имеет <e>, добавляемое в конец этого Следовательно, максимальная длина последовательности для decoder_input_data и decoder_target_data равна 31, тогда как для encoder_input_data.
она равна 30. Как вы можете ожидать, каждая строка в этих массивах представляет собой список индексов, сопоставляемых с соответствующие слова в словаре.

Размер словаря 400001 и размерность вектора вложения 200 (я использую вложения GloVe)

Матрица вложения имеет Следующая форма:

emb_matrix: (400001, 200)

Любые предложения будут оценены. Спасибо.

...