神经网络的结构,就是不同神经元间的连接结构
–图示了一个三层全连接神经网络。
神经元结构的输出,是所有输入的加权、加上偏置项,再经过一个激活(传递)函数得到。
全连接神经网络
全连接神经网络,就是相邻两层之间,任意两个节点之间都有连接。
–这也是其与后面介绍的卷积层、LSTM结构的区分。
–除了输入层,所有节点都代表了一个神经元的结构。
计算神经网络的前向传播结果,要三部分信息。
–第一个部分是神经网络的输入,这个输入就是从实体中提取的特征向量。
–第二个部分为神经网络的连接结构。神经网络是由神经元构成的,神经网络的结构,给出不同神经元之间输入、输出的连接关系。
–第三部分是每个神经元中的参数。
示例分析
图中,a11节点有两个输入,分别是x1和x2的输出,而a11的输出是节点Y的输入。
–用w来表示神经元中的权重,b表示偏置项。
–w的上标表明了神经网络的层数,如w(1)表示第一层节点的参数,而w(2)表示第二层节点的参数。
–w的下标表明了连接节点编号,比如w 1,2 (1)表示连接x1和a12节点的边上的权重。
给定神经网络的输入、神经网络的结构,以及边上权重,就可以通过前向传播算法,来计算出神经网络的输出
下面公式给出了在ReLU激活函数下,前图神经网络前向传播的过程。此处假设x1=0.7, x2=0.9
–a11=f(W1,1(1)x1+W2,1(1)x2+b1(1))
–=f(0.7×0.2+0.9×0.3+(-0.5)) =f(-0.09)=0
–a12=f(W1,2(1)x1+W2,2(1)x2+b2(1))
–=f(0.7×0.1+0.9×(-0.5)+0.1)=f(-0.28)=0
–a13=f(W1,3(1)x1+W2,3(1)x2+b3(1))
–=f(0.7×0.4+0.9×0.2+(-0.1))=f(0.36)=0.36
–Y=f(W1,1(2)a11+W1,2(2)a12+W1,3(2)a13+b1(2))
–=f(0.054+0.028+(-0.072)+0.1)=f(0.11)=0.11
在虚拟机中运行相应的chap3中的前向神经网络例子,查看相关的图计算。
在TensorFlow中,可以通过矩阵乘法的方法,实现神经网络的前向传播过程。
–a = tf.nn.relu(tf.matmul(x, w1)+b1)
–y = tf.nn.relu(tf.matmul(a, w2)+b2)
在上面的代码中并没有定义w1、w2、b1、b2,
–TensorFlow可以通过变量(tf.Variable),来保存和更新神经网络中的参数。
比如通过下面语句可以定义w1:
–weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
–这段代码调用了TensorFlow变量的声明函数tf.Variable。在变量声明函数中,给出了初始化这个变量的方法。
TensorFlow中变量的初始值,可以设置成随机数、常数或者是通过其他变量的初始值,计算得到
样例中,tf.random_normal([2, 3], stddev=2)会产生一个2×3的矩阵,矩阵中的元素是均值为0,标准差为2的随机数。
–注:标准差,也称为标准偏差
tf.random_normal函数,可以通过参数mean,来指定平均值,在没有指定时默认为0。
–通过满足正态分布的随机数,来初始化神经网络中的参数,是一个常用的方法。
下面的样例,介绍了如何通过变量,实现神经网络的参数,并实现前向传播的过程。
import tensorflowas tf
# 声明变量。
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
b1 = tf.Variable(tf.constant(0.0, shape=[3]))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
b2 = tf.Variable(tf.constant(0.0, shape=[1]))
# 暂时将输入的特征向量定义为一个常量。这里x是一个1*2的矩阵。
x = tf.constant([[0.7, 0.9]])
# 实现神经网络的前向传播过程,并计算神经网络的输出。
a = tf.nn.relu(tf.matmul(x, w1)+b1)
y = tf.nn.relu(tf.matmul(a, w2)+b2)
sess= tf.Session()
# 运行变量初始化过程。
init_op= tf.global_variables_initializer()
sess.run(init_op)
# 输出[[3.95757794]]
print(sess.run(y))
sess.close()