当前位置: 首页 > news >正文

深入探索BP神经网络【简单原理、实际应用和Python示例】

人工神经网络(Artificial Neural Networks)是一种受到生物神经网络启发的机器学习模型,它的应用范围广泛,包括图像识别、语音识别、自然语言处理等领域。其中,BP神经网络(Backpropagation Neural Network)是最常见和基础的神经网络之一。

背景

BP神经网络是一种 前馈神经网络,最早由David Rumelhart、Geoffrey Hinton和Ron Williams于1986年提出。它的设计灵感来自于 人脑中神经元之间的信息传递机制,通过神经元之间的连接和权重来模拟信息处理 。BP神经网络由输入层、隐含层(可以有多个)、输出层组成,每个神经元都与上一层的所有神经元相连,每个连接都有一个权重。

它就像一条信息流水管,把信息从一头输送到另一头。想象一下,你把一些问题的答案输入到这个水管的一端,然后它通过一系列的阀门和管道,最终给你正确的答案。这些阀门和管道就是我们的神经元,而它们之间的强弱连接就是权重。

与前馈神经网络不同,后馈神经网络 在信息传递方面更加复杂。前馈神经网络只向前传递信息,而后馈神经网络可以在信息传递的同时,也允许信息反馈,形成循环。这使得后馈神经网络在处理某些复杂问题时更加强大,但也更加复杂。虽然后馈神经网络在某些情况下非常有用。

解决的问题

BP神经网络主要用于解决分类和回归问题。它可以应用于诸如图像分类、文本情感分析、手写数字识别等任务。通过学习和调整神经元之间的权重,BP神经网络可以自动地发现输入数据中的模式特征,从而进行准确的预测和分类。

实现原理

梯度下降算法

BP神经网络的训练基于梯度下降算法。该算法的核心思想是最小化损失函数,使预测值与实际值之间的误差尽可能小。下面是梯度下降算法的关键步骤:

  1. 初始化权重和偏置: 刚开始,我们给网络的每个"连接"(类似神经元之间的道路)随机设置了一些权重,就像是在城市的交叉口上设置了一些标志。

  2. 前向传播: 我们把数据传递给网络,就像是车辆在城市中行驶,经过每个交叉口。每个神经元计算出一些东西,就像是每个交叉口告诉车辆往哪里走。

  3. 计算损失: 我们想要知道网络的预测是否准确,所以我们计算出它的错误,就像是检查车辆是否按照地图行驶。

  4. 反向传播: 然后,我们回头看每个连接的错误,就像是回头看每个交叉口上的标志是否设置得合适。如果错了,我们会微调标志,就像是微调道路的方向

  5. 重复迭代: 我们一遍又一遍地重复这个过程,每次都试图让预测更准确。就像是一辆车一步一步地走向正确的目的地,最终我们希望网络的预测变得非常准确,损失变得很小。

代码示例

以下将演示如何使用BP神经网络解决二分类问题(解决XOR问题)

import numpy as np
import matplotlib.pyplot as plt# 定义激活函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 初始化权重和偏置
input_size = 2
hidden_size = 3
output_size = 1
learning_rate = 0.1w1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
w2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))# 训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])# 存储损失值
losses = []# 训练神经网络
for epoch in range(10000):# 前向传播z1 = np.dot(X, w1) + b1a1 = sigmoid(z1)z2 = np.dot(a1, w2) + b2a2 = sigmoid(z2)# 计算损失loss = np.mean((a2 - y) ** 2)losses.append(loss)# 反向传播dloss_da2 = 2 * (a2 - y)da2_dz2 = a2 * (1 - a2)dz2_dw2 = a1dz2_db2 = 1dloss_dw2 = np.dot(dz2_dw2.T, dloss_da2 * da2_dz2)dloss_db2 = np.sum(dloss_da2 * da2_dz2, axis=0, keepdims=True)da2_dz1 = w2dz1_dw1 = Xdz1_db1 = 1dloss_da1 = np.dot(dloss_da2 * da2_dz2, da2_dz1.T)dloss_dw1 = np.dot(dz1_dw1.T, dloss_da1 * sigmoid(z1) * (1 - sigmoid(z1)))dloss_db1 = np.sum(dloss_da1 * sigmoid(z1) * (1 - sigmoid(z1)), axis=0, keepdims=True)# 更新权重和偏置w1 -= learning_rate * dloss_dw1b1 -= learning_rate * dloss_db1w2 -= learning_rate * dloss_dw2b2 -= learning_rate * dloss_db2if epoch % 1000 == 0:print(f'Epoch {epoch}, Loss: {loss}')# 使用训练好的模型进行预测
def predict(X):z1 = np.dot(X, w1) + b1a1 = sigmoid(z1)z2 = np.dot(a1, w2) + b2a2 = sigmoid(z2)return a2# 测试
X_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
predictions = predict(X_test)
print("Predictions:")
print(predictions)# 绘制损失曲线
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()

在上述代码中,各个变量的意义如下:

  1. w1:第一层权重矩阵,它包含了输入数据到隐含层神经元的连接权重。其形状为 (input_size, hidden_size),其中 input_size 是输入特征的数量,hidden_size 是隐含层神经元的数量。

  2. b1:第一层偏置,它包含了隐含层每个神经元的偏置。其形状为 (1, hidden_size),用于调整神经元的激活阈值——如果偏置值很大,神经元更容易被激活;如果偏置值很小,神经元更难被激活

  3. w2:第二层权重矩阵,它包含了隐含层到输出层神经元的连接权重。其形状为 (hidden_size, output_size),其中 output_size 是输出层神经元的数量。

  4. b2:第二层偏置,它包含了输出层每个神经元的偏置。其形状为 (1, output_size),用于调整输出层神经元的激活阈值。

  5. X:训练数据集,包含输入数据的矩阵。其形状为 (样本数, input_size),其中 样本数 表示训练数据的数量。

  6. y:目标输出数据,包含每个样本的目标输出。其形状为 (样本数, output_size)

  7. losses:用于存储每个训练周期(epoch)中的损失值。损失是模型的预测与实际目标的误差。

  8. input_size:输入特征的数量,通常等于 X 矩阵的列数。

  9. hidden_size:隐含层神经元的数量,是神经网络结构中的一个超参数。

  10. output_size:输出层神经元的数量,通常等于 y 矩阵的列数。

  11. learning_rate:学习率,用于控制权重和偏置的更新步长。这是一个超参数,影响训练过程的速度和稳定性。

如何理解超参数?
“超” 表示它们在神经网络模型中处于更高的层次,是一种 控制参数的参数,是我们手动设置的。它们影响着训练的方式和结果,但不是从数据中学习得到的,两个常见的超参数是:

  1. 隐含层神经元数量(hidden_size): 这就好像是一个神秘的房间,我们在这个房间里进行了一些数学运算,以便理解和解决问题。但我们需要决定房间里有多少人。如果人太多,可能会变得复杂而慢,如果人太少,可能无法解决复杂的问题。所以,hidden_size 是一个数字,帮助我们控制神经网络中这个房间里有多少“工作人员”。
  2. 学习率(learning_rate): 学习率就像是我们在学校学习的速度。如果我们学习得太快,可能会错过重要的东西;如果我们学习得太慢,可能会浪费时间。所以,learning_rate 是一个数字,它帮助我们控制在训练神经网络时,我们每次更新权重和偏置的速度。如果它太大,可能导致不稳定,如果太小,训练可能会很慢。

这两个超参数,hidden_sizelearning_rate,是我们在构建神经网络时需要做的决策,它们会影响我们的模型是如何工作的。所以,选择适合问题的隐含层神经元数量和学习率非常重要。学习率要选择得当,使得模型在训练过程中能够迅速学习,同时又保持稳定,而隐含层神经元数量要足够适应问题的复杂度,但也不能过多,以免增加计算负担。

在上述代码中,用到的三个函数的简单解释:

  1. np.random.randn:这是一个用于生成随机数的函数。它创建一个包含随机数的数组,这些随机数遵循标准 正态分布 (均值为0,标准差为1)。在神经网络中,我们通常使用这些随机数来初始化神经网络的权重,使它们具有随机的初始值。

  2. np.zeros:这个函数用于创建一个数组,其中所有的元素都是零。在神经网络中,我们通常使用它来初始化偏置,以确保它们的初始值为零。

  3. np.dot:这是一个用于进行矩阵相乘的函数。在神经网络中,我们使用这个函数来计算不同层之间神经元的连接以及权重与输入数据之间的乘积。这有助于执行神经网络的前向传播和反向传播计算。

这些函数在神经网络的实现中非常有用,因为它们可以帮助我们进行随机初始化、初始化和数学运算,这些都是神经网络训练过程中的基本操作。

如何理解激活函数Sigmod?
它是一种用来处理神经网络中的数值的特殊函数。它的作用就像是一个开关,可以把输入的数值变成0到1之间的输出
如果我们把一个大的数值输入 Sigmoid 函数,它会输出接近于1的值,就好像是 开关被打开 一样。而如果我们输入一个负数或者很小的数,它会输出接近于0的值,就好像是开关被关闭一样。

所以,Sigmoid 函数的作用是把输入的数值 转换成一个在0到1之间的数 ,这在神经网络中常用于控制神经元的激活状态。这个函数的特点是输出总是在0到1之间,有助于神经网络学习非常复杂的模式和信息。

为什么需要设置b1、b2偏置调整神经元激活阈值呢?
简单来说,偏置就像是神经元的调节器,它帮助神经元更好地理解和处理各种不同的数据。

有些数据可能需要更小的刺激才能激活神经元,而有些数据可能需要更大的刺激。偏置就像是用来调整神经元敏感度的工具,使神经网络可以更好地学习和理解各种不同类型的数据。所以,偏置是神经网络中非常重要的部分,它增加了网络的适应能力,帮助网络更好地解决各种问题。

效果展示

经过训练的BP神经网络可以用于进行二分类任务,例如逻辑门操作,如AND、OR、XOR。在上面的代码示例(XOR)中,网络在经过足够的训练迭代后,可以准确地进行预测。
在这里插入图片描述

总结

BP神经网络是一种重要的神经网络模型,通过梯度下降算法来训练和优化模型,以解决分类和回归问题。它在机器学习和深度学习中具有广泛的应用,是许多人工智能应用的基础。

相关文章:

深入探索BP神经网络【简单原理、实际应用和Python示例】

人工神经网络(Artificial Neural Networks)是一种受到生物神经网络启发的机器学习模型,它的应用范围广泛,包括图像识别、语音识别、自然语言处理等领域。其中,BP神经网络(Backpropagation Neural Network&a…...

【LVGL】SquareLine Studio入门基础操作

1.SquareLine Studio基础 在这篇文章中将介绍SquareLine Studio的基础操作、解释如何加载一个项目、布局结构。    启动软件后,可以加载之前的项目、创建项目、加载一个示例。    这里以打开示例audio_mixer为例,可以双击该项目打开或者选中该项目点击右下角的【创建】按…...

【单片机】19-TFT彩屏

一、背景知识--显示器 1.什么是TFT (1)LCD显示器的构成:液晶面板驱动器【电压驱动】控制器【逻辑控制】 (2)液晶面板大致分为:TN,TFT,IPS等 (3)驱动器是跟随…...

高质量!推荐一些免费自学网站

大家好,我是 jonssonyan 说到自学网站,大家第一印象肯定是”菜鸟教程“、”w3school“、B 站大学。这些教程当然非常的好,而且适合入门学习,但是存在一些缺点,第一,知识点比较分散,没有一个整体…...

Linux之open/close/read/write/lseek记录

一、文件权限 这里不做过多描述,只是简单的记录,因为下面的命令会涉及到。linux下一切皆是文件包括文本、硬件设备、管道、数据库、socket等。通过ls -l 命令可以查看到以下信息 drwxrwxrwx 1 root root 0 Oct 10 17:06 open -rwxrwxrwx 1 root roo…...

3D调研-摄像头

参考资料: 来源1:https://leap2.ultraleap.com/leap-motion-controller-2 来源2: Gemini 2 _双目结构光相机_机器人感知-奥比中光官网 来源3: 国内外深度相机大盘点,仅用于学习科普!--机器视觉网 来源4&…...

光耦合器继电器与传统继电器:哪种最适合您的项目?

在电子和电气工程领域,继电器的选择可以显着影响项目的性能和安全性。两种常见类型的继电器是光耦合器继电器和传统机电继电器。每个都有其优点和缺点,因此选择过程对于项目的成功结果至关重要。 光耦合器继电器:基础知识 光耦合器继电器&…...

分享关于职场心态

1.解决问题而不是解释原因 2.秉承工匠思维而不是激情思维 什么是工匠思维? 工匠思维(The craftsman mindset)对待职业生涯的一种方式;是以产出为中心的职业观,关注自己给世界(工作)带来的价值…...

OK3568 UBUNTU 安装使用I2C-TOOLS

1. 安装 sudo apt-get update sudo apt-get install i2c-tools 使用I2Ctools 参考:https://blog.csdn.net/anyuliuxing/article/details/106382827 i2c-tools 是一组用于在Linux系统中进行I2C(Inter-Integrated Circuit)总线设备操作和调试…...

mysql面试题53:一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录 可以按照以下步骤进行: 确保…...

Docker服务更新与发现

一,docker-consul简介 这是一个基于分布式的服务发现和管理工具,它具有快速构建分布式框架,提供服务发现和服务治理等特点。同时consul还提供了可靠的保证,多数据中心和强大的API以满足高可用,分布式环境下的需求。 …...

【2023集创赛】安谋科技杯二等奖作品: 智能体感游戏机

本文为2023年第七届全国大学生集成电路创新创业大赛(“集创赛”)安谋科技杯二等奖作品分享,参加极术社区的【有奖征集】分享你的2023集创赛作品,秀出作品风采,分享2023集创赛作品扩大影响力,更有丰富电子礼…...

如何使用前端包管理器(如npm、Yarn)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

Codeforces Round 903 (Div. 3) C(矩形旋转之后对应的坐标)

题目链接:Codeforces Round 903 (Div. 3) C 题目: 思想: 旋转之后对应的坐标: (i,j)(n1-j,i)(n1-i,n1-j)(j…...

月薪过万的Java面试

​ 写了一个月,篇幅太长了,都写不下了,被逼无奈,只能拆分 面试题: HashMap底层实现原理,红黑树,B树,B树的结构原理,volatile关键字,CAS(比较与…...

html进阶语法

html进阶 列表、表格、表单 目标:掌握嵌套关系标签的写法,使用列表标签布局网页 01-列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表、定义列表。 无序列表 作用:布局排列整齐的不需要规定顺序的…...

博客系统(java,MySQL,HTML)

项目展示: 1.输入 http://127.0.0.1:8080/blog_system/login.html 即可进入登录页面 2.输入正确的用户名和密码后进入博客列表页 要是用户名或密码输入错误,会弹出错误提示框 3.点击查看全文,可以进入博客详情页查看详细信息 4.点击写博客&a…...

Android Studio SDKGradleJDK等工具的正确使用

AS在安装使用过程中可能会占用C盘大量空间,对于C盘容量本来就小的人来说非常不友好,其实我们可以自定义安装路径 SDK默认安装位置 各种版本和NDK也会安装到这个路径 SDK版本选择性安装 通过选择图示的按钮,可以显示SDK的版本详情&#xff0…...

利用Python提取将Excel/PDF文件数据

使用Python来创建一个接口,用于接收Excel文件资源链接,下载文件并执行指定的操作,然后返回处理后的数据。以下是一个基本的示例,展示如何使用Flask来创建这样的接口。请注意,这是一个简化的示例,您可能需要…...

纯 CSS 实现瀑布流布局的方法

纯 CSS 实现瀑布流布局的方法 这种方式兼容性不是很好,全部支持需要些时间,但是目前是可以使用 css 写出来的 display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 10px; grid-template-rows: masonry;全部的 css .container {display:…...

输入法显示到语言栏_状态栏

设置–时间和语言–语言–最右侧"相关设置"中的"拼写、键入和键盘设置" 最下方的"高级键盘设置"–“使用桌面语言栏(如果可用)” 点击"语言栏选项" 接下来就是不同输入法的设置了 搜狗输入法:右键输入法选择"隐藏状态栏"–…...

[samba]同一个文件夹,分不同权限管理

#问题 有一个文件夹A能让用户1拥有写权限,而让用户2拥有只读权限,而用户3啥权限都没有,该如何设置samba呢? #解决办法 1.首先创建一个linux分组(group),命名为samba groupadd samba 2.创建一个samba默认…...

项目整合管理

项目整合管理概述 概述 项目的复杂性来源于组织的系统行为、人类行为以及组织或环境中的不确定性。在项目整合之前,项目经理需要考虑项目面临的内外部环境因素,检查项目的特征或属性。 作为项目的一种特征或属性,复杂性的含义: …...

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持本地图片上传与回显的功能实现(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 原先这个基于RuoYi-Flowable-Plus的这个不支持本地图片上传,只支持oss图片上传,所以…...

2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人…...

Puppeteer实现上下滚动、打开新Tab、用户数据保存(三)

Puppeteer实现上下滚动、打开新Tab、用户数据保存(三) Puppeteer实现上下滚动、打开新Tab、用户数据保存(三)一、实现上下滚动二、打开新Tab三、用户数据保存四、效果演示 一、实现上下滚动 在自动化测试中,我们需要能…...

ArduPilot开源飞控之AP_InertialNav

ArduPilot开源飞控之AP_InertialNav 1. 源由2. 调用关系3. 重要例程3.1 read_inertia3.2 update 4. 封装接口4.1 get_filter_status4.2 get_position_neu_cm4.3 get_position_xy_cm4.4 get_position_z_up_cm4.5 get_velocity_neu_cms4.6 get_velocity_xy_cms4.7 get_speed_xy_c…...

DataX工具部署与使用(PostgreSQL to Oracle)

目录: 一、准备环境(1)安装JDK(2)检查Python版本(3)DataX 解压及测试 二、同步测试1、配置清单2、操作示例(1)同步测试环境(2)准备测试表&#xf…...

【PyTorch2 之027】在 PyTorch 中的R-CNN、Fast R-CNN和 Faster R-CNN

一、说明 亮点:对象检测是计算机视觉中最重要的任务之一。在这篇文章中,我们将概述最有影响力的对象检测算法家族之一:R-CNN、Fast R-CNN 和 Faster R-CNN。我们将重点介绍它们中的每一个的主要新颖性和改进。 最后,我们将专注于 …...

C++学习——C++函数的编译、成员函数的调用、this指针详解

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 从博文的分析中可以看出,对象的内存中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 stu 的类型为 Student,也不知道它…...