码迷,mamicode.com
首页 > 其他好文 > 详细

2.5 tensorflow2.3--变量Variable声明和初始化

时间:2020-11-20 11:52:07      阅读:5      评论:0      收藏:0      [点我收藏+]

标签:fun   its   tomat   version   最小   描述符   resource   put   设置   

自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

https://www.cnblogs.com/bclshuai/p/11380657.html

1.1  变量Variable

1.1.1         变量的声明和使用

变量,它和占位符的不同是它在定义时需要赋值,而且它的数值是可以在图的计算过程中随时改变的。因此,占位符通常用作图的输入(即训练数据),而变量用作图中可以被“训练”或“学习”的那些tensor,例如y=ax+b中的a和b。

通过变量类Variable来定义,使用之前需要初始化。想要将所有图变量进行集体初始化时应该使用tf.global_variables_initializer,或者单个初始化。

_init_(self,
             initial_value=None,#初始值,张量或者能转化为张量的python对象
             trainable=None,#True时,GradientTape梯度带自动观察这个变量的使用
             validate_shape=True,是否验证初始值的shape,True验证,False不验证
             caching_device=None,可选填的设备字符串描述符,需要缓存读时设置,默认为变量设备
             name=None,
             variable_def=None,
             dtype=None,
             import_scope=None,
             constraint=None,
             synchronization=VariableSynchronization.AUTO,
             aggregation=VariableAggregation.NONE,
             shape=None):

rand_t=tf.random.uniform([50,50],0,10,seed=0)#创建随机常量数组50行50列,最大值为10,最小值为0,随机种子是0。以这个矩阵数组作为变量的初始值。

t_a=tf.Variable(rand_t)

t_b= tf.Variable(rand_t)       

r = tf.Variable(tf.random_normal([20, 10], stddev=0.35))     #以标准差0.35的正太分布初始化一个形状为[20,10]的张量

z = tf.Variable(tf.zeros([20]))  #定义变量,一个形状为[20]的张量, 里面的元素值全部为0.

#sess.run(tf.global_variables_initializer())  #所有变量初始化

sess.run(x.initializer) #单个变量初始化

1.1.2         变量的初始化

(1)常量声明变量并初始化

tensorflow所有的变量在使用前都需要初始化。

下面这条语句用常量1赋值声明了变量,但是没有初始化。

import tensorflow as tf
ss = tf.compat.v1.Session()
d60 = tf.Variable(1, dtype=tf.float32, name=‘number1‘)

如果调用下面的语句,则会报错,因为变量d60没有初始化

d61 = tf.tan(d60)
print(ss.run(d61))

所以我们需要显示初始化变量d60,才能输出正确的数据。

ss.run(d60.initializer)
d61 = tf.tan(d60)
print(ss.run(d61))#输出1.557

 

d60是定义的变量,而initializer是变量的初始化操作通过tensorflow的Session来执行这个操作,我们可以print(d60.initializer)来查看这个操作是什么?操作中包含了变量的d60的名称,作为输入,还有d60的类型。ss.run(d60.initializer)的作用就是执行变量d60的初始化操作,来初始化变量d60。感觉这个有点麻烦。

name: "number1/Assign"

op: "AssignVariableOp"

input: "number1"

input: "number1/Initializer/initial_value"

attr {

  key: "dtype"

  value {

    type: DT_FLOAT

  }

}

(2)变量声明变量并初始化

声明一个变量d62,以变量d60赋值。

d60 = tf.Variable(1, dtype=tf.float32, name=‘number1‘)
ss.run(d60.initializer)
d62 = tf.Variable(d60, dtype=tf.float32)# 
d63=tf.tan(d62)

同样我们还要执行变量d62的初始化操作来初始化变量d62,否则执行d63还是会报错。同样d60的初始化操作ss.run(d60.initializer)仍然不能省略,否则会报错。

print(ss.run(d62.initializer))
print(ss.run(d63)) 上面d60初始化要加,否则会报错。

补充信息:

如果要省略ss.run(d60.initializer)这一句,声明变量d62时,可以采用下面的声明方式

d62 = tf.Variable(d60.initialized_value(), dtype=tf.float32)

我们看看initialized_value函数的说明,意思就是返回初始化后的变量值。初始化另外一个变量时,使用这个来代替变量本身。

def initialized_value(self):
  """Returns the value of the initialized variable.

  You should use this instead of the variable itself to initialize another
  variable with a value that depends on the value of this variable.

但是使用这个函数,会有下面的警告。意思就是这个函数是tensorflow1.0的,后续可能会被废弃。建议使用tensorflow2.0的函数read_value.

WARNING:tensorflow:From D:/Project/python/tensorflow/venv/src/caculate.py:72: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.

Instructions for updating:

Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.

用tensorflow2.0的函数read_value来初始化另外一个变量。2.X中得到变量都是自动初始化。改成read_value()

d62 = tf.Variable(d60.read_value(), dtype=tf.float32)
d63=tf.tan(d62.read_value())
print(d63)

报如下错误,本地的容器不存在或者变量未初始化,所以导致了失败。

Error while reading resource variable number1 from Container: localhost. This could mean that the variable was uninitialized. Not found: Container localhost does not exist.

需要加上初始化语句才行

init_op = tf.compat.v1.global_variables_initializer()
print(ss.run(init_op))

2.5 tensorflow2.3--变量Variable声明和初始化

标签:fun   its   tomat   version   最小   描述符   resource   put   设置   

原文地址:https://www.cnblogs.com/bclshuai/p/13978923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!