[tensorflow] 一句话揭露 tf.Variable() 和tf.get_variable()、tf.name_scope()和tf.variable_scope() 的本质区别!

本文介绍了TensorFlow中变量tf.Variable()与tf.get_variable()的区别,以及命名空间tf.name_scope()与tf.variable_scope()的使用方式。通过示例代码详细展示了不同函数在变量声明与复用方面的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tf.Variable() :局部变量。

    特点:永远生成新的变量,不会与已存在的variable重名

tf.name_scope():局部空间。

    特点:永远生成新的命名空间,不会与已存在的name_scope、variable_scope冲突 ,也就是说name_scope也是局部的、临时的

tf.get_variable():全局变量。

    特点:可共享,不能重复,解决了众多方法调用时 参数来回传递的困境,

 tf.variable_scope():全局空间。

    特点:跟get_variable()性质雷同,如果当前已存在同名variable_scope,则重复使用已存在的。


import tensorflow as tf;


with tf.variable_scope('V'):#新建V全局空间
    a1 = tf.get_variable(name='var', shape=[1], initializer=tf.constant_initializer(1))#V/var
    a2 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') # 新建变量名 V/var_1
with tf.variable_scope('V',reuse=True):
    a3 = tf.get_variable(name='var', shape=[1], initializer=tf.constant_initializer(1)) #使用已存在的全局空间V/var
    a4 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') #检查V已存在,新建局部空间V_1/var
    a5 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') #在当前局部变量下再新建变量V_1/var_1

with tf.variable_scope('V',reuse=True):
    a6 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') # 全局空间已存在,创建新的V_2 作为局部空间
    a7 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')

a8 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var') #无临时空间
a9 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')


with tf.name_scope('V_3'): #新建局部空间V_3,
    a10 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')
    a11 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')#变量会新建name

with tf.name_scope('V_3'):#再次调用已存在的局部空间,但是此时会新建一个name_scope 增加后缀编号V_3_1
    a12 = tf.Variable(tf.random_normal(shape=[2, 3], mean=0, stddev=1), name='var')

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print('a1.name=%s'%a1.name)
    print('a2.name=%s'%a2.name)
    print('a3.name=%s'%a3.name)
    print('a4.name=%s'%a4.name)
    print('a5.name=%s'%a5.name)
    print('a6.name=%s'%a6.name)
    print('a7.name=%s'%a7.name)
    print('a8.name=%s'%a8.name)
    print('a9.name=%s'%a9.name)
    print('a10.name=%s'%a10.name)
    print('a11.name=%s'%a11.name)
    print('a12.name=%s'%a12.name)
   

输出:

a1.name=V/var:0
a2.name=V/var_1:0
a3.name=V/var:0
a4.name=V_1/var:0
a5.name=V_1/var_1:0
a6.name=V_2/var:0
a7.name=V_2/var_1:0
a8.name=var:0
a9.name=var_1:0
a10.name=V_3/var:0
a11.name=V_3/var_1:0
a12.name=V_3_1/var:0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值