Я работаю над прототипом модели кодировщика-декодера для проекта чат-бота, и у меня возникает следующая ошибка:
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)
Любые предложения будут оценены. Спасибо.