lc222 / seq2seq_chatbot_new

基于seq2seq模型的简单对话系统的tf实现,具有embedding、attention、beam_search等功能,数据集是Cornell Movie Dialogs
143 stars 64 forks source link

何處添加END符號呢? #7

Open njames741 opened 6 years ago

njames741 commented 6 years ago

https://github.com/lc222/seq2seq_chatbot_new/blob/8d60e3ec8d122c843476464aeff4d0bf5d8adfd7/data_helpers.py#L56-L59

在這部分沒看見添加END的結尾符號 於您所提共的pkl檔中的trainingSamples亦沒看見結尾符號 不知道這是一個問題,還是我對程式碼有誤解?


我自行修改於 target = sample[1] + [eosToken] 但這又浮現一個問題 https://github.com/lc222/seq2seq_chatbot_new/blob/8d60e3ec8d122c843476464aeff4d0bf5d8adfd7/model.py#L92-L94 這邊刪除的結尾符號動作應該只有batch中長度最長的sequence會刪除到eos 其餘的都刪除到pad

lc222 commented 6 years ago

这个问题你可以看一下model文件,会在train的过程中给target添加end符号。就是在model.py文件的if self.mode == 'train':这一句代码后面进行添加的。希望可以解决你的问题。

njames741 commented 6 years ago

非常感謝您的回覆 我在去查看了model文件 https://github.com/lc222/seq2seq_chatbot_new/blob/8d60e3ec8d122c843476464aeff4d0bf5d8adfd7/model.py#L91-L95 這邊貌似只有將原本的target刪除結尾END並加上GO來作為訓練時期的decoder輸入 例如 原本為 "你 好 嗎 END" ,加工後變為 "GO 你 好 嗎"

parahaoer commented 6 years ago

@njames741 请问问题最后你解决了吗?我发现预测回答的句子都很长,没有生成eos

njames741 commented 6 years ago

@parahaoer 目前我是依照上述方法添加EOS,預測的句子會產生EOS會停止 後續提到的問題則還未解決,可能需要再思考怎麼寫

parahaoer commented 6 years ago

@njames741 为什么我在sample[1]后面加上[eosToken]没有效果呢?

windrunner414 commented 6 years ago

decoder_input需要删除eos么?好像不用删吧,只需要加go

aguang1201 commented 5 years ago

@njames741 @lc222 也注意到代码中确实没有加eos.我觉得可以修改成target = sample[1] + [eosToken]. 但不明白为什么要在embedding前删除eos呢?

aguang1201 commented 5 years ago

seq2seq_chatbot_new/data_helpers.py

Lines 56 to 59 in 8d60e3e

将target进行PAD,并添加END符号

target = sample[1] pad = [padToken] * (max_target_length - len(target)) batch.decoder_targets.append(target + pad) 在這部分沒看見添加END的結尾符號 於您所提共的pkl檔中的trainingSamples亦沒看見結尾符號 不知道這是一個問題,還是我對程式碼有誤解?

我自行修改於 target = sample[1] + [eosToken] 但這又浮現一個問題 seq2seq_chatbot_new/model.py

Lines 92 to 94 in 8d60e3e

定义decoder阶段的输入,其实就是在decoder的target开始处添加一个,并删除结尾处的,并进行embedding。

decoder_inputs_embedded的shape为[batch_size, decoder_targets_length, embedding_size]

ending = tf.strided_slice(self.decoder_targets, [0, 0], [self.batch_size, -1], [1, 1])

這邊刪除的結尾符號動作應該只有batch中長度最長的sequence會刪除到eos 其餘的都刪除到pad

貌似作者是想把eos加到pad后面,不过好像忘了加了.

Lanme commented 5 years ago

同注意到没有加,现在还没改好那... Still unresolved