首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras seq2seq填充

Keras seq2seq填充
EN

Stack Overflow用户
提问于 2018-05-12 19:09:40
回答 1查看 1.9K关注 0票数 1

我正在开发seq2seq聊天机器人。我会问你,如何在val_acc计数时忽略聊天机器人响应中的PAD符号。

例如,我的模型生成响应:[I, am, reading, a, book, PAD, PAD, PAD, PAD, PAD]

但是,正确的响应应该是:[My, brother, is, playing, fotball,PAD, PAD, PAD, PAD, PAD].

在这种情况下,聊天机器人的响应完全错误,但val_acc是50%,因为填充符号。

我使用Keras,编码器-解码器模型(https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html),并使用教师强制

我的代码如下:

代码语言:javascript
复制
encoder_inputs = Input(shape=(sentenceLength,), name="Encoder_input")
encoder = LSTM(n_units, return_state=True, name='Encoder_lstm')
Shared_Embedding = Embedding(output_dim=embedding, input_dim=vocab_size, name="Embedding", mask_zero='True') 
word_embedding_context = Shared_Embedding(encoder_inputs)
encoder_outputs, state_h, state_c = encoder(word_embedding_context)
encoder_states = [state_h, state_c]

decoder_inputs = Input(shape=(None,), name="Decoder_input")
decoder_lstm = LSTM(n_units, return_sequences=True, return_state=True, name="Decoder_lstm")

word_embedding_answer = Shared_Embedding(decoder_inputs)
decoder_outputs, _, _ = decoder_lstm(word_embedding_answer, initial_state=encoder_states)
decoder_dense = Dense(vocab_size, activation='softmax', name="Dense_layer")
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

编码器输入是句子,其中每个单词是整数,0是填充: 1,2,5,4,3,0,0,0 ->用户问题解码器输入也是句子,每个单词是整数,0是填充,100是符号GO: 100,8,4,2,0,0,0,0,0] ->chatbot响应移位一个时间戳解码器输出是句子,其中单词是整数,并且这些整数是一个热编码: 8,4,2,0,0,0,0,0,0,0] ->chatbot响应(整数是一个热编码)。

问题是,val_acc太高了,模型也预测了完全错误的句子。我认为这是由于填充物造成的。我的模型有问题吗?我应该在我的解码器中再添加一些掩码吗?

以下是我的图表:

EN

回答 1

Stack Overflow用户

发布于 2018-05-12 19:24:30

您是对的,这是因为该教程没有使用Masking (documentation)来忽略这些填充值,并显示了相同输入输出长度的示例。在您的情况下,模型仍将输入输出焊盘,但掩码将忽略它们。例如,要屏蔽编码器,请执行以下操作:

代码语言:javascript
复制
# Define an input sequence and process it.
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder_inputs = Masking()(encoder_inputs) # Assuming PAD is zeros
encoder = LSTM(latent_dim, return_state=True)
# Now the LSTM will ignore the PADs when encoding
# by skipping those timesteps that are masked
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50305574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档