具有Keras理解的Seq2Seq

Chr*_*ian 3 machine-learning machine-translation deep-learning keras

对于一些自学,我正在尝试使用Keras实现简单的序列到序列模型。虽然我有了基本的想法,并且在线上有几本教程可用,但是在阅读这些教程时,我仍然在一些基本概念上苦苦挣扎:

  • Keras教程:我试图采用本教程。不幸的是,它用于字符序列,但我的目标是单词序列。有一个块可以解释单词序列的要求,但这当前会引发“错误的尺寸”错误-没关系,可能是我这边的一些数据准备错误。但更重要的是,在本文中,我可以清楚地看到这2种类型的输入的和1种类型的输出:encoder_input_datadecoder_input_datadecoder_target_data
  • MachineLearningMastery教程:这里的网络模型看起来非常不同,完全顺序,只有1个输入和1个输出。据我所知,这里的解码器仅获得编码器的输出。

说这些确实是针对Seq2Seq的两种不同方法是否正确?哪一个更好,为什么?还是我看错了第二篇教程?我已经对序列分类和序列标记有了一定的了解,但是对于序列到序列,它还没有被正确点击。

Lit*_*one 5

是的,这两种方法是不同的,并且还有其他变化。MachineLearningMastery简化了一些操作使其变得可访问。我相信Keras方法的性能可能会更好,这是您需要注意的情况,而这几乎总是这种情况,这是您需要的。

MachineLearningMastery具有一个变通的解决方法,使它无需输入解码器输入即可工作。它只是重复上一个隐藏状态,并将其作为每个时间步的输入。这不是一个灵活的解决方案。

    model.add(RepeatVector(tar_timesteps))
Run Code Online (Sandbox Code Playgroud)

另一方面,Keras教程还具有其他一些概念,例如教师强迫(使用目标作为解码器的输入),嵌入(缺少)和更长的推理过程,但这应该引起您的注意。

我还将推荐pytorch教程,我认为这是最合适的方法。

编辑: 我不知道您的任务,但您想要的单词嵌入是

x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)
Run Code Online (Sandbox Code Playgroud)

在此之前,您需要将词汇表中的每个单词映射为一个整数,将每个句子转换为一个整数序列,然后将该整数序列传递给模型(lament_dim的嵌入层可能为120)。因此,您的每个单词现在都由大小为120的向量表示。输入的句子也必须全部相同。因此,找到合适的最大句子长度,如果句子比max len短(其中0表示空词),则将每个句子变成该长度并以零填充。