一、name_scope 与 variable_scope:
- name_scope: * tf.name_scope() 主要是用来管理命名空间的,这样子让我们的整个模型更加有条理。为了更好地管理变量的命名空间而提出的。比如在 tensorboard 中,因为引入了 name_scope, 我们的 Graph 看起来才井然有序。
- variable_scope: * 而 tf.variable_scope() 的作用是为了实现变量共享,它和 tf.get_variable() 来完成变量共享的功能。
先单独来体会一下 :
1、name_scope
和 variable_scope
的作用:
用来做图的命名管理的:产生图和子图的层次
不使用 name_scope 时,则创建 variable 时,默认使用 placeholder:0,当赋值 name 时,则使用name, 同一个图上出现相同 名时,自动加 _n 进行扩展
每个张量都有一个名称,而且是唯一的,张量的命名规则是“node:src_output”,node表示结点,src_output表示当前张量来自结点的第几个输出(从0开始)。
import tensorflow as tf
import os
os.environ["TF_FORCE_GPU_ALLOW_GROWTH"] = "true"
v1 = tf.placeholder(tf.float32, shape=[2,3,4])
print(v1.name)
v1 = tf.placeholder(tf.float32, shape=[2,3,4])
print(v1.name)
得到的结果:
# 当传入同样命名时:
v1 = tf.placeholder(tf.float32, shape=[2,3,4], name='ph')
print(v1.name)
v1 = tf.placeholder(tf.float32, shape=[2,3,4], name='ph')
print(v1.name)
print(type(v1))
print(v1)
当使用 name_scope
和 variable_scope
,可以看作是创建子图,相应的上面节点的 name 路径也会改变,如下
# 2、name_scope 和 variable_scope,构建子图:
with tf.name_scope('new1'):
v3 = tf.placeholder(tf.float32, shape=[2,3,4], name='v3_name_scope')
print(v3.name)
with tf.variable_scope('new1'): # 由于与上面子图重名了,不会直接复用上面子图,而是单独创建另外一个
v4 = tf.placeholder(tf.float32, shape=[2,3,4], name='v3_name_scope')
print(v4.name)
两者明显的区别就是:
name_scope 只是明显的创建一个子图,用于命名管理,但是 variable_scope 是创建共享子图, 它和 tf.get_variable() 来完成变量共享的功能。
在对应的子图空间上,使用 scope.reuse_variables() 即可使此子图上通过 tf.get_variable() 共享参数
with tf.variable_scope('nsc1') as scope:
v3 = tf.get_variable(name='hello', shape=[])
print('v3.name: ', v3.name)
# tf.get_variable_scope().reuse_variables()
scope.reuse_variables()
v4 = tf.get_variable(name='hello', shape=[])
print('v4.name: ', v4.name)
二、name_scope 与 variable_scope:
1.tf.Variable()
tf.Variable(initializer,name)
功能:tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创建不同的变量。
参数:
initializer:初始化参数;
name:可自定义的变量名称
举例:
import tensorflow as tf
v1=tf.Variable(tf.random_normal(shape=[2,3],mean=0,stddev=1),name='v1')
v2=tf.Variable(tf.constant(2),name='v2')
v3=tf.Variable(tf.ones([2,3]),name='v3')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(v1))
print(sess.run(v2))
print(sess.run(v3))
2.tf.get_variable()
tf.get_variable(
name,
shape=None,
dtype=None,
initializer=None,
regularizer=None,
trainable=None,
collections=None,
caching_device=None,
partitioner=None,
validate_shape=True,
use_resource=None,
custom_getter=None,
constraint=None,
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.VariableAggregation.NONE
)
功能:tf.get_variable创建变量时,会进行变量检查,当设置为共享变量时(通过scope.reuse_variables()或tf.get_variable_scope().reuse_variables()),检查到第二个拥有相同名字的变量,就返回已创建的相同的变量;如果没有设置共享变量,则会报[ValueError: Variable varx alreadly exists, disallowed.]的错误。
参数:
name:新变量或现有变量的名称
shape:新变量或现有变量的形状
dtype:新变量或现有变量的类型(默认为DT_FLOAT)。
initializer:变量初始化的方式
初始化方式:
tf.constant_initializer:常量初始化函数
tf.random_normal_initializer:正态分布
tf.truncated_normal_initializer:截取的正态分布
tf.random_uniform_initializer:均匀分布
tf.zeros_initializer:全部是0
tf.ones_initializer:全是1
tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值
举例:
v1=tf.Variable(tf.random_normal(shape=[2,3],mean=0,stddev=1),name='v1')
v2=tf.Variable(tf.random_normal(shape=[2,3],mean=0,stddev=1),name='v1')
v3=tf.Variable(tf.ones([2,3]),name='v3')
a1 = tf.get_variable(name='a1', shape=[2, 3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
a2 = tf.get_variable(name='a2', shape=[2, 3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
a3 = tf.get_variable(name='a3', shape=[2, 3], initializer=tf.ones_initializer())
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run(v1))
print(sess.run(v2))
print(sess.run(v3))
print(sess.run(a1))
print(sess.run(a2))
print(sess.run(a3))
v1和v2的参数完全相同,创建时候不会报错;a1和a2的参数完全相同,创建时候会报错
3.tf.placeholder()
tf.placeholder(
dtype,
shape=None,
name=None
)
功能:在tensorflow中类似于函数参数,运行时必须传入值。
TensorFlow链接:https://tensorflow.google.cn/api_docs/python/tf/placeholder?hl=en
参数:
dtype:要进给的张量中的元素类型。常用的是tf.float32,tf.float64等数值类型。
shape:要进给的张量的形状(可选)。如果未指定形状,则可以提供任何形状的张量。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定。
name:操作的名称(可选)。
举例:
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
with tf.Session() as sess:
print(sess.run(output, feed_dict={input1: [23.], input2: [4.]})) # [92.]
三、如何使用get_variable实现参数共享
参考: Tensorflow 学习笔记之 共享变量
参考:
https://blog.csdn.net/dili8870/article/details/101506808
https://blog.csdn.net/Jerr__y/article/details/70809528