Seq2Seq与Keras的理解

时间:2018-02-10 05:44:29

标签: machine-learning deep-learning keras machine-translation

对于一些自学,我尝试使用Keras实现简单的序列到序列模型。虽然我得到了基本的想法,并且有几个在线可用的教程,但在查看这些教程时我仍然会遇到一些基本概念:

  • Keras Tutorial:我已尝试采用本教程。不幸的是,它适用于字符序列,但我的目标是单词序列。这是一个解释单词序列所需要的块,但是这个目前正在抛出错误的维度"错误 - 但是没关系,可能是我身边的一些数据准备错误。但更重要的是,在本教程中,我可以清楚地看到两种类型的输入和一种类型的输出:encoder_input_datadecoder_input_datadecoder_target_data
  • MachineLearningMastery教程:这里网络模型看起来非常不同,完全顺序有1个输入和1个输出。据我所知,这里解码器只获得编码器的输出。

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

1 个答案:

答案 0 :(得分:3)

是的,这两种方法不同,也有其他变化。 MachineLearningMastery简化了一些事情以使其可访问。我相信Keras方法可能会表现得更好,如果你想提前注意seq2seq,你需要的是几乎总是如此。

MachineLearningMastery有一个hacky解决方法,允许它在不交换解码器输入的情况下工作。它只是重复最后一个隐藏状态,并将其作为每个时间步的输入传递。这不是一个灵活的解决方案。

    model.add(RepeatVector(tar_timesteps))

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

我还建议pytorch tutorial我觉得这是最合适的方法。

修改: 我不知道你的任务,但你想要的字嵌入是什么

x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)

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