python - 在 Siraj Raval 的 seq2seq 教程中,如何使编码器隐藏单元和解码器隐藏单元的数量相等
问题描述
我正在使用由 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 个解码器隐藏单元。如何将编码器隐藏单元和解码器隐藏单元设置为相等?谢谢!
解决方案
根据 Github 存储库中的代码,您会得到尺寸不匹配,因为对于编码器,他使用https://www.tensorflow.org/api_docs/python/tf/nn/bidirectional_dynamic_rnn
. 因此,传递给解码器的单元状态具有来自cell_fw
和的单元状态cell_bw
连接在一起。这使得编码器的单元状态大小为[batch_size, 2 * encoder_hidden_units]
。现在,因为编码器和解码器的单元状态大小必须相同,才能将解码器的初始状态设置为编码器的最终状态,所以encoder_hidden_units
必须是大小的两倍decoder_hidden_units
。
推荐阅读
- r - nlsLM maxiter 不会改变
- python - python tkinter调整图像大小
- azure-devops - Azure DevOps 工作项中日期之间的天数(按查询)
- php - Ubuntu 运行多个 .service 文件
- javascript - 如何使用带有关键字数组的正则表达式来替换?
- centos - Centos 8 上的 Mezzio 骨架应用程序
- azure-maps - 历史 Azure Map 数据
- java - 如何将两个数字的和放在“=”旁边
- c++ - clang-format -style=文件在 Ubuntu 18.04 中不起作用
- python - 如何在海龟中独立移动 2 个对象?