Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow 1.11.0在尝试使用scope.reusevariables()重用cudnnGRU变量时引发错误_Python_Tensorflow_Deep Learning_Rnn - Fatal编程技术网

Python Tensorflow 1.11.0在尝试使用scope.reusevariables()重用cudnnGRU变量时引发错误

Python Tensorflow 1.11.0在尝试使用scope.reusevariables()重用cudnnGRU变量时引发错误,python,tensorflow,deep-learning,rnn,Python,Tensorflow,Deep Learning,Rnn,我正在使用tf.contrib.cudnn\u rnn.CudnnGRU()作为编码器实现编码器-解码器rnn,我发现了一个问题: 我想重复使用变量,这样我可以创建相同的模型,但将其用于其他数据,简单地说,这将是重现我的问题的代码: tf.reset_default_graph() def create_model(): return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,

我正在使用
tf.contrib.cudnn\u rnn.CudnnGRU()
作为编码器实现编码器-解码器rnn,我发现了一个问题:

我想重复使用变量,这样我可以创建相同的模型,但将其用于其他数据,简单地说,这将是重现我的问题的代码:

tf.reset_default_graph()

def create_model():
    return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,
                         direction='unidirectional')

# (time, batch_size, num_inputs)
x = tf.random_normal((100, 16, 100))

with tf.variable_scope('model') as scope:
    model_1 = create_model()
    rnn_out_1, rnn_state_1 = model_1(x)
    scope.reuse_variables()
    model_2 = create_model()
    rnn_out_2, rnn_state_2 = model_2(x)
这会引发以下错误:

变量模型/cudnn_gru_1/opaque_内核不存在,或者不是使用tf.get_Variable()创建的。您的意思是在VarScope中设置reuse=tf.AUTO_reuse吗

因此,第二个模型试图找到
model/cudnn\u gru\u 1/opaque\u kernel
变量,但找不到它,因为它应该查找
model/cudnn\u gru/opaque\u kernel:0

问题是,我不知道为什么会发生这种情况,因为通过遵循变量tensorflow引用,它似乎是好的。另一方面,我也尝试以不同的方式编写它,因为tensorflow文档声明我上面的实现和我接下来展示的实现实际上是相同的:

tf.reset_default_graph()

def create_model():
    return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,
                         direction='unidirectional')

# (time, batch_size, num_inputs)
x = tf.random_normal((100, 16, 100))

with tf.variable_scope('model'):
    model_1 = create_model()
    rnn_out_1, rnn_state_1 = model_1(x)
with tf.variable_scope('model', reuse=True):
    model_2 = create_model()
    rnn_out_2, rnn_state_2 = model_2(x)
第二种方法确实有效(或者至少我认为有效)。因此,我不知道在第一个实现中我做错了什么,我也不确定两个实现是否应该做相同的事情(我认为它们应该这样做)。 那么,有没有人能帮我找出我做错了什么或者我不能正确理解的事情


提前感谢

Cudngru看起来像keras风格的模型对象。因此,您应该重用对象以在层之间共享参数,如

def create_model():
    return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,
                                  direction='unidirectional')


# (time, batch_size, num_inputs)
x = tf.random_normal((100, 16, 100))

model = create_model()
rnn_out_1, rnn_state_1 = model(x)
rnn_out_2, rnn_state_2 = model(x)
我不知道为什么只有第二条路运行正常

编辑

我发现CudnnGRU在其当前变量范围内为其变量指定唯一的变量名

在第一种方式中,model_2使用了一个新名称,如cudnn_gru_1,以使其名称唯一。另一方面,在第二种方法中,您创建了一个新的变量范围,因此模型_2的唯一变量名与模型_1的唯一变量名匹配


您可以找到CudnnGRU在层中创建唯一变量名的原因。_set_scope()(tensorflow\python\layers\base.py#L150)。Layer类使用默认的_name参数为其变量创建一个新的变量范围(在本例中范围为None),因此其名称变得唯一。

Cudngru看起来像keras样式的模型对象。因此,您应该重用对象以在层之间共享参数,如

def create_model():
    return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,
                                  direction='unidirectional')


# (time, batch_size, num_inputs)
x = tf.random_normal((100, 16, 100))

model = create_model()
rnn_out_1, rnn_state_1 = model(x)
rnn_out_2, rnn_state_2 = model(x)
我不知道为什么只有第二条路运行正常

编辑

我发现CudnnGRU在其当前变量范围内为其变量指定唯一的变量名

在第一种方式中,model_2使用了一个新名称,如cudnn_gru_1,以使其名称唯一。另一方面,在第二种方法中,您创建了一个新的变量范围,因此模型_2的唯一变量名与模型_1的唯一变量名匹配


您可以找到CudnnGRU在层中创建唯一变量名的原因。_set_scope()(tensorflow\python\layers\base.py#L150)。Layer类使用默认的_name参数为其变量创建一个新的变量作用域(在本例中作用域为None),因此其名称变得唯一。

那么这实际上不是CudnnGRU的问题,而是每个层的问题?我理解你所说的两种不同的方式和它们的不同之处,但是如果它们很好地实现了相同的行为,它们不应该真的有吗?是否应该报告为bug?是的,我认为这是从层继承的层中的常见问题。这种行为并不直观,但我们应该使用相同的层对象来共享参数,所以我认为这不是一个重要的错误。所以这实际上不是cudngru的问题,而是每个层的问题?我理解你所说的两种不同的方式和它们的不同之处,但是如果它们很好地实现了相同的行为,它们不应该真的有吗?是否应该报告为bug?是的,我认为这是从层继承的层中的常见问题。这种行为并不直观,但我们应该使用相同的层对象来共享参数,所以我认为这不是一个重要的bug。