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

时间:2018-07-16 10:35:35

标签: python keras encoder-decoder

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

我现在只关注底部分支,暂时不关注注意力和样式标签s_i。我一直在seq2seq模型上遵循此Keras tutorial进行指导。 Here是我定义此模型的脚本。

enter image description 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的输入的原因。但是,在向后传输期间,解码器旨在重建原始句子,因此将基本事实用作输入。这样就创建了两个解码器输入层。

更新:

我已解决此特定错误。原来,我在向前传输期间覆盖了编码器的输出(self.encoder_states),而在反向传输期间覆盖了编码器的输出。后向传输编码器从解码器获取未通过的输入。相反,我叫Model(self.encoder_inputs,self.encoder_states)。

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

2 个答案:

答案 0 :(得分:0)

我已解决此特定错误。原来,我在向前传输期间覆盖了编码器的输出(self.encoder_states),而在反向传输期间覆盖了编码器的输出。后向传输编码器从解码器获取未通过的输入。相反,我叫Model(self.encoder_inputs,self.encoder_states)。

答案 1 :(得分:-1)

使用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")