自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
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))