Python tensorflow中RNN的编解码器模型
我正在为编码器和解码器实现一个使用双向RNN的编码器-解码器模型。由于我在编码器端初始化了双向RNN,并且与双向RNN相关联的权重和向量已经初始化,因此当我尝试在解码器端初始化另一个实例时,我得到以下错误:Python tensorflow中RNN的编解码器模型,python,tensorflow,deep-learning,recurrent-neural-network,Python,Tensorflow,Deep Learning,Recurrent Neural Network,我正在为编码器和解码器实现一个使用双向RNN的编码器-解码器模型。由于我在编码器端初始化了双向RNN,并且与双向RNN相关联的权重和向量已经初始化,因此当我尝试在解码器端初始化另一个实例时,我得到以下错误: ValueError: Variable bidirectional_rnn/fw/gru_cell/w_ru already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarSc
ValueError: Variable bidirectional_rnn/fw/gru_cell/w_ru already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?
我试着在它自己的name\u范围内定义每一个,如下所示,但没有用:
def enc(信息、重量、偏差):
message=tf.unstack(message,timesteps\u enc,1)
fw_cell=rnn.GRUBlockCell(num_hidden_enc)
bw\u cell=rnn.GRUBlockCell(num\u hidden\u enc)
使用tf.name_范围(“编码器”):
输出,uu,uu=rnn.static_u双向(fw_单元格,bw_单元格,消息,数据类型=tf.float32)
返回tf.matmul(输出[-1],权重)+偏差
def dec(码字、权重、偏差):
码字=tf。展开(码字,轴=2)
码字=tf.unstack(码字,时间步长,1)
fw_cell=rnn.GRUBlockCell(num_hidden_dec)
bw\u cell=rnn.GRUBlockCell(num\u hidden\u dec)
使用tf.name_范围(“解码器”):
输出,uu,uu=rnn.static_u双向_rnn(fw_单元格,bw_单元格,码字,dtype=tf.float32)
返回tf.matmul(输出[-1],权重)+偏差
有人能暗示一下我做错了什么吗?把它作为一个答案:
只需尝试将name\u scope
交换为variable\u scope
。我不确定它是否仍然有效,但对于TF的旧版本,不鼓励使用name\u scope
。从变量名双向\u rnn/fw/gru\u cell/w\u ru
可以看出该范围未应用 一件事是,您不能在同一范围内创建具有相同名称的变量,因此更改variable\u scope
的name\u scope
将修复培训
另一件事是,这种模型不能作为编码器-解码器模型工作,因为解码器RNN不能是双向的。在训练时确实有整个目标序列,但在推断时,从左到右生成目标。这意味着您只有前向RNN的左上下文,但没有后向RNN的右上下文。只需尝试将name\u scope
交换为variable\u scope
。我不确定它是否仍然有效,但对于TF的旧版本,不鼓励使用name\u scope
。从您的变量名双向\u rnn/fw/gru\u cell/w\u ru
中,您可以看到未应用该范围。感谢您的回复,这很有效。你能把它作为一个答案,这样我就可以把它标记为正确的吗?谢谢你的回答。这是我不知道的事实。非常感谢。另外,你能帮我修理一下吗?我应该从编码器双向RNN获取所有三个输出并将它们堆叠起来吗?从文档中我还发现,输出是一个长度为'T'的输出列表(每个输入一个),它是深度连接的前向和后向输出。输出状态是前向rnn的最终状态。输出状态是反向rnn的最终状态。