神经网络参数简介
在TensorFlow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数。和其他编程语言类似,在TensorFlow中的变量也需要初始值。因为在TensorFlow中参数赋予随机初始值最为常见,所以一边也使用随机数给TensorFlow中的便便初始化。下面一段代码给出了一种在TensorFlow中声名一个 2 * 3 的矩阵变量方法。
weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
tf.random_normal([2, 3], stddev=2) 会产生一个 2 * 3的矩阵,矩阵的平均值为 0 ,标准差为2的随机数。tf.random_mormal 可以通过mean来指定平均值,这个值默认值为0,通过满足正太分布的随机数来初始化神经网络中的参数是一个非常好用方法,除了正太分布,TensorFlow还提供了其他的随机数生成器。见下表
TensorFlow也支持通过常数来初始化一个变量。
向前传播算法代码示例
import tensorflow as tf
# 声名w1和w2 这里还通过seed参数设定了随机种子,这样可以保证每次运行结果是一样的(数值上随机不会和上图一样)
w1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1)) # 定义一个矩阵输入层到隐藏层第一层的权重,
w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1)) # 定义一个矩阵隐藏层到输出层的权重
# 暂时将输入的特征向量定义为一个常量,x 为一个1 * 2 的矩阵
x = tf.constant([[0.7, 0.9]])
# 通过 向前传播算法获得神经网络的输出
a = tf.matmul(x, w1) # 向前传播算法第一层 输入层 到 隐藏层
y = tf.matmul(a, w2) # 向前传播算法第二层 隐藏层 到 输出层
sess = tf.Session()
# 注意这里不能直接使用 sess.run(y)来获取y值,因为w1和w2都还没进行初始化
sess.run(w1.initializer) # 初始化w1
sess.run(w2.initializer) # 初始化w2
print(sess.run(y))
sess.close()
从上面的代码就会发现,在计算y之前需要w1.initializer和w2.initializer对w1和w2进行初始化,这样写当然可以,但是如果参数过多的请款下这样写就很麻烦,为了解决这个问题TensorFlow提供了一个方便的方式来进行变量的初始化。
init_op = tf.global_variables_initializer()
sess.run(init_op )
有了这个方法,tensorFlow会根据依赖关系自行初始化各个参数。例如上边的代码,可以把
sess.run(w1.initializer)# 初始化w1
sess.run(w2.initializer)# 初始化w2
注释掉,换成
init_op = tf.global_variables_initializer()
sess.run(init_op )
demo依然可以正常运行。
变量和张量的关系
变量的声名函数 tf.Variable 是一个运算。这个运算的输出是一个张量,这个张量就是变量。所以变量只是一个特殊的张量。
所有的变量都会被自动地加入到GraphKeys . VARIABLES 这个集合中。通过tf.global_variables()函数可以拿到当前计算图上所有的变量。拿到计算图上所有的变量有助于持久化整个计算图的运行状态。
当构建机器学习模型时,比如神经网络,可以通过变量声明函数中的trainable 参数来区分需要优化的参数(比如神经网络中的参数)和其他参数(比如选代的轮数)。如果声明变量时参数trainable 为True ,那么这个变量将会被加入到GraphKeys. TRAINABLE_ V ARJABLES 集合。在TensorFlow 中可以通过tf.trainable _variables函数得到所有需要优化的参数。TensorF!ow 中提供的神经网络优化算法会将GraphKeys .TRAINABLE_ VARIABLES 集合中的变量作为默认的优化对象。
类似张量,维度(shape)和类型(type)也是变量的最重要的两个属性,和大部分语言类似,变量的类型是不可改变的。一个变量在构建之后,他的类型就不能改变。
维度是变量另一个重要的属性。和类型不大一样的是,维度在程序运行过程中中是有可能改变的,但是需要通过设置函数参数 validate_shape = False来设置。
tf.assign(w1, w2, validate_shape=False) # 将w2的值赋给w1