表示,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)
我是否必须明确设置选项:reuse
和scope
:
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)
或者这是如何工作的?
答案 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。