博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tensorflow 笔记12:函数区别:placeholder,variable,get_variable,参数共享
阅读量:7119 次
发布时间:2019-06-28

本文共 4886 字,大约阅读时间需要 16 分钟。

一、函数意义: 

1、tf.Variable() 变量

W = tf.Variable(
, name=
)

用于生成一个初始值为initial-value的变量。必须指定初始化值

x = tf.Variable()x.initializer          # 初始化单个变量x.value()              # 读取opx.assign()             # 写入opx.assign_add()         # 更多opx.eval()               # 输出变量内容

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)
例如:
W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,       regularizer=None, trainable=True, collections=None)

获取已存在的变量(要求不仅名字,而且初始化方法等各个参数都一样),如果不存在,就新建一个。 

可以用各种初始化方法,不用明确指定值。

3、tf.placeholder() 传入变量

原函数:

tf.placeholder(dtype, shape=None, name=None)

placeholder 是 Tensorflow 中的占位符,暂时储存变量.

Tensorflow 如果想要从外部传入data, 那就需要用到 tf.placeholder(), 然后以这种形式传输数据 

sess.run(***, feed_dict={input: **}).

4、tf.constant() 常量(保存模型的时候也会保存这个常量)

原函数:

tf.constant(    value,    dtype=None,    shape=None,    name='Const',    verify_shape=False)

二、函数对比:

 tf.Variable() 和 tf.get_variable() 的区别

1. 初始化更方便

比如用xavier_initializer:

W = tf.get_variable("W", shape=[784, 256],       initializer=tf.contrib.layers.xavier_initializer())

2. 方便共享变量

因为tf.get_variable() 会检查当前命名空间下是否存在同样name的变量,可以方便共享变量。

tf.Variable 每次都会新建一个变量。

需要注意的是tf.get_variable() 要配合reusetf.variable_scope() 使用。

所以推荐使用tf.get_variable()

3、代码示例

在 Tensorflow 当中有两种途径生成变量 variable, 一种是 tf.get_variable(), 另一种是 tf.Variable().
  • 如果想要达到重复利用变量的效果, 我们就要使用 tf.variable_scope(), 并搭配 tf.get_variable()这种方式产生和提取变量.
  • 不像 tf.Variable() 每次都会产生新的变量, tf.get_variable() 如果遇到了同样名字的变量时, 它会单纯的提取这个同样名字的变量(避免产生新变量).
  • 而在重复使用的时候, 一定要在代码中强调 scope.reuse_variables(), 否则系统将会报错, 以为你只是单纯的不小心重复使用到了一个变量.
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 下面还会使用    var3_reuse = tf.get_variable(name='var3',)    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.global_variables_initializer())    print(var3.name)            # a_variable_scope/var3:0    print(sess.run(var3))       # [ 3.]    print(var3_reuse.name)      # a_variable_scope/var3:0    print(sess.run(var3_reuse)) # [ 3.]    print(var4.name)            # a_variable_scope/var4:0    print(sess.run(var4))       # [ 4.]    print(var4_reuse.name)      # a_variable_scope/var4_1:0    print(sess.run(var4_reuse)) # [ 4.]

4、tf.name_scope() 和 tf.variable_scope()  对比

来源莫烦:

import tensorflow as tfwith 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)        # var1:0    print(sess.run(var1))   # [ 1.]    print(var2.name)        # a_name_scope/var2:0    print(sess.run(var2))   # [ 2.]    print(var21.name)       # a_name_scope/var2_1:0    print(sess.run(var21))  # [ 2.0999999]    print(var22.name)       # a_name_scope/var2_2:0    print(sess.run(var22))  # [ 2.20000005]
可以看出使用 tf.Variable() 定义的时候, 虽然 name 都一样, 但是为了不重复变量名, Tensorflow 输出的变量名并不是一样的. 所以, 本质上 var2, var21, var22 并不是一样的变量. 而另一方面, 使用tf.get_variable()定义的变量不会被tf.name_scope()当中的名字所影响.

5、训练和测试时参数复用

让 train_rnn 和 test_rnn 在同一个 tf.variable_scope('rnn') 之下,并且定义 scope.reuse_variables(), 使我们能把 train_rnn 的所有 weights, biases 参数全部绑定到 test_rnn 中.

这样,不管两者的 time_steps 有多不同, 结构有多不同, train_rnn W, b 参数更新成什么样, test_rnn 的参数也更新成什么样.

with tf.variable_scope('rnn') as scope:    sess = tf.Session()    train_rnn = RNN(train_config)    scope.reuse_variables()# 这句话表示,所有训练中的参数,在测试中都能使用,如果不写,会报错    test_rnn = RNN(test_config)    sess.run(tf.global_variables_initializer())

三、初始化变量:

初始化所有变量:

init = tf.global_variables_initializer() with tf.Session() as sess:    sess.run(init)

初始化一个变量子集:

init_ab = tf.variables_initializer([a, b], name = "init_ab")with tf.Session() as sess:    sess.run(init_ab)

初始化单个变量:

W = tf.Variable(tf.zeros([784, 10])) with tf.Session() as sess:    sess.run(W.initializer)

随机数,生成器:

函数名 随机数分布 主要参数
tf.random_normal 正态分布 平均值、标准差、取值类型
tf.truncated_normal 正态分布,如果随机数偏离均值超过2个标准差,就重新随机 平均值、标准差、取值类型
tf.random_uniform 平均分布 最小值、最大值、取值类型
tf.random_gamma gamma分布 形状参数alpha、尺度参数beta、取值类型

 

 

转载地址:http://viiel.baihongyu.com/

你可能感兴趣的文章
How to safely shut down a loading UIWebView in viewWillDisappear?
查看>>
xugang 记录一个.NET 程序员的成长 asp.net水晶报表的一些问题
查看>>
perl的几个小tips
查看>>
[转] C#2010 在TreeView控件下显示路径下所有文件和文件夹
查看>>
T-Sql(一)简单语法
查看>>
SharePoint 2013 Step by Step——How to Create a Lookup Column to Another Site(Cross Site) 阅读目录...
查看>>
《天风文章》 V1.1.0设计文档
查看>>
重新认识javascript的settimeout和异步
查看>>
Servlet
查看>>
10 款最新的 jQuery 内容滑块插件
查看>>
【组合数学+动态规划】在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。...
查看>>
jsp页面中使用超链接标签<a>中的属性<href>和<onclick>同时触发怎么执行
查看>>
【原创】数据挖掘案例——ReliefF和K-means算法的医学应用
查看>>
zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)...
查看>>
回复《论WEB标准专家》。
查看>>
Module-Zero之组织单元(OU)管理【新增】
查看>>
前几天入手一大菠萝,写个初始化教程
查看>>
CSS布局 ——从display,position, float属性谈起
查看>>
SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)
查看>>
SoapUI Pro Project Solution Collection-DataSource(jdbc,excel)
查看>>