《深度学习之TensorFlow入门、原理与进阶实战》—3.1.2 搭建模型
3.1.2 搭建模型
现在开始进行模型搭建。模型分为两个方向:正向和反向。
1.正向搭建模型
(1)了解模型及其公式
在具体操作之前,先来了解一下模型的样子。神经网络是由多个神经元组成的,单个神经元的网络模型如图3-2所示。
图3-2 神经元模型
其计算公式见式(3-1):
式(3-1)
式中,z为输出的结果,x为输入,w为权重,b为偏执值。
z的计算过程是将输入的x与其对应的w相乘,然后再把结果相加上偏执b。
例如,有3个输入x1,x2,x3,分别对应w1,w2,w3,则,z=x1×w1+x2×w2+x3×w3+b。这一过程中,在线性代数中正好可以用两个矩阵来表示,于是就可以写成(矩阵W)×(矩阵X)+b。矩阵相乘的展开如式(3-2):
式(3-2)
上面的算式(3-2)表明:形状为1行3列的矩阵与3行1列的矩阵相乘,结果的形状为1行1列的矩阵,即(1,3)×(3,1)=(1,1)
?注意:这里有个小窍门,如果想得到两个矩阵相乘后的形状,可以将第一个矩阵的行与第二个矩阵的列组合起来,就是相乘后的形状。
在神经元中,w和b可以理解为两个变量。模型每次的“学习”都是调整w和b以得到一个更合适的值。最终,有这个值配合上运算公式所形成的逻辑就是神经网络的模型。
(2)创建模型
下面的代码演示了如何创建图3-2中的模型。
代码3-1 线性回归(续)
11 # 创建模型
12 # 占位符
13 X = tf.placeholder("float")
14 Y = tf.placeholder("float")
15 # 模型参数
16 W = tf.Variable(tf.random_normal([1]), name="weight")
17 b = tf.Variable(tf.zeros([1]), name="bias")
18 # 前向结构
19 z = tf.multiply(X, W)+ b
下面解说一下代码。
(1)X和Y:为占位符,使用了placeholder函数进行定义。一个代表x的输入,一个代表对应的真实值y。占位符的意思后面再解释。
(2)W和b:就是前面说的参数。W被初始化成[-1,1]的随机数,形状为一维的数字,b的初始化为0,形状也是一维的数字。
(3)Variable:定义变量,在3.3节会有详细介绍。
(4)tf.multiply:是两个数相乘的意思,结果再加上b就等于z了。
2.反向搭建模型
神经网络在训练的过程中数据的流向有两个方向,即先通过正向生成一个值,然后观察其与真实值的差距,再通过反向过程将里面的参数进行调整,接着再次正向生成预测值并与真实值进行比对,这样循环下去,直到将参数调整为合适值为止。
正向相对比较好理解,反向传播会引入一些算法来实现对参数的正确调整。
下面先看一下反向优化的相关代码。
代码3-1 线性回归(续)
20 #反向优化
21 cost = tf.reduce_mean(tf.square(Y - z))
22 learning_rate = 0.01
23 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize
(cost) #梯度下降
代码说明如下:
(1)第21行定义一个cost,它等于生成值与真实值的平方差。
(2)第22行定义一个学习率,代表调整参数的速度。这个值一般是小于1的。这个值越大,表明调整的速度越大,但不精确;值越小,表明调整的精度越高,但速度慢。这就好比生物课上的显微镜调试,显微镜上有两个调节焦距的旋转钮,分为粗调和细调。
(3)第23行GradientDescentOptimizer函数是一个封装好的梯度下降算法,里面的参数learning_rate叫做学习率,用来指定参数调节的速度。如果将“学习率”比作显微镜上不同档位的“调节钮”,那么梯度下降算法也可以理解成“显微镜筒”,它会按照学习参数的速度来改变显微镜上焦距的大小。
- 点赞
- 收藏
- 关注作者
评论(0)