了解 Keras 的 Seq2Seq
Seq2Seq with Keras understanding
为了自学,我正在尝试使用 Keras 实现简单的序列到序列模型。虽然我了解了基本概念并且在线提供了多个教程,但在查看这些教程时我仍然难以理解一些基本概念:
- Keras Tutorial: 我试过采用这个教程。不幸的是,它是针对字符序列的,但我的目标是单词序列。有一个块可以解释单词序列所需的内容,但目前会抛出 "wrong dimension" 错误——不过没关系,可能是我这边的一些数据准备错误。但更重要的是,在本教程中,我可以清楚地看到 2 种输入和 1 种输出:
encoder_input_data
、decoder_input_data
、decoder_target_data
- MachineLearningMastery 教程:这里的网络模型看起来很不一样,完全按顺序排列,有 1 个输入和 1 个输出。据我所知,此处解码器仅获得编码器的输出。
说这确实是针对 Seq2Seq 的两种不同方法是否正确?哪一个可能更好,为什么?还是我错误地阅读了第二个教程?对sequence classification和sequences labeling我已经有所了解,但是对于sequence-to-sequence还没有正确的点击。
是的,这两种是不同的方法,还有其他变体。 MachineLearningMastery 简化了一些事情,使其易于访问。我相信 Keras 方法可能会表现得更好,如果你想以注意力推进到 seq2seq,这就是你所需要的,几乎总是如此。
MachineLearningMastery 有一个棘手的解决方法,允许它在不提交解码器输入的情况下工作。它只是重复最后一个隐藏状态并将其作为每个时间步的输入传递。这不是一个灵活的解决方案。
model.add(RepeatVector(tar_timesteps))
另一方面,Keras 教程还有其他几个概念,例如教师强制(使用目标作为解码器的输入)、嵌入(缺乏)和更长的推理过程,但它应该引起您的注意。
我也推荐pytorch tutorial,我觉得是最合适的方法。
编辑:
我不知道你的任务,但你想要的词嵌入是
x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)
在此之前,您需要将词汇表中的每个单词映射为一个整数,将每个句子转换为一个整数序列并将该整数序列传递给模型(latent_dim 的嵌入层可能是 120) .所以你的每个单词现在都由一个大小为 120 的向量表示。你的输入句子也必须具有相同的大小。因此,找到一个合适的最大句子长度并将每个句子变成该长度,如果句子短于 max len,则用零填充,其中 0 可能代表一个空词。
为了自学,我正在尝试使用 Keras 实现简单的序列到序列模型。虽然我了解了基本概念并且在线提供了多个教程,但在查看这些教程时我仍然难以理解一些基本概念:
- Keras Tutorial: 我试过采用这个教程。不幸的是,它是针对字符序列的,但我的目标是单词序列。有一个块可以解释单词序列所需的内容,但目前会抛出 "wrong dimension" 错误——不过没关系,可能是我这边的一些数据准备错误。但更重要的是,在本教程中,我可以清楚地看到 2 种输入和 1 种输出:
encoder_input_data
、decoder_input_data
、decoder_target_data
- MachineLearningMastery 教程:这里的网络模型看起来很不一样,完全按顺序排列,有 1 个输入和 1 个输出。据我所知,此处解码器仅获得编码器的输出。
说这确实是针对 Seq2Seq 的两种不同方法是否正确?哪一个可能更好,为什么?还是我错误地阅读了第二个教程?对sequence classification和sequences labeling我已经有所了解,但是对于sequence-to-sequence还没有正确的点击。
是的,这两种是不同的方法,还有其他变体。 MachineLearningMastery 简化了一些事情,使其易于访问。我相信 Keras 方法可能会表现得更好,如果你想以注意力推进到 seq2seq,这就是你所需要的,几乎总是如此。
MachineLearningMastery 有一个棘手的解决方法,允许它在不提交解码器输入的情况下工作。它只是重复最后一个隐藏状态并将其作为每个时间步的输入传递。这不是一个灵活的解决方案。
model.add(RepeatVector(tar_timesteps))
另一方面,Keras 教程还有其他几个概念,例如教师强制(使用目标作为解码器的输入)、嵌入(缺乏)和更长的推理过程,但它应该引起您的注意。
我也推荐pytorch tutorial,我觉得是最合适的方法。
编辑: 我不知道你的任务,但你想要的词嵌入是
x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)
在此之前,您需要将词汇表中的每个单词映射为一个整数,将每个句子转换为一个整数序列并将该整数序列传递给模型(latent_dim 的嵌入层可能是 120) .所以你的每个单词现在都由一个大小为 120 的向量表示。你的输入句子也必须具有相同的大小。因此,找到一个合适的最大句子长度并将每个句子变成该长度,如果句子短于 max len,则用零填充,其中 0 可能代表一个空词。