Я сделал модель декодера кодировщика с использованием фреймворка Keras для создания чат-бота. Я не могу найти никаких проблем с моей моделью, но при обучении ПОТЕРЯ составляет nan с самой первой эпохи, и точность остается нулевой.
Я пробовал код для разных размеров пакетов, разных скоростей обучения, разных оптимизаторов , но нет даже небольшого изменения выходных значений. Я даже попробовал обрезку градиента и регуляризацию, но никаких признаков улучшения не было. Результат, который дает модель, является полностью случайным.
Код принимает входные данные формы:
(BATCH, MAX_LENGTH) для ввода кодера -> Преобразовано в (BATCH, MAX_LENGTH, EMB_SIZE) путем внедрения слоя
(BATCH, MAX_LENGTH) для ввода декодера -> Преобразовано в (BATCH, MAX_LENGTH, EMB_SIZE) путем внедрения слоя
Форма вывода:
(BATCH, MAX_LENGTH, 1) для цели декодера (следовательно, потеря, которую я использую, это 'sparse_categorical_crossentropy')
Вот код моей модели:
# Define an input sequence and process it.
encoder_inputs = Input(name='encoder_input', shape=(None,))
encoder_embedding = Embedding(name='encoder_emb', input_dim=VOCAB_SIZE,
output_dim=EMB_SIZE,
weights=[embedding_matrix],
trainable=False,
input_length=MAX_LENGTH)(encoder_inputs)
encoder = LSTM(HIDDEN_DIM, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_embedding)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]
# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(name='decoder_input', shape=(None, ))
decoder_embedding = Embedding(name='decoder_emb', input_dim=VOCAB_SIZE,
output_dim=EMB_SIZE,
weights=[embedding_matrix],
trainable=False,
input_length=MAX_LENGTH)(decoder_inputs)
# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the
# return states in the training model, but we will use them in inference.
decoder_lstm = LSTM(HIDDEN_DIM, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_embedding,
initial_state=encoder_states)
decoder_dense = TimeDistributed(Dense(VOCAB_SIZE, activation='softmax'))
decoder_outputs = decoder_dense(decoder_outputs)
# Define the model that will turn
# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
Слово embeddings (embedding_matrix) разработано с использованием встраивания GloVe.
Вот как появляются результаты для обучения ...
Epoch 1/100 1329/1329 [== ============================] - 1 с 868 мкс / шаг - потеря: нан - точность: 4,7655e-04
Эпоха 2/100 1329/1329 [==============================] - 0s 353us / step - потеря: nan - точность: 4,7655e-04
Эпоха 3/100 1329/1329 [===================== =========] - 0 с 345 мкс / шаг - потеря: нан - точность: 4,7655e-04
Эпоха 4/100 1329/1329 [========== ====================] - 0s 354us / step - потеря: nan - точность: 4.7655e-04
Epoch 5/100 1329/1329 [==============================] - 0 с 349 мкс / шаг - потеря: нан - точность: 4,7655e-04