深度学习 | 前馈神经网络与反向传播算法

这篇具有很好参考价值的文章主要介绍了深度学习 | 前馈神经网络与反向传播算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、Logistic函数

二、前馈神经网络(FNN)

三、反向传播算法(BP算法)

​四、基于前馈神经网络的手写体数字识别


一、Logistic函数

Logistic函数是学习前馈神经网络的基础。所以在介绍前馈神经网络之前,我们首先来看一看Logistic函数。

Logistic函数定义为:

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

Logistic函数可以看成是一个“挤压”函数, 把一个实数域的输入“挤压”到(0,1)。当输入值在0附近时。Sigmoid型函数近似为线性函数;当输入值靠近两侧时,对输入进行抑制。输入越小,越接近于0;输入越大,越接近于1。

这样的特点也和生物神经元类似,对一些输入会产生兴奋(输入为1),对另一些输入产生抑制(输出为0)。和感知器使用的阶跃激活函数相比,Logistic函数是连续可导的,其数学性质更好。

因为Logistic函数的性质,使得装备了Logistic激活函数的神经元具有以下两点性质:

(1)其输出直接可以看作概率分布,使得神经网络可以更好地和统计学习模型进行结合;

(2)其可以看作一个软性门,用来控制其他神经元输出信息的数量。

Logistic函数的导数为,其推导过程如下:

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

Logistic函数的图像如下:

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

二、前馈神经网络(FNN)

前馈神经网络其实是由多层的Logistic回归模型(连续的非线性函数)组成,而不是由多层的感知器(不连续的非线性函数)组成。

在前馈神经网络中, 各神经元分别属于不同的层。每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第0层称为输入层,最后一层称为输出层,其他中间层称为隐藏层。整个网络中无反馈,信号从输入层向输出层单向传递,可用一个有向无环图表示。

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

接下来,我们以下面的一个神经网络为例,推导前馈神经网络的数学模型。

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

图中,代表第j层第i个神经元的活性值,代表控制激活函数从第j层映射到第j+1层的权重矩阵。 

这里的激活函数我们使用的是Logistic函数,这里我们用g(x)表示。

因此,有:

 

 

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析 

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析 

 

 

 

 

 深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

 

 

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

我们也可以将上面的公式写成向量的形式:

 

 

 

因此,该前馈神经网络最后的输出值为:

                     

                              

                                    

                                           

                                                 

                                                          

可以看出,这是一个复合函数

三、反向传播算法(BP算法)

这里,我们还是使用上面的神经网络模型:

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

这里,代表第l层第j个神经元的误差。

该神经网络的损失函数为:

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

这里,我们令 深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析,并且有,在不考虑正则项的情况下,有:

 于是,反向传播算法的推导过程如下:

首先,令

(=预测值-真实值) 

根据链式求导法则有:

由于 

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

 

由于

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

 

              

              深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

              

              

              

因此,

接下来,我们先来推导一下:

首先,

根据链式求导法则,有:

 

已知,

又由于

 

故有:

因此,有:

 

接着,再推导:

 

已知 ,,

又由于

故有:

 

因此,有:

 

下面继续推导 :

由链式求导法则有:

已知 ,,

又由于

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

 深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

故有:

因此, 

接着,继续推导:

由链式求导法则有:

已知 ,,,

又由于

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

故有:

 

因此,

 

                                                   

                                                   

综上,有:

 

因此,有:

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

四、基于前馈神经网络的手写体数字识别

首先查看手写体数据集情况:

from scipy.io import loadmat

data=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11data.mat")
X=data['X']
y=data['y']
print('X type:',type(X))
print('X shape:',X.shape)
print('y type:',type(y))
print('y shape:',y.shape)
X type: <class 'numpy.ndarray'>
X shape: (5000, 400)
y type: <class 'numpy.ndarray'>
y shape: (5000, 1)

接着,从数据集中随机选取100行并转化成图片:

from random import sample
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

'''随机选取100行'''
r=[int(i) for i in range(5000)]
R=sample(r,100)
X_choose=np.zeros((100,400))
for i in range(100):
    X_choose[i,:]=X[R[i],:]
    
'''将随机选取的100行数据分别转换成20X20的矩阵形式'''
X_matrix=[X_choose[i].reshape([20,20]).T for i in range(100)]

'''转换成图片'''
fig=plt.figure()
for i in range(100):
    ax=fig.add_subplot(10,10,i+1)
    ax.imshow(X_matrix[i],interpolation='nearest')
plt.show()

深度学习 | 前馈神经网络与反向传播算法,数据分析,python,神经网络与深度学习,python,深度学习,前馈神经网络,反向传播算法,BP算法,数据分析

查看已经训练好的权重数据集情况:

from scipy.io import loadmat

weights=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11weights.mat")
theta1=weights['Theta1']
theta2=weights['Theta2']
print('theta1 tyep:',type(theta1))
print('theta1 shape:',theta1.shape)
print('theta2 type:',type(theta2))
print('tehta2 shape:',theta2.shape)
theta1 tyep: <class 'numpy.ndarray'>
theta1 shape: (25, 401)
theta2 type: <class 'numpy.ndarray'>
tehta2 shape: (10, 26)

计算前馈神经网络对手写体数字识别的准确率:

'''添加元素1'''
X0=X.tolist()
for i in range(5000):
    X0[i].insert(0,1)
X1=np.array(X0)

'''进行神经网络的第一层计算'''
Z1=[]   #5000 date of second layer
for i in range(5000):
    a=np.dot(theta1,X1[i].T)
    z1=(a.T).tolist()
    Z1.append(z1)

'''计算逻辑函数值'''
Y1=[]
for i in range(5000):
    y0=[]
    for j in range(25):
        b=1/(1+np.exp(-Z1[i][j]))
        y0.append(b)
    Y1.append(y0)


'''添加元素1'''
for i in range(5000):
    Y1[i].insert(0,1)
Y2=np.array(Y1)

'''进行神经网络的第二层计算'''
Z2=[]   #5000 date of third layer
for i in range(5000):
    a=np.dot(theta2,Y2[i].T)
    z2=(a.T).tolist()
    Z2.append(z2)
    
'''计算逻辑函数值'''
Y2=[]
for i in range(5000):
    y0=[]
    for j in range(10):
        c=1/(1+np.exp(-Z2[i][j]))
        y0.append(c)
    Y2.append(y0)
    
'''转换成输出值'''
Y=[]
for i in range(5000):
    s=Y2[i].index(max(Y2[i]))
    Y.append(s+1)
    
'''计算神经网络预测的准确率'''
n=0
for i in range(5000):
    if y[i]==Y[i]:
        n+=1
pre_ratio=n/5000
print("神经网络预测的准确率:{}".format(pre_ratio))
神经网络预测的准确率:0.9752

计算损失函数值:文章来源地址https://www.toymoban.com/news/detail-759668.html

from scipy.io import loadmat
import numpy as np


'''读取数据'''
data=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11data.mat")
X=data['X']
y=data['y']

weights=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11weights.mat")
theta1=weights['Theta1']
theta2=weights['Theta2']


#进行神经网络运算
'''添加元素1'''
X0=X.tolist()
for i in range(5000):
    X0[i].insert(0,1)
X1=np.array(X0)

'''进行神经网络的第一层计算'''
Z1=[]   #5000 date of second layer
for i in range(5000):
    a=np.dot(theta1,X1[i].T)
    z1=(a.T).tolist()
    Z1.append(z1)

'''计算逻辑函数值'''
Y1=[]
for i in range(5000):
    y0=[]
    for j in range(25):
        b=1/(1+np.exp(-Z1[i][j]))
        y0.append(b)
    Y1.append(y0)


'''添加元素1'''
for i in range(5000):
    Y1[i].insert(0,1)
Y2=np.array(Y1)

'''进行神经网络的第二层计算'''
Z2=[]   #5000 date of third layer
for i in range(5000):
    a=np.dot(theta2,Y2[i].T)
    z2=(a.T).tolist()
    Z2.append(z2)
    
'''计算逻辑函数值'''
Y2=[]
for i in range(5000):
    y0=[]
    for j in range(10):
        c=1/(1+np.exp(-Z2[i][j]))
        y0.append(c)
    Y2.append(y0)
    
'''转换成输出值'''
Y=[]
for i in range(5000):
    s=Y2[i].index(max(Y2[i]))
    Y.append(s+1)
    
#计算损失函数值
cost=0
for i in range(5000):
    cost0=0
    d=[0 for i in range(10)]
    d[y[i][0]-1]=1
    for j in range(10):
        p=d[j]*np.log(Y2[i][j])+(1-d[j])*np.log(1-Y2[i][j])
        cost0=cost0+p
    cost=cost+cost0
cost=cost*(-1/5000)
print("损失函数值:{}".format(cost))
损失函数值:0.2876291651613188

到了这里,关于深度学习 | 前馈神经网络与反向传播算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络与深度学习第四章前馈神经网络习题解答

    [习题4-1] 对于一个神经元  ,并使用梯度下降优化参数时,如果输入恒大于0,其收敛速度会比零均值化的输入更慢。 首先看一下CSDN的解释: 如果输入x恒大于0,使用sigmoid作为激活函数的神经元的输出值将会处于饱和状态,导致其梯度接近于0,这会使得梯度下降算法的收敛

    2024年02月06日
    浏览(34)
  • 【机器学习300问】71、神经网络中前向传播和反向传播是什么?

            我之前写了一篇有关计算图如何帮助人们理解反向传播的文章,那为什么我还要写这篇文章呢?是因为我又学习了一个新的方法来可视化前向传播和反向传播,我想把两种方法总结在一起,方便我自己后续的复习。对了顺便附上往期文章的链接方便回顾: 【机器

    2024年04月17日
    浏览(58)
  • 【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)

    反向传播(back propagation)是一种用于训练神经网络的算法,其作用是计算神经网络中每个参数对损失函数的影响,从而进行参数更新,使得神经网络的预测结果更加准确。 具体来说,反向传播算法首先通过 前向传播 计算神经网络的预测结果,并与实际结果进行比较,得到

    2024年02月04日
    浏览(54)
  • 【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络

    1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作; (2)掌握广义线性回归模型(logistic模型、sofmax模型)、前馈神经网络模型的原理; (3)熟练掌握基于mindspore和pytorch的广义线性模型与前馈神经网络模型的实现。   1.2 实验内容及要求 请基于mindspore和pytorch平

    2023年04月22日
    浏览(32)
  • 【深度学习】2-2 神经网络 - 前向传播实现3层神经网络

    神经网络的一个重要性质是它可以 自动地 从数据中学习到合适的权重参数。 用图来表示神经网络的话,把最左边的一列称为 输入层 ,最右边的一列称为 输出层 ,中间的一列称为 中间层 。中间层有时也叫 隐藏层 (或隐含层) 首先了解下权重符号的定义 图中权重w **上标

    2024年02月09日
    浏览(45)
  • (九)人工智能应用--深度学习原理与实战--前馈神经网络实现MNST手写数字识别

    目标: 识别手写体的数字,如图所示: 学习内容: 1、掌握MNIST数据集的加载和查看方法 2、熟练掌握Keras建立前馈神经网络的步骤【重点】 3、掌握模型的编译及拟合方法的使用,理解参数含义【重点】 4、掌握模型的评估方法 5、掌握模型的预测方法 6、掌握自定义图片的处理与

    2024年02月13日
    浏览(38)
  • 深度学习:神经网络的前向传播过程

    Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDN@weixin_43975035 哲学与爱情是我永远都搞不懂的两件事情 注: 以三层神经网络为例说明神经网络的前向传播过程 激活函数采用 R e L U ReLU R e LU 函数 w w w 值和 𝜃 值由反向传播过程确定,此处可忽

    2023年04月20日
    浏览(38)
  • 神经网络基础-神经网络补充概念-26-前向和反向传播

    前向传播(Forward Propagation): 前向传播是神经网络中的正向计算过程,用于从输入数据开始,逐层计算每个神经元的输出值,直到得到最终的预测值。在前向传播过程中,我们按以下步骤进行: 输入数据:将输入数据传递给输入层。 加权求和:对每个神经元的输入进行加权

    2024年02月12日
    浏览(30)
  • 深度学习|4.1 深L层神经网络 4.2 深层网络的正向传播

    对于某些问题来说,深层神经网络相对于浅层神经网络解决该问题的效果会较好。所以问题就变成了神经网络层数的设置。 其中 n [ i ] n^{[i]} n [ i ] 表示第i层神经节点的个数, w [ l ] w^{[l]} w [ l ] 代表计算第l层所采用的权重系数, b [ l ] b^{[l]} b [ l ] 代表计算第l层所用的偏移量

    2024年01月21日
    浏览(29)
  • R语言 BPNN 反向传播神经网络

    ##BPNN-neuronet set.seed(123) folds - createFolds(y=data$Groups,k=10) for(i in 1:10){ test - data[folds[[i]],] train - data[-folds[[i]],] BPNN - neuralnet(Groups~.,data=train,hidden = c(16,8), learningrate = 0.05, ##使用0.05的学习率 threshold = 0.1,# threshold:用于指定迭代停止条件,当权重的最大调整量小于指定值(默认0.01)时迭代

    2024年02月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包