Python NSTEPLSM和Seq2Seq模型
亲爱的chainer社区: 在seq2seq英法翻译中,我无法理解NStepLSTM的逻辑用法 定义调用self、xs、ys: xs=[x[::-1]表示x在xs中]倒转x据我所知,xs是一个英语短语,ys是一个法语短语。你为什么把这个英语短语颠倒过来 你如何训练网络?将xs和ys嵌入到连续空间中,然后向编码器提供exs以获得英语短语的潜在表示。但是,然后你把潜在的表示放入带有eys的解码器中。但是eys是法语短语的连续表示,在测试阶段解码器不能知道结果法语短语,是吗?如何应用您的网络 hx,cx,u=self。编码器名称,无,exs _,uOS=self.decoderhx,cx,eys y_in=[F.concat[eos,y],y的轴=0]为什么我们把序列的结尾放在开头 ys=self.xp.fullbatch,EOS,“i”在def translate中,我们将序列末尾的数组放入解码器,为什么?Python NSTEPLSM和Seq2Seq模型,python,chainer,Python,Chainer,亲爱的chainer社区: 在seq2seq英法翻译中,我无法理解NStepLSTM的逻辑用法 定义调用self、xs、ys: xs=[x[::-1]表示x在xs中]倒转x据我所知,xs是一个英语短语,ys是一个法语短语。你为什么把这个英语短语颠倒过来 你如何训练网络?将xs和ys嵌入到连续空间中,然后向编码器提供exs以获得英语短语的潜在表示。但是,然后你把潜在的表示放入带有eys的解码器中。但是eys是法语短语的连续表示,在测试阶段解码器不能知道结果法语短语,是吗?如何应用您的网络 hx,c
如果我不想翻译句子,而是想构建一个自动编码器将短语映射到潜在空间,我该怎么办 谢谢你的提问 问题1 请参阅以下seq2seq原始文件。 他们建议: 请注意,LSTM以相反的方式读取输入语句,因为这样做会在数据中引入许多短期依赖项,从而使优化问题变得更容易。 抽象地 我们发现在所有的源句中,颠倒单词的顺序 非目标句显著提高了LSTM的表现 我认为官方的示例代码也会像上面的文章一样颠倒输入的句子 问题2 但是,然后你把潜在的表示放入带有eys的解码器中。但eys是法语短语的连续表示 是的。这段代码是在训练时使用的,所以我们知道目标句中的金字
hx, cx, _ = self.the encoder(None, None, exs)
_, _, os = self.decoder(hx, cx, eys)
在测试时,您应该使用def translateself,xs,max_length=100:。
该方法可用于从源句xs预测句子
对于每个循环,使用源语句向量和前一个单词ys预测一个单词
问题3
问题4
我认为这部分应该是:
ys_in=[F.concat[bos,y],轴=0表示y在ys中]句首
官方代码将eos用于和
最后问题
如果我不想翻译句子,而是想构建一个自动编码器将短语映射到潜在空间,我该怎么办
当您想要构建自动编码器时
删除此行xs=[x[:-1]表示xs中的x]
在ys_in=[F.concat[eos,y]中使用bos代替eos,y轴=0表示y在ys中]
无论使用eos而不是bos,两者都可以。
对于自动编码器,您只需删除这一行xs=[x[::-1]
如果您想使用bos,您应该进行如下修改:
UNK = 0
EOS = 1
BOS = 2
47:eos = self.xp.array([EOS], 'i')
48: ys_in = [F.concat([eos, y], axis=0) for y in ys]
=>
bos = self.xp.array([BOS], 'i')
ys_in = [F.concat([bos, y], axis=0) for y in ys]
79: ys = self.xp.full(batch, EOS, 'i')
=>
ys = self.xp.full(batch, BOS, 'i')
def load_vocabulary(path):
with open(path) as f:
# +2 for UNK and EOS
word_ids = {line.strip(): i + 3 for i, line in enumerate(f)}
word_ids['<UNK>'] = 0
word_ids['<EOS>'] = 1
word_ids['<BOS>'] = 2
return word_ids
如果你有进一步的问题,请再问我一次
UNK = 0
EOS = 1
BOS = 2
47:eos = self.xp.array([EOS], 'i')
48: ys_in = [F.concat([eos, y], axis=0) for y in ys]
=>
bos = self.xp.array([BOS], 'i')
ys_in = [F.concat([bos, y], axis=0) for y in ys]
79: ys = self.xp.full(batch, EOS, 'i')
=>
ys = self.xp.full(batch, BOS, 'i')
def load_vocabulary(path):
with open(path) as f:
# +2 for UNK and EOS
word_ids = {line.strip(): i + 3 for i, line in enumerate(f)}
word_ids['<UNK>'] = 0
word_ids['<EOS>'] = 1
word_ids['<BOS>'] = 2
return word_ids