Keras seq2seq填料

Keras seq2seq填料,keras,padding,chatbot,seq2seq,Keras,Padding,Chatbot,Seq2seq,我正在开发seq2seq聊天机器人。我想问你,当val_acc计数时,如何忽略聊天机器人响应中的PAD符号 例如,我的模型生成响应:[I,am,reading,a,book,PAD,PAD,PAD,PAD] 但是,正确的回答应该是:[我的兄弟在玩,fotball,PAD,PAD,PAD,PAD,PAD] 在本例中,chatbot的响应完全错误,但由于填充符号,val_acc为50% 我使用Keras,编码器-解码器模型()和教师强制 我的代码在这里: 编码器输入=输入(形状=(句子长度),名称=

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

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

但是,正确的回答应该是:
[我的兄弟在玩,fotball,PAD,PAD,PAD,PAD,PAD]

在本例中,chatbot的响应完全错误,但由于填充符号,val_acc为50%

我使用Keras,编码器-解码器模型()和教师强制

我的代码在这里:

编码器输入=输入(形状=(句子长度),名称=“编码器输入”) 编码器=LSTM(n个单位,返回状态=True,name='encoder'LSTM') 共享\u嵌入=嵌入(输出\u dim=嵌入,输入\u dim=声音大小,name=“嵌入”,mask\u zero='True') 单词嵌入上下文=共享嵌入(编码器输入) 编码器输出,状态h,状态c=编码器(字嵌入上下文) 编码器状态=[状态h,状态c] 解码器输入=输入(形状=(无),名称=“解码器输入”) 解码器\u lstm=lstm(n\u个单位,返回\u序列=True,返回\u状态=True,name=“解码器\u lstm”) word\u嵌入\u应答=共享\u嵌入(解码器\u输入) 解码器输出,解码器lstm(字嵌入回答,初始状态=编码器状态) 解码器密集=密集(语音大小,激活='softmax',name=“密集层”) 解码器输出=解码器输出(解码器输出) 模型=模型([编码器输入,解码器输入],解码器输出)
编码器输入是一个句子,其中每个单词都是整数,0是填充:[1,2,5,4,3,0,0]->用户问题 解码器输入也是一个句子,其中每个字是整数,0是填充,100是符号GO:[100,8,4,2,0,0,0,0]]->chatbot响应移动了一个时间戳 解码器输出是句子,其中字是整数,这些整数是一个热编码的:[8,4,2,0,0,0,0,0]->chatbot响应(整数是一个热编码的。)

问题是,val_acc太高了,而且whan模型预测了完全错误的句子。我认为这是因为填充物造成的。我的模型有问题吗?我应该在解码器中添加另一个掩码吗

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

定义输入序列并对其进行处理。 编码器输入=输入(形状=(无,编码器标记数)) 编码器输入=掩蔽()(编码器输入)#假设PAD为零 编码器=LSTM(潜在尺寸,返回状态=真) #现在,LSTM在编码时将忽略焊盘 #跳过那些被屏蔽的时间步 编码器输出,状态h,状态c=编码器(编码器输入)
我在嵌入层中使用mask\u zero参数<代码>嵌入(输出尺寸=嵌入,输入尺寸=声音尺寸,name=“嵌入”,mask\u zero='True')还需要使用您的代码:
编码器输入=Masking()(编码器输入)
?当我将EmbeddedNG与mask_zero参数一起使用时,什么都不会发生。我应该在解码器模型中使用某种掩蔽吗?我认为val_acc是从仍然包含填充符号的生成句子中计算出来的。我错了吗?不,
mask\u zero
是正确的,具有相同的效果;它根据输入附加一个掩码。LSTM跳过这些时间步并将屏蔽输出归零。如果没有代码,很难说出你的模型在做什么,请确保你正确屏蔽了输入和输出。我已经编辑了我的问题,并附上了我模型的代码。你能看到我的代码中有错误吗?我应该在解码器中添加另一个掩码吗?看起来不错,您不需要为解码器返回\u状态。当val_acc为50%时,您是否检查过您的示例的损失是否正确?@nuric您提供的上述答案无效。当我按照上面的例子输入Masking时,我在编译模型时收到了以下错误:TypeError:a
model
的输入层必须是
InputLayer
对象。收到的输入:[,]。输入0(基于0)源于图层类型
掩蔽
。你知道怎么解决这个问题吗?谢谢