我正在使用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个解码器隐藏单元。如何将编码器隐藏单元和解码器隐藏单元设置为相等?谢谢!
答案 0 :(得分:0)
基于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
。