参考书籍:深度学习入门——基于pyhthon的理论与实现
对神经网络进行简单的python实现,以3层神经网络为对象,实现输入到输出的前向处理,利用numpy的多维数组,尽可能减少代码量完成神经网络的前向处理过程。
3层神经网络拥有一个输入层、输出层,同时拥有两个中间层,也称隐藏层,该网络拥有3层的权重参数,如下图所示:
在进行神经网络中的处理之前,对相关的符号进行一个约定:
w 12 ( 1 ) a 1 ( 1 ) w^{(1)}_{12} \\ \\a^{(1)}_1 w12(1)a1(1)
注意:这里只是为了方便阅读,对于这些符号的约定,可以自定义,后面内容重点在于神经网络的运算作为矩阵运算的打包,神经网络各层的运算从宏观角度上来看就是通过矩阵的乘法运算打包进行的。
权重参数按照头顶权重层号,下踩前后连接关系,也就是说头上的数字表示该权重运用于哪一个层,下面的数字表示该权重连接了那两个神经元,顺序就是神经元索引顺序排列
从输入层到第1层神经元的信号传递过程,如下:
参数传递过程,就是矩阵乘法的运算,运算过程如下:
a 1 ( 1 ) = w 11 ( 1 ) x 1 + w 21 ( 1 ) x 2 + b 1 1 a 2 ( 1 ) = w 12 ( 1 ) x 1 + w 22 ( 1 ) x 2 + b 2 1 a 3 ( 1 ) = w 13 ( 1 ) x 1 + w 23 ( 1 ) x 2 + b 3 1 a^{(1)}_{1}=w^{(1)}_{11}x_1+w^{(1)}_{21}x_2+b^{1}_{1} \\ a^{(1)}_{2}=w^{(1)}_{12}x_1+w^{(1)}_{22}x_2+b^{1}_{2} \\ a^{(1)}_{3}=w^{(1)}_{13}x_1+w^{(1)}_{23}x_2+b^{1}_{3} a1(1)=w11(1)x1+w21(1)x2+b11a2(1)=w12(1)x1+w22(1)x2+b21a3(1)=w13(1)x1+w23(1)x2+b31
第一层信号的传递过程,就是一个简单的运算。
第2 层、第3层传递过程也和第1层类似,就不赘述。
如果使用矩阵的乘法运算,则可以将第1层的加权和表示成下面的公式:
A ( 1 ) = X W ( 1 ) + B ( 1 ) A^{(1)}=XW^{(1)}+B^{(1)} A(1)=XW(1)+B(1)
其中,
A ( 1 ) = ( a 1 ( 1 ) , a 2 ( 1 ) , a 3 ( 1 ) ) X = ( x 1 , x 2 ) B ( 1 ) = ( b 1 ( 1 ) , b 2 ( 1 ) , b 3 ( 1 ) ) A^{(1)}=(a^{(1)}_{1}, a^{(1)}_{2},a^{(1)}_{3}) \\ X=(x_1,x_2) \\ B^{(1)}=(b^{(1)}_{1},b^{(1)}_{2},b^{(1)}_{3}) A(1)=(a1(1),a2(1),a3(1))X=(x1,x2)B(1)=(b1(1),b2(1),b3(1))
接下来使用numpy数组实现上述过程,这里将输入信号、权重、偏置设置为任意值,代码如下:
代码如下(示例):
import numpy as np
X=np.array([1.0,0.5])
W1=np.array([[0.1,0.3,0.5],[0.3,0.4,0.6]])
B1=np.array([0.1,0.4,0.3])
A1=np.dot(X,W1)+B1
print(A1)
输出结果:
>[0.3 0.7 1.1]
对计算得到的加权和数据,进行第1层神经元的激活,使用激活函数sigmoid对第一层激活.
代码如下(示例):
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
A1=np.array([0.3 0.7 1.1])
Z1=sigmoid(A1)
print(Z1)
输出结果:
>[0.57444252 0.66818777 0.75026011]
第一层信号的传递过程下图所示,第2列中的每个元素按照第一个的运算过程进行计算,得到了各自的数值。
第2层信号的传递,和第1层没有多大的区别,只是每层神经元中的元素不一致而已。运算过程如图:
运算过程,使用numpy数组矩阵计算,一次计算就可以得到结果,第2层也是有偏置参数,但是图中,并未将其表示出来。
代码如下(示例):
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
X=np.array([1.0,0.5])
W1=np.array([[0.1,0.3,0.5],[0.3,0.4,0.6]])
B1=np.array([0.1,0.4,0.3])
A1=np.dot(X,W1)+B1
Z1=sigmoid(A1)
W2=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6]])
B2=np.array([0.1,0.2])
A2=p.dot(Z1,W2)+B2
Z2=sigmoid(A2)
第3层信号的传递,和第2层没有多大的区别,只是每层神经元中的元素不一致,其次就是使用的激活函数不是sigmoid函数,此处可以使用恒等函数作为激活函数。运算过程。
代码如下(示例):
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def identity_function(x):
return x
X=np.array([1.0,0.5])
W1=np.array([[0.1,0.3,0.5],[0.3,0.4,0.6]])
B1=np.array([0.1,0.4,0.3])
A1=np.dot(X,W1)+B1
Z1=sigmoid(A1)
W2=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6]])
B2=np.array([0.1,0.2])
A2=p.dot(Z1,W2)+B2
Z2=sigmoid(A2)
W3=np.array([0.1,0.2])
B3=np.array([0.2,3.2])
A3=np.dot(Z2,W3)+B3
Z3=identity_function(A3)
至此简单介绍了3层网络的实现,但是之前的代码格式不符合神经网络代码的格式,需要对其进行适度的整理修改。
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def identity_function(x):
return x
def init_network():
network = {}
network['w1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
network['b1']=np.array([0.1,0.2,0.3])
network['w2']=np.array([[0.1,0.2],[0.3,0.4],[0.5,0.6]])
network['b2']=np.array([0.1,0.2])
network['w3']=np.array([[0.1,0.2],[0.3,0.4]])
network['b3']=np.array([0.1,0.2])
return network
def forward(network,x):
w1,w2,w3 = network['w1',network['w2'],network['w3'] b1,b2,b3=network['b1',network['b2'],network['b3']
a1=np.dot(x,w1)+b1
z1=sigmoid(a1)
a2=np.dot(z1,w2)+b2
z2=sigmoid(a2)
a3=np.dot(z2,w3)+b3
y=identity_function(a3)
return y
network = init_network()
x=np.array([1.0,0.5])
y=forward(network,x)
主要介绍了神经元的各层信号之间的传递,简单用python代码实现一个3层神经网络的前向传播过程。