这一章主要讲述前向传播。
Variable()
首先介绍 Variable 函数。
W = tf.Variable(tf.random_normal([2,3],stddev = 2,mean = 0,seed = 1))
tf.random_normal() 的参数解释
random_normal 是产生正态分布
[2,3] 产生 2 * 3 的矩阵
stddev = 2 标准差为 2
mean = 0 均值为 0
seed = 1 随机种子,随机种子如果去掉,每次生成的随机数将不一样
其中,stddev,mean,seed 可以不写
和 tf.random_normal 等价的函数还有
tf.truncated_normal() 去掉大偏离点的正态分布,如果随机出来的数据超过 2 个标准差,则数据去掉
tf.random_uniform() 平均分布
tf.zeros([3,2],int32) 全是 0 的数组
tf.ones([3,2],int32)
tf.fill([3,2],6) 生成[[6,6],[6,6],[6,6]] 全定值数组
tf.constant([3,2,1]) 生成[3,2,1] 直接给值
神经网络实现过程
- 准备数据集,提取特征,作为输入喂给神经网络
- 搭建神经网络,从输入到输出(先搭建计算图,再用会话执行)
- 大量特征数据喂给神经网络,迭代优化神经网络参数
- 使用训练好的模型预测和分类
举个例子:
代码:
1 | import tensorflow as tf |
但是有时候我们不知道到底有多少数据。
所以,可以用 tf.placeholder 占位,在 sess.run 函数中用 feed_dict 喂数据
喂一组数据
x = tf.placeholder(tf.float32,shape(1,2))
sess.run(y,feed_dict = {x:[[0.5,0.6]]})
喂多组数据
x = tf.placeholder(tf.float32,shape = (None,2)) # 不知道具体有多少数据,所以用 None 代替行数, 2 表示两个特征
sess.run(y,feed_dict = {x:[[0.1,0.2],[0.2,0.3]})
代码(喂一组数据):
1 | import tensorflow as tf |
代码(喂多组数据):
1 | import tensorflow as tf |
global_variables_initializer()
当我们训练自己的神经网络的时候,无一例外的就是都会加上一句 sess.run(tf.global_variables_initializer()) ,这行代码的官方解释是 初始化模型的参数。那么,它到底做了些什么?
global_variables_initializer 返回一个用来初始化 计算图中 所有global variable的 op。
这个op 到底是啥,还不清楚。
函数中调用了 variable_initializer() 和 global_variables()
global_variables() 返回一个 Variable list ,里面保存的是 gloabal variables。
variable_initializer() 将 Variable list 中的所有 Variable 取出来,将其 variable.initializer 属性做成一个 op group。
然后看 Variable 类的源码可以发现, variable.initializer 就是一个 assign op。
所以: sess.run(tf.global_variables_initializer()) 就是 run了 所有global Variable 的 assign op,这就是初始化参数的本来面目。