神经网络第二篇:numpy轻松实现神经网络的计算

如果掌握了NumPy多维数组的运算,那么神经网络的实现就变得简单了。

多维数组

        多维数组就是数字的集合,数字排成一列的集合、排成行列的集合、排成三维或N维形状的集合。Numpy是专为Python提供的多维数组计算库,这里我们简单地给出一些相关的运算。

import numpy as np
"一维数组"
data=np.array([1,2,3,4])  #构造一维数组
print(np.ndim(data)) #获取数组的维数,输出:1
print(data.shape)  #数组形状(4,)
"多维数组"
data=np.array([[1,2],[3,4],[5,6],[7,8]]) #构造4行2列数组                    
print(np.ndim(data)) #2维
print(data.shape)    #(4,2)

    二维数组也称为矩阵,横排列称为行,纵排列称为列                

                                                  

矩阵乘法

    矩阵乘法,即二维数组的乘积,要求对应维度的元素个数要保持一致,如下图所示:

                                          

矩阵乘积的计算方法如下图所示:

                                         

Python代码实现:

A=np.array([[1,2],[3,4]])#(2,2)
B=np.array([[5,6],[7,8]]) #(2,2)
np.dot(A,B)  #矩阵乘积,输出[[19,22],[43,50]]

神经网络的内积

    以一个简单的神经网络为例,这里省略了偏置b和激活函数:

                                      

Python代码如下:

X=np.array([1,2])
W=np.array([[1,3,5],[2,4,6]])
Y=np.dot(X,W)  #输出[[5,11,17]

三层神经网络的实现

        这里我们以一个简单的三层神经网络的实现为例:输入层(即第0层)有两个神经元,第一层有三个神经元,第二层有2个神经元,输出层有2个神经元。

从输入层到第一层的信号传递

        从这里开始,我们把偏置b也考虑进来,首先输入层的神经元与权重乘积并求和,得到节点a(上一个专题讲过),将节点a传递至激活函数h()后得到第一层的输出z。如下图所示。

                                     

                                    

    第一层加权和表示为:

                                    

     从第一层到第二层的信号传递过程同上面的一样。这里我们着重讲一下从第二层到输出层(第三层)的信号传递,为了区分输出层的激活函数,我们采用了σ()来表示。

                                     

   一般而言,输出层的激活函数要根据具体情况决定,比如回归问题使用恒等函数,二元分类问题使用sigmoid函数,多元分类问题可以使用softmax函数(我们会在下一专题详细介绍),这里我们选择恒等函数,主要方便大家对程序的理解。下面是我们介绍的三层神经网络的实现代码:

                                            

# coding: utf-8
import numpy as np
def sigmoid(x):
    return 1/(1+np.exp(-x)
def equal_function(x):
    return x
def init_network():
    network={}
    network['W1']=np.array([[0.1,0.2,0.3],[0.4,0.5,0.6]])
    network['b1']=np.array([0.1,0.2,0.3])
    network['W2']=np.array([[0.7,0.8],[0.9,1.0],[1.1,1.2]])
    network['b2']=np.array([0.4,0.5])
    network['W3']=np.array([[1.3,1.4],[1.5,1.6]])
    network['b3']=np.array([0.6,0.7])
    return network
def forward(network,x):
    W1=network['W1']
    b1=network['b1']
    W2=network['W2']
    b2=network['b2']
    W3=network['W3']
    b3=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=equal_function(a3)    
    return y
              
network=init_network()
x=np.array([1.1,1.2])
y=forward(network,x)
y#输出[3.19934969, 3.48486525]
                            


    init_network()函数对权重和偏置进行初始化,并保存至字典变量network中。forward()函数封装了将输入信号转换为输出信号的处理过程,采用forward单词表示从输入到输出方向的传递处理。到这里神经网络的向前处理的实现就完成了,接下来的专题将介绍输出层(softmax激活函数)的设计。

      欢迎关注“Python生态智联”,学知识,享生活!

                                             

猜你喜欢

转载自blog.csdn.net/u012132349/article/details/86631868
今日推荐