TensorFlow入门(四) 神经网络参数与TensorFlow变量

神经网络中的参数是神经网络实现分类或者回归问题中重要的部分。在TensorFlow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数。和其他编程语言类似,TensorFlow中的变量也需要指定初始值。因为在神经网络中,给参数赋予随机初始值最为常见,所以一般也使用随机数给TensorFlow中的变量初始化。下面一段代码给出了一种在TensorFlow中声明一个2x3的矩阵变量的方法:

weights = tf.Variable(tf.random_normal([2, 3], stddev=2))

这段代码调用了TensorFlow变量的声明函数tf.Variable。在变量声明函数中给出了初始化这个变量的方法。TensorFlow中变量的初始值可以设为随机数、常数或者是通过其他变量的初始计算得到。在上面的样例中,tf.random_normal([2, 3], stddev=2)会产生一个2x3的矩阵,矩阵中的元素是均值为0,标准差为2的随机数。tf.random_normal函数可以通过参数mean来指定平均值,在没有指定时默认为0.通过满足正太分布的随机数来初始化神经网络中的参数是一个非常常用的方法。除了正太分布的随机数,TensorFlow还提供了一些其他的随机数生成器。

TensorFlow随机数生成函数
函数名称 随机函数分布 主要参数
tf.random_normal 正态分布 平均值、标准差、取值类型
tf.truncated_normal 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值、标准差、取值类型
tf.random_uniform 平均分布 最小、最大取值,取值类型
tf.random_gamma Gamma分布

形状参数alpha,尺度参数beta,取值类型

TensorFlow也支持通过常数来初始化一个变量。

TensorFlow常数生成函数
函数名称 功能 样例
tf.zeros 生成全0的数组 tf.zeros([2, 3], int32) -> [[0, 0, 0], [0, 0, 0]]
tf.ones 生成全1的数组 tf.ones([2, 3], int32) -> [[1, 1, 1], [1, 1, 1]]
tf.fill 产生一个全部为给定数字的数组 tf.fill([2, 3], 9) -> [[9, 9, 9], [9, 9, 9]]
tf.constant 产生一个给定值的常量 tf.constant([1, 2, 3]) -> [1, 2, 3]

在神经网络中,偏置量(bias)通常会使用常数来设置初始值。以下代码给出了一个样例。

biases = tf.Variable(tf.zeros([3]))

这段代码会生成一个初始值全部为0且长度为3的变量。除了使用随机数或者常数,TensorFlow也支持通过其他变量的初始值来初始化新的变量。以下代码给出了具体的方法。

w2 = tf.Variable(weights.initialized_value())
w3 = tf.Variable(weights,initialized_value() * 2.0)

以上代码中,w2的初始值被设置成了与weights变量相同。w3的初始值则是weights初始值的两倍。在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) # 初始化x1
sess.run(w2.initializer) # 初始化w2
# 输出[[3.957578]]
print(sess.run(y))
sess.close()

定义变量,也就是定义了TensorFlow计算图中所有的计算。但这些被定义的计算在这一步并不真正的运行。当需要运行这些计算并得到具体数字时,需要声明一个会话(session),并通过会话计算结果。但在计算之前,需要将将所有使用到的变量初始化。也就是说,虽然变量定义时给出了变量初始化的方法,但这个方法并没有真正运行。所以在计算y之前,需要通过运行w1.initializer和w2.initializer来给变量赋值。虽然直接调用每个变量的初始化过程是一个可行的方案,但是当变量数目增多,或者变量之间存在依赖关系时,单个调用的方案就比较麻烦了。为了解决这个问题,TensorFlow提供了一种更加便捷的方式来完成变量初始化的过程。下面的程序展示了通过tf.initialize_all_variables函数来实现初始化所有变量的过程。

init_op = tf.initialize_all_variables()
sess.run(init_op)

通过tf.initialize_all_variables函数,就不需要将变量一格格初始化了。这个函数也会自动处理变量之间的依赖关系。

TensorFlow的核心概念是张量(tensor),所有的数据都是通过张量的形式来组织的。在TensorFlow中,变量的声明函数tf.Variable是一个运算。这个运算的输出结果就是一个张量,这个张量也就是本篇所介绍的变量。所以变量只是一种特殊的张量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章