我什么时候必须在tensorflow中显式使用重用选项

时间:2017-05-30 13:10:11

标签: tensorflow deep-learning

在Tensorflow文档中,

表示,variable_scope内的所有内容都会继承reuse选项,如下所示:

with tf.variable_scope("name", reuse=True):
    # inherits reuse=True

但我的问题是,例如我使用其中一种辅助方法:

fc = tf.contrib.layers.fully_connected(input, 512, activation_fn=tf.nn.relu, weights_initializer=tf.contrib.layers.xavier_initializer(uniform=False))

norm = tf.contrib.layers.batch_norm(conv, 0.9, epsilon=1e-5, activation_fn=tf.nn.relu, scope=scope, fused=True)

我是否必须明确设置选项:reusescope

fc = tf.contrib.layers.fully_connected(input, 512, activation_fn=tf.nn.relu, weights_initializer=tf.contrib.layers.xavier_initializer(uniform=False), scope=scope, reuse=True)

norm = tf.contrib.layers.batch_norm(conv, 0.9, epsilon=1e-5, activation_fn=tf.nn.relu, scope=scope, reuse=True, is_training=self.is_training, fused=True)

或者这是如何工作的?

2 个答案:

答案 0 :(得分:0)

  

我是否必须设置选项:如下所示显式重用和范围:

reuse参数旨在重用图中不同操作系统之间的现有变量Sharing Variables。在神经网络训练步骤期间,学习参数;因此,要在验证期间使用这些学习参数,您可以使用reuse参数检索变量,而无需重置值或不重新创建这些变量。

优良作法是跟踪reuse参数

# a usual CNN model definition with reuse parameter
def model(input, reuse=None):
    fc = tf.contrib.layers.fully_connected(input, 512,activation_fn=tf.nn.relu,   
         weights_initializer=tf.contrib.layers.xavier_initializer(uniform=False),   
         scope=scope, reuse=reuse)

    norm = tf.contrib.layers.batch_norm(conv, 0.9, epsilon=1e-5,
        activation_fn=tf.nn.relu, scope=scope, reuse=reuse, 
        is_training=self.is_training, fused=True)
    ...


# Now for training; setting reuse=None creates the graph variables
some_ouput = model(input, reuse=None)

# Now for validation; setting reuse=True; retrieve the learned variables for validation without creating new one.
some_output = model(input, reuse=True) 

答案 1 :(得分:-1)

首先,谷歌周围!这应该回答您的问题:Tensorflow variable scope: reuse if variable exists

但如果不是.. 如果您实际重用模型的一部分,则需要调用重用,而不是在使用图层时。假设您有一个定义为:

的函数
def func(input,scope=scope, reuse=reuse):
    fc = tf.contrib.layers.fully_connected(input, ..., scope=scope, reuse=reuse)
    norm = tf.contrib.layers.batch_norm(fc, ..., scope=scope, reuse=reuse) 
    return norm

范围将定义变量的名称空间(详细了解范围What's the difference of name scope and a variable scope in tensorflow?https://jasdeep06.github.io/posts/variable-sharing-in-tensorflow/Understanding Variable scope example in Tensorflow),因此一旦使用scope ='scp'运行函数并输入.shape =(1,2,3),你将无法使用相同的范围和input.shape =(3,4,5)运行相同的函数,因为具有给定范围和不同形状的变量已经存在。 因此,第二次调用函数时应该使用reuse = True。