1

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

我现在只关注底部分支,不包括注意力和样式标签 s_i。我一直在关注这个关于 seq2seq 模型的 Keras教程以获得指导。是我定义此模型的脚本。

在此处输入图像描述

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

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)。后向传输编码器从解码器获取未通过的输入。相反,我打电话给模型(self.encoder_inputs,self.encoder_states)。

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

4

2 回答 2

0

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

于 2018-07-18T15:02:32.633 回答
-1

当您使用keras 功能 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")
于 2018-07-16T12:25:45.033 回答