TensorFlow 入门
TensorFlow实现神经网络
前向传播算法简介
-
神经元是构成一个神经网络的最小单元,神经元也可以称之为节点。
- 一个神经元有多个输入和一个输出;
- 每个神经元的输入既可以是其他神经元的输出,也可以是整个神经网络的输入;
- 所谓神经网络的结构指的就是不同神经元之间的连接结构。
-
一个最简单的神经元结构的输出就是所有输入的加权和,而不同输入的权重就是神经元的参数。神经网络的优化过程就是优化神经元中参数取值的过程。
-
全连接神经网络是相邻两层之间任意两个节点之间都有连接的神经网络结构。
-
一个简单的判断零件是否合格的三层全连接神经网络。
- 计算神经网络的前向传播结果需要三部分信息。
- 第一个部分是神经网络的输入,这个输入就是从实体中提取的特征向量。
- 在图中有两个输入,一个是零件的长度 x 1 x_1 x1,一个是零件的质量 x 2 x_2 x2。
- 第二个部分为神经网络的连接结构。
- 神经网络是由神经元构成的,神经网络的结构给出不同神经元之间输入输出的连接关系。
- 在图中, a 11 a_{11} a11节点有两个输入,他们分别是 x 1 x_1 x1和 x 2 x_2 x2的输出。而 a 11 a_{11} a11的输出则是节点 y y y的输入。
- 最后一个部分是每个神经元中的参数。
- 在图中用 W W W来表示神经元中的参数。
- W W W的上标表明了神经网络的层数,比如以 W ( 1 ) W^{(1)} W(1)表示第一层节点的参数,而以 W ( 2 ) W^{(2)} W(2)表示第二层节点的参数。
- W 的下标表明了连接节点编号,比如 W 1 , 2 ( 1 ) W_{1,2}^{(1)} W1,2(1)表示连接 x 1 x_1 x1和 a 12 a_{12} a12节点的边上的权重。
- 第一个部分是神经网络的输入,这个输入就是从实体中提取的特征向量。
- 给定神经网络的输入、神经网络的结构以及边上权重,就可以通过前向传播算法来计算出神经网络的输出。
- 计算神经网络的前向传播结果需要三部分信息。
-
神经网络前向传播算法示意图
- 图中给出了输入层的取值 x 1 = 0.7 x_1=0.7 x1=0.7和 x 2 = 0.9 x_2=0.9 x2=0.9。
- 从输入层开始一层一层地使用向前传播算法。
- 首先隐藏层中有三个节点,每一个节点的取值都是输入层取值的加权和。
- 在得到第一层节点的取值之后,可以进一步推导得到输出层的取值。
- 类似地,输出层中节点的取值就是第一层的加权和。
- 因为这个输出值大于阈值0,所以在这个样例中最后给出的答案是:这个产品是合格的。这就是整个前向传播的算法。
-
前向传播算法可以表示为矩阵乘法。
- 将输入
x
1
,
x
2
x_1, x_2
x1,x2组织成一个
1
∗
2
1*2
1∗2的矩阵
x
=
[
x
1
,
x
2
]
x=[x_1, x_2]
x=[x1,x2],而
W
(
1
)
W^{(1)}
W(1)组织成一个
2
∗
3
2*3
2∗3的矩阵:
W ( 1 ) = [ W 1 , 1 ( 1 ) W 1 , 2 ( 1 ) W 1 , 3 ( 1 ) W 2 , 1 ( 1 ) W 2 , 2 ( 1 ) W 2 , 3 ( 1 ) ] W^{(1)}= \begin{bmatrix} W_{1,1}^{(1)} & W_{1,2}^{(1)} & W_{1,3}^{(1)} \\ W_{2,1}^{(1)} & W_{2,2}^{(1)} & W_{2,3}^{(1)} \end{bmatrix} W(1)=[W1,1(1)W2,1(1)W1,2(1)W2,2(1)W1,3(1)W2,3(1)] - 这样通过矩阵乘法可以得到隐藏层三个节点所组成的向量取值:
a ( 1 ) = [ a 11 , a 12 , a 13 ] = x W ( 1 ) = [ W 1 , 1 ( 1 ) x 1 + W 2 , 1 ( 1 ) x 2 , W 1 , 2 ( 1 ) x 1 + W 2 , 2 ( 1 ) x 2 , W 1 , 3 ( 1 ) x 1 + W 2 , 3 ( 1 ) x 2 ] a^{(1)}=[a_{11}, a_{12}, a_{13}]=xW^{(1)}=[W_{1,1}^{(1)}x_1+W_{2,1}^{(1)}x_2, W_{1,2}^{(1)}x_1+W_{2,2}^{(1)}x_2, W_{1,3}^{(1)}x_1+W_{2,3}^{(1)}x_2] a(1)=[a11,a12,a13]=xW(1)=[W1,1(1)x1+W2,1(1)x2,W1,2(1)x1+W2,2(1)x2,W1,3(1)x1+W2,3(1)x2]。 - 类似的输出层可以表示为:
[ y ] = a ( 1 ) W ( 2 ) = [ W 1 , 1 ( 2 ) a 11 + W 2 , 1 ( 2 ) a 12 + W 3 , 1 ( 2 ) a 13 ] [y]=a^{(1)}W^{(2)}=[W_{1,1}^{(2)}a_{11}+W_{2,1}^{(2)}a_{12}+W_{3,1}^{(2)}a_{13}] [y]=a(1)W(2)=[W1,1(2)a11+W2,1(2)a12+W3,1(2)a13]。
- 将输入
x
1
,
x
2
x_1, x_2
x1,x2组织成一个
1
∗
2
1*2
1∗2的矩阵
x
=
[
x
1
,
x
2
]
x=[x_1, x_2]
x=[x1,x2],而
W
(
1
)
W^{(1)}
W(1)组织成一个
2
∗
3
2*3
2∗3的矩阵:
-
在 TensorFlow 中矩阵乘法是通过 tf.matmul 实现的。
# 以下 TensorFlow 程序实现了图中所示神经网络的前向传播过程。 x = [[0.7, 0.9]] w1 = [[0.2, 0.1, 0.4], [0.3, -0.5, 0.2]] w2 = [[0.6,], [0.1,], [-0.2,]] a = tf.matmul(x, w1) y = tf.matmul(a, w2) with tf.Session() as sess: print(sess.run(a)) # [[ 0.41000003 -0.38 0.45999998]] with tf.Session() as sess2: print(sess2.run(y)) # [[ 0.11600002]]