一、变量的定义
Tensorflow中的变量是特殊的张量,它可以是任何一个类型和形状的张量,与张量不同的是变量存在于会话调用的上下文之外,变量的主要作用是保存和更新模型的参数。
声明变量的函数形式为:tf.Variable(initial_value, trainable=True, collections=None, validate_shape=True, name=None)
参数含义如下:
1、initial_value:必选指定变量的初始值,类型可以是tensor的所类型。
2、trainable:(可选)变量是否可以训练,默认为true则在模型训练的过程中变量的值会随着训练的过程而不断的更新
3、collections:可选指定该计算图变量的类型,默认为GraphKeys.GLOBAL_VARIABLES(即全局变量)
4、validate_shape:可选默认为True则在运行过程中变量的形状不可变换,若要稍后更改变量的形状必须设置为False
5、name:可选,变量的名称,如果没有指定则系统会自动分配一个唯一的值。
在定义变量的过程中还可以使用Tensorflow提供的其他函数进行定义,
函数形式 | 含义 |
---|---|
tf.assign(tensor, value) | 将value的值赋给tensor张量 |
tf.assign_add(tensor, value) | 将tensor的值与value的值相加 |
Tensorflow中若使用变量则需要在定义变量后使用函数 tf.global_variables_initializer()
进行变量的全局初始化操作
import tensorflow as tf
a = tf.Variable(tf.constant(0.0),dtype=tf.float32)
b = tf.assign(a,10)
c = b
init_op = tf.global_variables_initializer() #进行全局初始化所有变量
with tf.Session() as sess:
sess.run(init_op) #在该会话管理器中进行全局初始化
print(a.eval()) #相当于print(sess.run(a))
print(b.eval()) #相当于print(sess.run(b))
print(sess.run(c))
输出结果为:
0.0
10.0
10.0
tf.Tensor.eval()函数也需要在默认的会话或者指定的会话中使用,返回指定张量的取值,更加具体的介绍见tf.Tensor.eval()函数使用的介绍
二、参数初始化变量
1.使用常量来初始化变量
Tensorflow通过 tf.constant_initializer(value)
函数生成一个值为常量的tensor对象,然后调用tf.get_variable()
函数初始化指定类型进行初始化为常量的变量。
- tf.zeros_initializer() 用来初始化全0的tensor对象;tf.ones_initializer() 用来初始化全1的tensor对象
- tf.constant_initializer(value, dtype, veryfy_value=False),其中第三个参数是布尔值默认为False,用于验证数值的形状,若为True时如果值的形状与初始张量的形状不兼容,则初始值设定项将引发错误。
- tf.get_variable(name, shape, initializer), 用来初始化或获取变量,或用该函数声明 name 两个名称一致的变量时程序运行会报错,因此具有变量检查机制属性
name:必填,变量的名称 (注意该参数与tf.Variable()
创建变量的方式不同!!!)
shape:必填,变量的形状
initializer:初始化器,指定变量的初始值
import tensorflow as tf
value = [0,1,2,3,4,5,6,7]
init = tf.constant_initializer(value) #将数组初始化常量
x = tf.get_varialbe('x', shape=[2,4], initializer=init) #初始化获取初始值值为常量的变量
with tf.Session() as sess:
sess.run(x.initializer) #在该会话管理器中进行全局初始化
print(x.eval())
输出结果为:
[[0. 1. 2. 3.]
[4. 5. 6. 7.]]
2.初始化形状为正态分布的变量
变量初始化为符合正态分布的某种形状,Tensorflow提供了三种初始化函数:
- tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None) ,该函数产生一个符合正太分布的变量,其参数含义为:
shape:必选,生成张量的形状
mean:可选,正太分布均值为0,默认为0;
studdv:可选,正态分布的标准差,默认为1.0;
dtype:可选,生成张量的类型,默认为tf.float32;
seed:可选,随机种子数,是一个整数,当设置之后每次生成的随机数都一样;- tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None), 该函数也是产生一个符合正太分布的变量,当随机数偏离平均值超过2个标准差时该数值将会重新分配一个随机数,参数含义和上面一致。
- tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32), 该函数产生平均分布的变量,其参数含义为:
shape:必选,生成张量的形状
minval:必选,产生值的最小值
maxval:必选,产生值的最大值
dtype:可选,产生值的类型,默认为float32
使用上述三种函数初始化2行3列变量,随机种子为1
import tensorflow as tf
w1 = tf.Variable(tf.random_normal((2,3), stddev=1, seed=1))
w2 = tf.Variable(tf.truncated_normal(shape=(2,3), stddev=1, mean=0))
w3 = tf.Variable(tf.random_uniform((2,3), minval=1, maxval=2, dtype=tf.float32))
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print('w1:',sess.run(w1))
print('w2:',sess.run(w2))
print('w3:',sess.run(w3))
输出结果为:
w1: [[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
w2: [[ 0.3278117 -0.95230293 0.70185417]
[-0.09465726 1.3022106 -0.77556884]]
w3: [[1.3131701 1.3706423 1.5397733]
[1.4204506 1.5305479 1.9178613]]