BP神经网络算法讲解及实战应用(超详细 附源码)

简介: BP神经网络算法讲解及实战应用(超详细 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~

多层网络的学习能力比单层感知机强很多,要训练多层网络,简单的感知机学习规则显然不够,需要更强大的学习算法。误差逆传播(Error BackPropagation)算法就是学习算法中的杰出代表。现实任务中使用神经网络时,大多是使用BP算法进行训练。需要注意的是,BP算法不仅可以用于多层前馈神经网络,还可以用于其他类型的神经网络。通常说BP网络时,常指利用BP算法训练的多层前馈神经网络。神经网络可以用于分类(预测给定元组的类标号)和数值预测(预测连续值输出)等

多层前馈神经网络

多层前馈神经网络由一个输入层、一个或多个隐层和一个输出层组成,如图9-5所示。它利用后向传播算法迭代地学习用于元组类标号预测的一组权重

网络中 每层由一些单元组成,网格的输入对应于对每个训练元组的观测属性,输入同时提供给构成输入层的单元,这些输入通过输入层加权求和后提供给称为隐藏层的类神经元的第二层,该隐藏层单元的输出输入到下一个隐藏层,隐藏层的数量是任意的,最后一个隐藏层的权重输出作为构成输出层的单元输入,输出层发布给定元组的网络预测,前馈网络中的权重都不回送到输入单元或者前一层的输出单元,网络是全连接的,即每个单元都向下一层的每个单元提供输入

对于最好的隐藏层单元数,没有明确的规则确定,网络设计是一个反复试验的过程,并可能影响结果训练网络的准确性,权重的初值也可能影响结果的准确性

后向传播算法

后向传播通过迭代地处理训练元组数据集,把每个元组的网络预测与实际已知的目标值相比较进行学习。对于每个训练样本,修改权重使得网络预测和实际目标值之间的均方误差最小。这种修改“后向”进行,即由输出层,经由每个隐层到第一个隐藏层。BP算法的主要思想是把训练过程分为两个阶段

1. 第一阶段(正向传播过程)

2. 第二阶段(反向传播过程)

若在输出层不能得到期望的输出值,那么逐层递归地计算实际输出与期望输出的差值,以便根据差值调节权值。BP算法基于梯度下降(Gradient Descent)策略,以目标的负梯度方向对参数进行调整

误差反向传播的过程就是将误差分摊给各层所有单元,从而获得各层单元的误差信号,进而修正各单元的权值,即权值调整的过程,每处理一个样本,就更新权重和偏置,称为实例更新,如果处理完训练集中的所有元组之后再更新权重和偏置,称为周期更新,理论上,反向传播算法的数据推导使用周期更新,但是在实践中,实例更新通常产生更加准确的结果

BP算法流程图描述如下

BP算法具有简单易行,计算量小和并行性强等优点,是神经网络训练采用最多也最成熟的训练算法之一,算法的实质是求解误差函数的最小值问题,由于它采用非线性规划中的最速下降,按误差的函数的负梯度方向修改权值,因而通常存在学习效率低,收敛速度慢,和容易陷入局部极小状态的缺点

BP神经网络Python应用

输出结果如下 由输入层权重映射到输出层权重

部分代码如下

import numpy as np
import math
import random
import string
import matplotlib as mpl
import matplotlib.pyplot as plt
#random.seed(0) 
#生成区间[a,b]内的随机数
def random_number(a,b):
    return (b-a)*random.random()+a 
#生成一个矩阵,大小为m*n,并且设置默认零矩阵
def makematrix(m, n, fill=0.0):
    a = []
    for i in range(m):
        a.append([fill]*n)
    return a 
#函数sigmoid(),这里采用tanh
def sigmoid(x):
    return math.tanh(x) 
#函数sigmoid的派生函数
def derived_sigmoid(x):
    return 1.0 - x**2 
#构造三层BP网络架构
class BPNN:
    def __init__(self, num_in, num_hidden, num_out):
        #输入层,隐藏层,输出层的结点数
        self.num_in = num_in + 1  #增加一个偏置结点
        self.num_hidden = num_hidden + 1   #增加一个偏置结点
        self.num_out = num_out        
        #激活神经网络的所有结点(向量)
        self.active_in = [1.0]*self.num_in
        self.active_hidden = [1.0]*self.num_hidden
        self.active_out = [1.0]*self.num_out        
        #创建权重矩阵
        self.wight_in = makematrix(self.num_in, self.num_hidden)
        self.wight_out = makematrix(self.num_hidden, self.num_out)        
        #对权值矩阵赋初值
        for i in range(self.num_in):
            for j in range(self.num_hidden):
                self.wight_in[i][j] = random_number(-0.2, 0.2)
        for i in range(self.num_hidden):
            for j in range(self.num_out):
                self.wight_out[i][j] = random_number(-0.2, 0.2)
        #最后建立动量因子(矩阵)
        self.ci = makematrix(self.num_in, self.num_hidden)
        self.co = makematrix(self.num_hidden, self.num_out)         
    #信号正向传播
    def update(self, inputs):
        if len(inputs) != self.num_in-1:
            raise ValueError('与输入层结点数不符') 
        #数据输入输入层
        for i in range(self.num_in - 1):
            #self.active_in[i] = sigmoid(inputs[i])  
#或者先在输入层进行数据处理
            self.active_in[i] = inputs[i]  #active_in[]是输入数据的矩阵            
        #数据在隐藏层的处理
        for i in range(self.num_hidden - 1):
            sum = 0.0
            for j in range(self.num_in):
                sum = sum + self.active_in[i] * self.wight_in[j][i]
            self.active_hidden[i] = sigmoid(sum)   
        #数据在输出层的处理
        for i in range(self.num_out):
            sum = 0.0
            for j in range(self.num_hidden):
                sum = sum + self.active_hidden[j]*self.wight_out[j][i]
            self.active_out[i] = sigmoid(sum)   #与上同理            
        return self.active_out[:]    
    #误差反向传播
    def errorbackpropagate(self, targets, lr, m):
#lr是学习率, m是动量因子
        if len(targets) != self.num_out:
            raise ValueError('与输出层结点数不符!')            
        #首先计算输出层的误差
        out_deltas = [0.0]*self.num_out
        for i in range(self.num_out):
            error = targets[i] - self.active_out[i]
            out_deltas[i] = derived_sigmoid(self.active_out[i])*error        
        #然后计算隐藏层误差
        hidden_deltas = [0.0]*self.num_hidden
        for i in range(self.num_hidden):
            error = 0.0
            for j in range(self.num_out):
                error = error + out_deltas[j]* self.wight_out[i][j]
            hidden_deltas[i] = derived_sigmoid(self.active_hidden[i])*error
        #首先更新输出层权值
        for i in range(self.num_hidden):
            for j in range(self.num_out):
                change = out_deltas[j]*self.active_hidden[i]
                self.wight_out[i][j] = self.wight_out[i][j] +lr*change + m*self.co[i][j]
                self.co[i][j] = change                
        #然后更新输入层权值
        for i in range(self.num_in):
            for i in range(self.num_hidden):
                change = hidden_deltas[j]*self.active_in[i]
                self.wight_in[i][j] = self.wight_in[i][j] +lr*change + m* self.ci[i][j]
                self.ci[i][j] = change                
        #计算总误差
        error = 0.0
        for i in range(len(targets)):
            error = error + 0.5*(targets[i] - self.active_out[i])**2
        return error 
    #测试
    def test(self, patterns):
        for i in patterns:
            print(i[0], '->', self.update(i[0]))
    #权重
    def weights(self):
        print("输入层权重")
        for i in range(self.num_in):
            print(self.wight_in[i])
        print("输出层权重")
        for i in range(self.num_hidden):
            print(selfitera):
            error[1]],
            [[1,6,2],[1]],
            [[1,5,1],[0]],
            [[1,8,4],[1]]
            ]
    #创建神经网络,3个输入结点,3个隐藏层结点,1个输出层结点
    n = BPNN(3, 3, 1)
    n.train(patt)#训练神经网络    
    n.test(patt) #测试神经网络    
    n.weights() #查阅权重值    
if __name__ == '__main__':
    demo()

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
10月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
10月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
803 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
10月前
|
机器学习/深度学习 缓存 算法
微店关键词搜索接口核心突破:动态权重算法与语义引擎的实战落地
本文详解微店搜索接口从基础匹配到智能推荐的技术进阶路径,涵盖动态权重、语义理解与行为闭环三大创新,助力商家提升搜索转化率、商品曝光与用户留存,实现技术驱动的业绩增长。
|
10月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
383 4
|
10月前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
576 5
|
10月前
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
11月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
643 2
|
10月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
369 0
|
10月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
532 17

热门文章

最新文章