3-Tensorflow-demo_06_tfget_variable和变量命名域


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:
    """
    # 1、调用tf.Variable() 创建2个变量
    w11 = f1()
    w12 = f1()

    # 2、调用tf.get_variable() 创建2个变量
    w21 = f2()
    # todo 需要设置一下,告诉tf针对重复的变量,允许直接获取重用的操作。
    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():
    # 1、调用tf.Variable() 创建2个变量
    with tf.name_scope('n1'), tf.variable_scope('t1'):
        w11 = f1()
        w12 = f1()

    # 调用tf.get_variable() 创建2个变量
    with tf.variable_scope('t2_2', reuse=tf.AUTO_REUSE):  # 父域 会对子域有影响
        with tf.name_scope('n2'):  # tf.name_scope对 tf.get_variable()定义的变量不起作用
            with tf.variable_scope('t2', initializer=tf.constant_initializer(28.0)):
                # 如果tf.get_variable()定义的变量没有给定初始化器,那么首先会从变量命名域中找初始化器。
                w21 = f2(initializer=None)
                w22 = f2()

    # fixme 操作对象,一样也可以被命名。
    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]))
        # 基于tensor底层的名字,直接从图中获取对应的tensor对象,然后再获取其真实值。
        temp = tf.get_default_graph().get_tensor_by_name('n1/t1/w:0')
        print(sess.run(temp))



def h3():
    """
    学习的tf.trainable_variables() 的使用
    :return:
    """
    # 1、调用tf.Variable() 创建2个变量
    with tf.name_scope('n1'), tf.variable_scope('t1'):
        w11 = f1()
        w12 = f1()

    # 调用tf.get_variable() 创建2个变量
    with tf.variable_scope('t2_2', reuse=tf.AUTO_REUSE):  # 父域 会对子域有影响
        with tf.name_scope('n2'):  # tf.name_scope对 tf.get_variable()定义的变量不起作用
            with tf.variable_scope('t2', initializer=tf.constant_initializer(28.0)):
                # 如果tf.get_variable()定义的变量没有给定初始化器,那么首先会从变量命名域中找初始化器。
                w21 = f2()
                w22 = f2()

    # fixme 操作对象,一样也可以被命名。
    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)
    #
    # with tf.Session() as sess:
    #     sess.run(tf.global_variables_initializer())
    #     print(sess.run([rezult, w11, w12, w21, w22]))
    #     # 基于tensor底层的名字,直接从图中获取对应的tensor对象,然后再获取其真实值。
    #     temp = tf.get_default_graph().get_tensor_by_name('n1/t1/w:0')
    #     print(sess.run(temp))


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值