TensorFLow 变量命名空间实例

作者:man_world 时间:2021-06-09 04:40:14 

一、name_scope

with tf.name_scope(name):

name_scope: 为了更好地管理变量的命名空间而提出的。比如在 tensorboard 中,因为引入了 name_scope, 我们的 Graph 看起来才井然有序。

name_scope 对 get_variable 创建变量的 name 没有影响,即 get_variable 创建的变量不在 name_scope 这个命名空间中

二、variable_scope

with tf.variable_scope(name_or_scope, reuse=None):

variable_scope: 大部分情况下,跟 tf.get_variable() 配合使用,实现变量共享的功能

可通过tf.get_variable_scope().reuse == True/False 判断参变量是否共享

当前变量作用域可以用tf.get_variable_scope()进行检索并且reuse 标签可以通过调用tf.get_variable_scope().reuse_variables()设置为True

三、共享参变量

1、方法

使用 tf.Variable() 创建同一个 name 的变量(操作名不同),均不会报错,但系统会自动修改 name(实质还是不让共享参变量)

使用 tf.get_varible() 创建同一个 name 的变量(操作名不同),均会报错(为了避免无意识的参变量复用造成的错误)

我们可以在 variable_scope 中使用 tf.get_variable() 创建变量,并通过 with tf.variable_scope(name_or_scope, reuse=True) 来共享参变量:

reuse=True:将只能获取命名空间中已经创建过的变量,如果变量不存在,则tf.get_variable函数将报错。

reuse=None / False:tf.get_variable操作将创建新的变量,如果同名的变量已经存在,则tf.get_variable函数将报错。

2、代码示例


# 下面是定义一个卷积层的通用方式
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() 两次
result1 = my_image_filter(image1)
result2 = my_image_filter(image2)
>>> Raises ValueError(... conv1/weights already exists ...), tf.get_variable()会检测已经存在的变量是否已经共享

# 解决方法一, 可以在设计网络时加上一个布尔型的 reuse 参数
with tf.variable_scope("image_filters"):
 result1 = my_image_filter(image1)
with tf.variable_scope("image_filters", reuse=True):
 result2 = my_image_filter(image2)

# 解决方法二
with tf.variable_scope("image_filters") as scope:
 # 下面我们两次调用 my_image_filter 函数,但是由于引入了变量共享机制
 # 可以看到我们只是创建了一遍网络结构。
 result1 = my_image_filter(image1)
 scope.reuse_variables()
 result2 = my_image_filter(image2)

# 解决方法三
with tf.variable_scope("image_filters") as scope:
 result1 = my_image_filter(image1)
with tf.variable_scope(scope, reuse=True):
 result2 = my_image_filter(image2)

# 打印出所有的可训练参变量
vs = tf.trainable_variables()
print('There are %d trainable_variables in the Graph: ' % len(vs))
for v in vs:
 print(v)

# 输出结果证明确实:参变量共享,因为只有四个变量,没有创建新的变量。
There are 4 trainable_variables in the Graph:
Tensor("image_filters/conv1/weights/read:0", shape=(5, 5, 32, 32), dtype=float32)
Tensor("image_filters/conv1/biases/read:0", shape=(32,), dtype=float32)
Tensor("image_filters/conv2/weights/read:0", shape=(5, 5, 32, 32), dtype=float32)
Tensor("image_filters/conv2/biases/read:0", shape=(32,), dtype=float32)

四、取出所有可训练参数


# Returns all variables created with trainable=True in a var_list
var_list = tf.trainable_variables()

init = tf.global_variables_initializer()
sess.run(init)

for var in var_list:
 sess.run(var)

来源:https://blog.csdn.net/mzpmzk/article/details/78647688

标签:TensorFLow,变量,命名空间
0
投稿

猜你喜欢

  • django 发送手机验证码的示例代码

    2023-05-07 03:42:37
  • python实现字符串完美拆分split()的方法

    2023-08-25 13:50:36
  • pygame游戏之旅 调用按钮实现游戏开始功能

    2023-04-19 06:36:44
  • 用好Frontpage中的各种回车

    2008-02-21 14:33:00
  • 利用python实现万年历的查询

    2023-02-24 03:16:01
  • Python根据字典值对字典进行排序的三种方法实例

    2022-07-29 16:24:21
  • 利用Python求解阿基米德分牛问题

    2023-11-10 09:36:48
  • python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例

    2021-05-05 15:44:10
  • python实现复制整个目录的方法

    2023-04-08 18:14:47
  • python绘制散点图并标记序号的方法

    2023-12-22 09:59:49
  • 让数据站住脚-浅谈用户研究中的信度与效度

    2010-09-10 13:14:00
  • Python破解excel进入密码的过程详解

    2021-06-14 03:06:25
  • python将MongoDB里的ObjectId转换为时间戳的方法

    2022-08-08 04:33:01
  • SQL查询入门(上篇) 推荐收藏

    2011-09-30 11:47:11
  • 客齐集社区头像显示效果代码

    2008-04-03 13:15:00
  • OpenCV立体图像深度图Depth Map基础

    2021-09-23 22:12:59
  • 简单了解django缓存方式及配置

    2022-11-20 05:04:17
  • Python实现免费音乐下载器

    2023-12-26 23:51:16
  • Access函数大全

    2009-12-23 19:22:00
  • 基于opencv和pillow实现人脸识别系统(附demo)

    2023-04-06 10:28:53
  • asp之家 网络编程 m.aspxhome.com