import tensorflow as tf
"""
本节目的:
1、变量命名域 和 命名域
2、tf.get_variable()使用
"""
def f1 ( ) :
"""
基于tf.Variable()构建一个新的变量
:return:
"""
w = tf. Variable(
initial_value= tf. random_normal( shape= [ 2 ] , mean= 0.0 , stddev= 1.0 ) ,
dtype= tf. float32,
name= 'w'
)
return w
def f2 ( initializer= tf. random_normal_initializer( mean= 0.0 , stddev= 1.0 ) ) :
"""
使用tf.get_variable() 获取或创建一个变量
:return:
"""
"""
tf.get_variable(name, # 变量的名字,必须给定。
shape=None, # 形状
dtype=None, # 数据类型
initializer=None, # 给定变量产生初始值的方式,就是初始化器。
regularizer=None, # 正则化项
trainable=True, # 变量是否参数模型训练
collections=None,
caching_device=None,
partitioner=None,
validate_shape=True,
use_resource=None,
custom_getter=None,
constraint=None):
功能:基于给定的name从tf底层获取对应的tensor变量,如果name存在,那么直接获取存在的变量。
如果不存在,才创建一个新的变量。
注意:根据name获取存在的变量,只支持使用tf.get_variable()创建的变量。
"""
w = tf. get_variable(
name= 'w' , shape= [ 2 ] , dtype= tf. float32, initializer= initializer
)
return w
def h1 ( ) :
"""
学习变量如何重用。
:return:
"""
w11 = f1( )
w12 = f1( )
w21 = f2( )
tf. get_variable_scope( ) . reuse_variables( )
w22 = f2( )
print ( 'w11 name:{} - w12 name:{} - w21 name:{} - w22 name:{}' . format ( w11. name, w12. name, w21. name, w22. name) )
print ( 'w21 等于w22吗?:{}' . format ( w21 == w22) )
with tf. Session( ) as sess:
sess. run( tf. global_variables_initializer( ) )
print ( sess. run( [ w11, w12, w21, w22] ) )
"""
1、使用 变量命名域;
2、使用 tf.name_scope()
3、使用 tf.trainable_variables() ,再通过变量的名字,批量的获取变量。
"""
"""
tf.variable_scope()(self,
name_or_scope, # 变量命名域的名字(string)
default_name=None, # 默认的名字。 如果name_or_scope为空,那么使用default_name定义的名字。如果name_or_scope不为空,使用name_or_scope定义的名字。
values=None, # 输入的数据tensor
initializer=None, # 初始化器。
regularizer=None, # 正则化项
caching_device=None,
partitioner=None,
custom_getter=None,
reuse=None, # 变量命名域的变量 是否重用。
dtype=None,
use_resource=None,
constraint=None,
auxiliary_name_scope=True):
"""
def h2 ( ) :
with tf. name_scope( 'n1' ) , tf. variable_scope( 't1' ) :
w11 = f1( )
w12 = f1( )
with tf. variable_scope( 't2_2' , reuse= tf. AUTO_REUSE) :
with tf. name_scope( 'n2' ) :
with tf. variable_scope( 't2' , initializer= tf. constant_initializer( 28.0 ) ) :
w21 = f2( initializer= None )
w22 = f2( )
with tf. name_scope( 'n3' ) :
with tf. variable_scope( 't3' ) :
rezult = tf. add( w11 + w12 + w21, w22, name= 'add_rezult' )
print ( 'w11 name:{} - w12 name:{} - w21 name:{} - w22 name:'
'{}' . format ( w11. name, w12. name, w21. name, w22. name) )
print ( rezult. name)
print ( 'w21 等于w22吗?:{}' . format ( w21 == w22) )
with tf. Session( ) as sess:
sess. run( tf. global_variables_initializer( ) )
print ( sess. run( [ rezult, w11, w12, w21, w22] ) )
temp = tf. get_default_graph( ) . get_tensor_by_name( 'n1/t1/w:0' )
print ( sess. run( temp) )
def h3 ( ) :
"""
学习的tf.trainable_variables() 的使用
:return:
"""
with tf. name_scope( 'n1' ) , tf. variable_scope( 't1' ) :
w11 = f1( )
w12 = f1( )
with tf. variable_scope( 't2_2' , reuse= tf. AUTO_REUSE) :
with tf. name_scope( 'n2' ) :
with tf. variable_scope( 't2' , initializer= tf. constant_initializer( 28.0 ) ) :
w21 = f2( )
w22 = f2( )
with tf. name_scope( 'n3' ) :
with tf. variable_scope( 't3' ) :
rezult = tf. add( w11 + w12 + w21, w22, name= 'add_rezult' )
print ( 'w11 name:{} - w12 name:{} - w21 name:{} - w22 name:'
'{}' . format ( w11. name, w12. name, w21. name, w22. name) )
print ( rezult. name)
print ( 'w21 等于w22吗?:{}' . format ( w21 == w22) )
vars_list = tf. trainable_variables( )
vars_n1 = [ var for var in vars_list if var. name. startswith( 'n1' ) ]
print ( len ( vars_n1) , vars_n1)
if __name__ == '__main__' :
h3( )
D: \Anaconda\python. exe D: / AI20/ HJZ/ 04 - 深度学习/ 2 - TensorFlow基础/ tf_基础代码/ 01_01Graph和Session. py
Tensor( "add:0" , shape= ( 3 , 5 ) , dtype= float32) Tensor( "add_1:0" , shape= ( 5 , 3 ) , dtype= float32) Tensor( "MatMul:0" , shape= ( 3 , 3 ) , dtype= float32)
2019 - 11 - 30 21 : 48 : 46.784223 : I tensorflow/ core/ platform/ cpu_feature_guard. cc: 141 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
< tensorflow. python. client. session. InteractiveSession object at 0x000001F7E5243C50 >
[ [ 1.812333 2.812333 3.812333 ]
[ 2.812333 4.812333 4.812333 ]
[ 42.812332 2.812333 1.812333 ]
[ 0.812333 2.812333 3.812333 ]
[ 3.812333 3.812333 3.812333 ] ]
[ [ 167.58363 55.201057 57.354843 ]
[ 185.88797 84.505394 89.65919 ]
[ 216.18613 69.80354 72.95732 ] ]
Process finished with exit code 0