如何理解name_scope / variable_scope 与 tf.Variable()、tf.get_variable()和tf.placeholder() 的区别

一、name_scope 与 variable_scope:

  • name_scope: * tf.name_scope() 主要是用来管理命名空间的,这样子让我们的整个模型更加有条理。为了更好地管理变量的命名空间而提出的。比如在 tensorboard 中,因为引入了 name_scope, 我们的 Graph 看起来才井然有序。
  • variable_scope: * 而 tf.variable_scope() 的作用是为了实现变量共享,它和 tf.get_variable() 来完成变量共享的功能。

先单独来体会一下 :
1、name_scopevariable_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_scopevariable_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

def test(checkpoint_dir, style_name, test_dir, if_adjust_brightness, img_size=[256,256]): # tf.reset_default_graph() result_dir = 'results/'+style_name check_folder(result_dir) test_files = glob('{}/*.*'.format(test_dir)) test_real = tf.placeholder(tf.float32, [1, None, None, 3], name='test') with tf.variable_scope("generator", reuse=False): test_generated = generator.G_net(test_real).fake saver = tf.train.Saver() gpu_options = tf.GPUOptions(allow_growth=True) with tf.Session(config=tf.ConfigProto(allow_soft_placement=True, gpu_options=gpu_options)) as sess: # tf.global_variables_initializer().run() # load model ckpt = tf.train.get_checkpoint_state(checkpoint_dir) # checkpoint file information if ckpt and ckpt.model_checkpoint_path: ckpt_name = os.path.basename(ckpt.model_checkpoint_path) # first line saver.restore(sess, os.path.join(checkpoint_dir, ckpt_name)) print(" [*] Success to read {}".format(os.path.join(checkpoint_dir, ckpt_name))) else: print(" [*] Failed to find a checkpoint") return # stats_graph(tf.get_default_graph()) begin = time.time() for sample_file in tqdm(test_files) : # print('Processing image: ' + sample_file) sample_image = np.asarray(load_test_data(sample_file, img_size)) image_path = os.path.join(result_dir,'{0}'.format(os.path.basename(sample_file))) fake_img = sess.run(test_generated, feed_dict = {test_real : sample_image}) if if_adjust_brightness: save_images(fake_img, image_path, sample_file) else: save_images(fake_img, image_path, None) end = time.time() print(f'test-time: {end-begin} s') print(f'one image test time : {(end-begin)/len(test_files)} s'什么意思
最新发布
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值