我正在尝试将双向LSTM权重用于2个非常相似的计算,但是我遇到错误,不知道我在做什么错。
我有一个基本模块的类:

class BasicAttn(object):
    def __init__(self, keep_prob, value_vec_size):
        self.rnn_cell_fw = rnn_cell.LSTMCell(value_vec_size/2, reuse=True)
        self.rnn_cell_fw = DropoutWrapper(self.rnn_cell_fw, input_keep_prob=self.keep_prob)
        self.rnn_cell_bw = rnn_cell.LSTMCell(value_vec_size/2, reuse=True)
        self.rnn_cell_bw = DropoutWrapper(self.rnn_cell_bw, input_keep_prob=self.keep_prob)

    def build_graph(self, values, values_mask, keys):
        blended_reps = compute_blended_reps()
        with tf.variable_scope('BasicAttn_BRNN', reuse=True):
        (fw_out, bw_out), _ =
        tf.nn.bidirectional_dynamic_rnn(self.rnn_cell_fw, self.rnn_cell_bw, blended_reps, dtype=tf.float32, scope='BasicAttn_BRNN')


然后,在构建图形时调用该模块

    attn_layer_start = BasicAttn(...)
    blended_reps_start = attn_layer_start.build_graph(...)
    attn_layer_end = BasicAttn(...)
    blended_reps_end = attn_layer_end.build_graph(...)


但是我得到一个错误,说TensorFlow无法重用RNN?

ValueError: Variable QAModel/BasicAttn_BRNN/BasicAttn_BRNN/fw/lstm_cell/kernel does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope


有很多代码,所以我修剪掉了我认为不必要的部分。

最佳答案

reuse=True表示变量以前是用reuse=False创建的,因此每个tf.get_variable(在您的情况下,在LSTM接口后面抽象)都希望该变量已存在。

要具有一种模式,在该模式下,如果变量尚不存在则创建它们,然后以其他方式重用,则需要设置reuse=tf.AUTO_REUSE(如错误消息所示)。

因此,将所有出现的reuse=True替换为reuse=tf.AUTO_REUSE

这是文档:https://www.tensorflow.org/api_docs/python/tf/variable_scope

关于python - 尝试为RNN重用权重时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50340289/

10-09 08:22