Tensorflow函数说明(4)—— variable_scope/name_scope
来源:互联网 发布:企业it数据基础设施 编辑:程序博客网 时间:2024/05/25 19:59
主要针对 tf.get_variable 来介绍共享变量的用法。
tf.get_variable 与 tf.variable 的用法不同。前者在创建变量时会查名字,如果给的名字在之前已经被别的变量占用,则会报错,不会创建相应变量。而后者并不进行检查,如果有重复,则自动的修改名字,加上数字来进行区别。所以从这来看要想共享变量并不能通过使用相同的名字来调用多次 tf.get_variable 和 tf.variable 做到。
比如下面这样的代码:
def my_image_filter(input_images): conv1_weights = tf.Variable(tf.random_normal([5, 5, 32, 32]), name="conv1_weights") conv1_biases = tf.Variable(tf.zeros([32]), name="conv1_biases") conv1 = tf.nn.conv2d(input_images, conv1_weights, strides=[1, 1, 1, 1], padding='SAME') relu1 = tf.nn.relu(conv1 + conv1_biases) conv2_weights = tf.Variable(tf.random_normal([5, 5, 32, 32]), name="conv2_weights") conv2_biases = tf.Variable(tf.zeros([32]), name="conv2_biases") conv2 = tf.nn.conv2d(relu1, conv2_weights, strides=[1, 1, 1, 1], padding='SAME') return tf.nn.relu(conv2 + conv2_biases)
在这个函数中,我们有 'conv1_weights','conv1_biases','conv2_weights','conv2_biases' 4个变量。如果我们重用这个函数,则会产生多组变量,并不会使用相同的变量,如下面调用:# First call creates one set of variables.result1 = my_image_filter(image1)# Another set is created in the second call.result2 = my_image_filter(image2)
上面实际上用两个不同的滤波器对 image1 和 image2 进行滤波,虽然用的是相同的函数。所以呢,这就产生了问题,下面介绍如何进行变量共享。我们使用 with tf.variable_scope 来进行共享。比如有下面的代码:
def conv_relu(input, kernel_shape, bias_shape): # Create variable named "weights". weights = tf.get_variable("weights", kernel_shape, initializer=tf.random_normal_initializer()) # Create variable named "biases". biases = tf.get_variable("biases", bias_shape, initializer=tf.constant_intializer(0.0)) conv = tf.nn.conv2d(input, weights, strides=[1, 1, 1, 1], padding='SAME') return tf.nn.relu(conv + biases)def my_image_filter(input_images): with tf.variable_scope("conv1"): # Variables created here will be named "conv1/weights", "conv1/biases". relu1 = conv_relu(input_images, [5, 5, 32, 32], [32]) with tf.variable_scope("conv2"): # Variables created here will be named "conv2/weights", "conv2/biases". return conv_relu(relu1, [5, 5, 32, 32], [32])
若要调用两次 my_image_filter 并且使用相同的变量,则如下所示:with tf.variable_scope("image_filters") as scope: result1 = my_image_filter(image1) scope.reuse_variables() result2 = my_image_filter(image2)
利用 reuse_variables() 来使变量重用。值得注意的是下面的代码解释了tf.get_variable 工作原理:with tf.variable_scope("foo"): v = tf.get_variable("v", [1])with tf.variable_scope("foo", reuse=True): v1 = tf.get_variable("v", [1])assert v1 == v
如果 reuse 开启,当检查到有相同的名字时,直接返回那个有相同名字的变量而不是重新定义一个再复制值。下面是使用时需要注意的地方
1. 在 variable_scope 里面的 variable_scope 会继承上面的 reuse 值,即上面一层开启了 reuse ,则下面的也跟着开启。但是不能人为的设置 reuse 为 false ,只有退出 variable_scope 才能让 reuse 变为 false:
with tf.variable_scope("root"): # At start, the scope is not reusing. assert tf.get_variable_scope().reuse == False with tf.variable_scope("foo"): # Opened a sub-scope, still not reusing. assert tf.get_variable_scope().reuse == False with tf.variable_scope("foo", reuse=True): # Explicitly opened a reusing scope. assert tf.get_variable_scope().reuse == True with tf.variable_scope("bar"): # Now sub-scope inherits the reuse flag. assert tf.get_variable_scope().reuse == True # Exited the reusing scope, back to a non-reusing one. assert tf.get_variable_scope().reuse == False
2. 当在某一 variable_scope 内使用别的 scope 的名字时,此时不再受这里的等级关系束缚,直接与使用的 scope 的名字一样:
with tf.variable_scope("foo") as foo_scope: assert foo_scope.name == "foo"with tf.variable_scope("bar") with tf.variable_scope("baz") as other_scope: assert other_scope.name == "bar/baz" with tf.variable_scope(foo_scope) as foo_scope2: assert foo_scope2.name == "foo" # Not changed.
3. name_scope 与 variable_scope 稍有不同。name_scope 只会影响 ops 的名字,而并不会影响 variables 的名字。
with tf.variable_scope("foo"): with tf.name_scope("bar"): v = tf.get_variable("v", [1]) x = 1.0 + vassert v.name == "foo/v:0"assert x.op.name == "foo/bar/add"
1 0
- Tensorflow函数说明(4)—— variable_scope/name_scope
- tensorflow 中 variable_scope 与name_scope函数解析
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- Tensorflow-variable_scope,name_scope
- tensorflow name_scope variable_scope
- tensorflow variable_scope\name_scope
- tensorflow name_scope && variable_scope
- Tensorflow函数——tf.variable_scope()
- tensorflow 中 name_scope和variable_scope
- tensorflow 中的 name_scope 与 variable_scope
- TensorFlow基础name_scope与variable_scope
- tensorflow scope命名方法(variable_scope()与name_scope()解析)
- tensorflow 中 name_scope 及 variable_scope 的异同
- Tensorflow name_scope和variable_scope的区别
- tensorflow:上下文管理器 与 name_scope, variable_scope
- TensorFlow:作用域name_scope和variable_scope
- TensorFlow中,variable_scope和name_scope的不同之处
- tensorflow: name_scope 和 variable_scope的差别
- 【JZOJ100003】【NOI2017模拟.4.1】 Tree
- (转)贝莱德,从零到五万亿
- poj 2728 Desert King(最优比率生成树)
- Java接口
- Unity3D的相机跟随、视野缩放以及旋转
- Tensorflow函数说明(4)—— variable_scope/name_scope
- 2014第五届 蓝桥杯C语言B组预赛题
- 浏览器渲染原理
- 自绘控件开发探索3--如何实现view的平滑移动
- Hibernate学习记录1 基本概念
- 期货交易的异常交易认定标准
- 开源 java CMS
- 关于django项目部署在服务器上的二三事
- poj 3580 SuperMemo