name_scope和variable_scope的区别

name_scope和variable_scope的区别

tensorflow创建variable的2种方式

tf.Variable

tf.Variable():只要使用该函数,一律创建新的variable,如果出现重名,变量名后面会自动加上后缀1,2….

tf.get_variable().

tf.get_variable():在不使用reuse_variables()函数的前提下,如果出现重名,则会报错,如果使用了reuse_variables()函数,重名则使用以前创建的变量,如果不存在,则新创建一个变量。

variable函数在name_scope作用域下的使用

from __future__ import print_function
import tensorflow as tf
tf.set_random_seed(1) # reproducible

with tf.name_scope("a_name_scope"):
    initializer = tf.constant_initializer(value=1)
    var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32,initializer=initializer)
    var2 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
    var21 = tf.Variable(name='var2', initial_value=[2.1], dtype=tf.float32)
    var22 = tf.Variable(name='var2', initial_value=[2.2], dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(var1.name)
    print(sess.run(var1))
    print(var2.name)
    print(sess.run(var2))
    print(var21.name)
    print(sess.run(var21))
    print(var22.name)
    print(sess.run(var22))

运行效果:
在这里插入图片描述
其中,:后的0表示此变量下的第一个元素
由此可以得出一个结论:
在name_scope作用域中,使用tf.get_variable()的时候,tf.name_scope()就不会给 tf.get_variable()创建出来的Variable加前缀。但是 tf.Variable() 创建出来的就会受到 name_scope 的影响。
即get_variable()会无视name_scope。

variable函数在variable_scope作用域下的使用

from __future__ import print_function
import tensorflow as tf
tf.set_random_seed(1) # reproducible

with tf.variable_scope("a_variable_scope") as scope:
    initializer = tf.constant_initializer(value=3)
    var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer)
    var4 = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
    var4_reuse = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(var3)
    print(sess.run(var3))
    print(var4)
    print(sess.run(var4))
    print(var4_reuse)
    print(sess.run(var4_reuse))

运行效果:
在这里插入图片描述
在variable_scope作用域中,使用tf.get_variable()和tf.Variable() 创建出来的variable都会受到 variable_scope的影响。

reuse_variables()的作用

在tensorflow中变量共享机制是通过tf.variable_scope()和tf.get_variable()两者搭配使用来实现的。
其中,实现变量共享机制主要依靠reuse_variables()函数。

from __future__ import print_function
import tensorflow as tf
tf.set_random_seed(1) # reproducible

with tf.variable_scope("a_variable_scope") as scope:
    initializer = tf.constant_initializer(value=3)
    var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer)
    # scope.reuse_variables()
    var3_reuse = tf.get_variable(name='var3')
with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(var3)
    print(sess.run(var3))
    print(var3_reuse)
    print(sess.run(var3_reuse))

代码如上,我们想要共享var3 变量,但是我们将scope.reuse_variables()注释掉了,运行会报以下错误:
在这里插入图片描述
但是,当我们取消注释scope.reuse_variables(),运行效果如下:
在这里插入图片描述
则成功实现了变量共享。

在这里插入图片描述

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值