【问题标题】:how do you make the number of encoder hidden units and decoder hidden units equal in Siraj Raval's seq2seq tutorial在 Siraj Raval 的 seq2seq 教程中,如何使编码器隐藏单元和解码器隐藏单元的数量相等
【发布时间】:2019-02-01 18:28:38
【问题描述】:

我使用的是由 Siraj Raval 创建的 seq2seq 模型,但在编码器隐藏单元和解码器隐藏单元的数量方面存在问题。

在 Github 上 Siraj 的 TensorFlow seq2seq 教程(链接:https://github.com/llSourcell/seq2seq_model_live/blob/master/2-seq2seq-advanced.ipynb)中,解码器隐藏单元的数量是编码器隐藏单元数量的两倍。在此笔记本附带的视频(链接:https://www.youtube.com/watch?v=ElmBrKyMXxs)中,Siraj 说这是因为他希望模型实际上必须学习,因为标签与其对应的输入相同。对于我的问题,我希望编码器隐藏单元的数量与解码器隐藏单元的数量相同。当我尝试将数字设置为彼此相等时,我收到以下错误消息:

ValueError: Dimensions must be equal, but are 220 and 120 for 'rnn/while/lstm_cell/MatMul' (op: 'MatMul') with input shapes: [?,220], [120,400].

这是从decoder_outputs_ta, decoder_final_state, _ = tf.nn.raw_rnn(decoder_cell, loop_fn) 这一行提出的

我的代码与 Siraj 的代码有些不同,但我没有更改与模型的工作方式有关的任何内容,只是它如何获取数据和大小。我的模型的词汇量为 30,输入嵌入量为 20。我有 100 个编码器隐藏单元,因此(我认为)目前有 200 个解码器隐藏单元。如何将编码器隐藏单元和解码器隐藏单元设置为相等?谢谢!

【问题讨论】:

  • 您的矩阵尺寸错误,在您的错误中,[?,220], [120,400]. 您可以看到 220 不等于 120,这是矩阵乘法所必需的,该尺寸匹配,以找出究竟是什么问题,我也需要你的代码,把它放在github上并把链接放在这里,我会在周末看它,如果我发现了什么,提出一个pull request。

标签: python tensorflow


【解决方案1】:

根据 Github 存储库中的代码,您得到的尺寸不匹配,因为对于编码器,他使用 https://www.tensorflow.org/api_docs/python/tf/nn/bidirectional_dynamic_rnn。因此,传递给解码器的单元状态将cell_fwcell_bw 中的单元状态连接在一起。这使得编码器的单元状态大小为[batch_size, 2 * encoder_hidden_units]。现在,因为编码器和解码器的单元状态大小必须相同才能将解码器的初始状态设置为编码器的最终状态,所以encoder_hidden_units 必须是@987654326 大小的两倍@。

【讨论】:

  • 所以它们的大小不一样不是问题,这就是它必须如何工作才能实现双向?
  • 如果编码器是双向循环神经网络,解码器的单元状态大小必须是编码器大小的两倍,这样当你将编码器的最后一个单元状态传递给解码器时它们将具有单元状态大小。
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
相关资源
最近更新 更多