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

Getting graph disconnected error when trying to build encoder-decoder model in Keras

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

我现在只关注底部分支,不包括注意力和样式标签 s_i。我一直在关注这个 Keras tutorial on seq2seq models for guidance. Here 是我定义这个模型的脚本。

训练成功运行,但在推理步骤中出现以下错误。

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']

在推理过程中,我根据教程创建了一个新的编码器和解码器,其权重与训练的权重相同。但是,我不包括向后传输部分,因为这只是为了训练模型。我猜这就是问题的原因,因为在训练过程中,编码器和解码器几乎是循环链接的,但在推理过程中,我只想关注前向传输。

不过我不确定应该如何解决这个问题。我想也许我应该为前向和后向传输部分创建两个独立的编码器/解码器,并让它们共享权重,但不确定这是否明智。我是 Keras 的初学者,因此非常感谢没有假设的解释。谢谢

一些可能有帮助的进一步上下文:

我正在尝试转移文本的样式。我有两个用于样式 A 和 B 的非平行语料库,因此这是一个无监督的问题。这就是为什么前向传输期间解码器使用时间步长 t-1 的输出作为时间步长 t 的输入的原因。然而,在反向传输过程中,解码器旨在重建原始句子,因此使用 ground truth 作为输入。因此创建了两个解码器输入层。

更新:

我已经解决了这个特定的错误。事实证明,我在正向传输期间用编码器在反向传输期间的输出覆盖了编码器 (self.encoder_states) 的输出。反向传输编码器从未通过的解码器获取输入。相反,我打电话给 Model(self.encoder_inputs, self.encoder_states).

从这里开始,我想知道我采用的方法是否是实现此模型的最简单方法。有更好的选择吗?

当您使用keras functional API定义模型时,您需要连接层,即

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_inputs, self.encoder_states).