Python 尝试在Keras中构建编码器-解码器模型时出现图形断开连接错误

Python 尝试在Keras中构建编码器-解码器模型时出现图形断开连接错误,python,keras,encoder-decoder,Python,Keras,Encoder Decoder,我试图在Keras中实现一个基于下图(来源:)的编码器-解码器模型的简化版本。请注意,此模型中只有一个编码器和解码器,为了清晰起见,它们已在图像中展开 我现在只关注最底层的分支,不包括注意力和样式标签s_I。我一直在seq2seq模型上关注这一点以获得指导。是我定义此模型的脚本 培训成功运行,但我在推理步骤中遇到以下错误 Traceback (most recent call last): File "/run_model.py", line 110, in <module> de

我试图在Keras中实现一个基于下图(来源:)的编码器-解码器模型的简化版本。请注意,此模型中只有一个编码器和解码器,为了清晰起见,它们已在图像中展开

我现在只关注最底层的分支,不包括注意力和样式标签s_I。我一直在seq2seq模型上关注这一点以获得指导。是我定义此模型的脚本

培训成功运行,但我在推理步骤中遇到以下错误

Traceback (most recent call last):
File "/run_model.py", line 110, in <module>
decoded_sentence = benchmark_obj.inference(test_encoded, id2word, max_sequence_length)
File "/benchmark_model.py", line 173, in inference
encoder_inference = Model(self.encoder_inputs, self.encoder_states)
File "/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/python3.6/site-packages/keras/engine/network.py", line 91, in __init__
self._init_graph_network(*args, **kwargs)
File "/python3.6/site-packages/keras/engine/network.py", line 235, in _init_graph_network
self.inputs, self.outputs)
File "/python3.6/site-packages/keras/engine/network.py", line 1489, in _map_graph_network
str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("decoder_inputs_forward:0", shape=(?, 1, 13105), dtype=float32) at layer "decoder_inputs_forward". The following previous layers were accessed without issue: ['encoder_inputs']
回溯(最近一次呼叫最后一次):
文件“/run_model.py”,第110行,在
解码句子=基准对象推断(测试编码,ID2字,最大序列长度)
文件“/benchmark_model.py”,第173行,在推断中
编码器推理=模型(self.encoder\u输入、self.encoder\u状态)
文件“/python3.6/site packages/keras/legacy/interfaces.py”,第91行,在包装器中
返回函数(*args,**kwargs)
文件“/python3.6/site packages/keras/engine/network.py”,第91行,在__
自初始化图网络(*args,**kwargs)
文件“/python3.6/site-packages/keras/engine/network.py”,第235行,在网络中
自输入、自输出)
文件“/python3.6/site packages/keras/engine/network.py”,第1489行,网络图
str(带有完整输入的图层)
ValueError:Graph disconnected:无法获取层“decoder\u inputs\u forward”处的张量张量值(“decoder\u inputs\u forward:0”,shape=(?,1,13105),dtype=float32)。访问以下以前的层时没有问题:[“编码器输入”]
在推理过程中,我根据教程创建了一个新的编码器和解码器,其权重与训练的相同。但是,我不包括向后传输部分,因为这只是为了训练模型。我猜这就是问题的原因,因为在训练期间,编码器和解码器几乎是循环链接的,但在推理期间,我只想关注前向传输

但是,我不确定我应该如何着手解决这个问题。我想也许我应该为前向和后向传输部分创建两个独立的编码器/解码器,让它们共享权重,但不确定这是否合理。我是Keras的初学者,因此不带假设的解释将非常受欢迎。谢谢

一些可能有帮助的进一步背景: 我正在尝试转换文本的样式。对于A型和B型,我有两个非平行的小体,因此这是一个无监督的问题。这就是解码器在前向传输期间使用时间步t-1处的输出作为时间步t处的输入的原因。然而,在后向传输过程中,译码器的目标是重建原始句子,因此使用基本事实作为输入。因此,创建了两个解码器输入层

更新:
我已经解决了这个具体错误。事实证明,我在前向传输期间覆盖了编码器的输出(self.encoder_states),在后向传输期间覆盖了编码器的输出。反向传输编码器从未传递的解码器获取输入。相反,我调用模型(self.encoder\u输入,self.encoder\u状态)

接下来,我想知道我所采用的方法是否是实现此模型的最简单方法。有更好的选择吗?

当您使用定义模型时,需要连接以下图层:

input_tensor = Input((784,))
x = Dense(16, activation="relu")(inputs) # inputs -> x
output_tensor = Dense(10, activation="softmax") # inputs -> x -> outputs

model = Model(inputs=input_tensor, outputs=output_tensor)
在本例中,您尚未连接图形中的层(节点)

第61行:62

    self.encoder_inputs = Input(shape=(max_timestep, self.input_dims), name="encoder_inputs")
    self.encoder = LSTM(self.latent_dims, return_state=True, dropout=dropout, name="encoder")

我已经解决了这个具体错误。事实证明,我在前向传输期间覆盖了编码器的输出(self.encoder_states),在后向传输期间覆盖了编码器的输出。反向传输编码器从未传递的解码器获取输入。相反,我调用了Model(self.encoder\u输入,self.encoder\u状态)。

谢谢您的回复。我不把它们连接到第63行吗<代码>编码器输出,状态h,状态c=self.encoder(self.encoder\u输入)我试图实现本文,数据集发布了吗?你准备好自己的数据集了吗?