一、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)
以上这篇TensorFLow 变量命名空间实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]