0

我使用 Keras 框架制作了一个编码器解码器模型,用于制作聊天机器人。我找不到我的模型有任何问题,仍然在训练 LOSS 从第一个时期本身开始是 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)

词嵌入 (embedding_matrix) 是使用 GloVe 嵌入开发的。

训练结果就是这样出来的……

纪元 1/100 1329/1329 [===============================] - 1s 868us/step - loss: nan - 精度: 4.7655e-04

纪元 2/100 1329/1329 [===============================] - 0s 353us/步 - 损失:nan - 准确度: 4.7655e-04

纪元 3/100 1329/1329 [===============================] - 0s 345us/步 - 损失:nan - 准确度: 4.7655e-04

纪元 4/100 1329/1329 [===============================] - 0s 354us/步 - 损失:nan - 准确度: 4.7655e-04

纪元 5/100 1329/1329 [===============================] - 0s 349us/步 - 损失:nan - 准确度: 4.7655e-04

4

1 回答 1

0

问题出在我的数据中。模型很完美!

于 2020-06-23T18:49:29.133 回答