向前传播神经网络算法 (forward propagation neuron network) TensorFlow实现
神经网络参数与TensorFlow变量
在TensorFlow中使用 tf.Variable() 变量声明函数进行变量声明。
常见的使用方式是声明变量的同时进行变量初始化。
如:
weights = tf.Variable(tf.random_normal([2,3], stddev=2))
上面的例子会产生 $ 2 \times 3$的矩阵,矩阵内的元素是均值为0,标准差为2的随机数。
扩展下:如果想生成均值为2、标准差为2的随机数可以这样写:
weights = tf.Variable(tf.random_normal([2,3], mean=2, stddev=2))
关于随机数,通过满足正态分布的随机数来初始化神经网络中的参数是一个常用的方法。除此之外TF还提供一些其他的随机数生成器。
函数 | 随机数分配 | 参数 |
---|---|---|
tf.random_normal | 正态分布 | mean(均值)、stddev(标准差)、dtype(取值类型) |
tf.truncated_normal | 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 | mean(均值)、stddev(标准差)、dtype(取值类型) |
tf.random_uniform | 均匀分布 | minval(最小取值)、maxval(最大取值)、dtype(取值类型) |
tf.random_gamma | Gamma分布 | 形状参数alpha、尺度参数beta、dtype(取值类型) |
神经网络参数与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], 3) -> [[3,3,3],[3,3,3]] |
tf.constant | 产生一个给定值的常量 | tf.constant([1,2,3]) -> [1,2,3] |
神经网络中,偏置项通常会使用常数来设置初始值 biase = tf.Variable(tf.zeros([3]))
一段完整的例子
1 | import TensorFlow as tf |
变量初始化
注意到在session代码前已经完整定义了TF计算图中的所有计算,但是!但是!这里定义的计算在这一步并不正真的运行。当需要运行这些计算并得到具体数字的时候需要先完成创建会话(session 后一章节会介绍)、变量初始化
具体到这个例子就是通过运行
1 | w1.initializer |
有人会说了,我X用个变量还要这么麻烦,一不小心一个变量没有初始化还麻烦了,有没有不用动脑子的办法?当然有!
1 | init_op = tf.initialize_all_variables() |
会话操作
之前已经介绍过,session相关的操作,这里可以理解为真正开始运行定义好的运算。