第四章.神经网络—BP神经网络
第四章.神经网络
4.3 BP神经网络
BP神经网络(误差反向传播算法)是整个人工神经网络体系中的精华,广泛应用于分类识别,逼近,回归,压缩等领域,在实际应用中,大约80%的神经网络模型都采用BP网络或BP网络的变化形式。
1.网络结构

2.公式

3.激活函数
这三个激活函数(Sigmoid,Tanh,Softsign)都存在一个问题,这几个函数的导数几乎都是小于1的,卷积层最多可以有5,6层,层数太多可能无法正常学习。
1).Sigmoid函数:

2).Tanh函数和Softsign函数:
- 图像

- 权重初始值的设置方式:

参数说明
①.nj:上一层神经元的个数
②.nj+1:下一层神经元的个数
3).ReLu函数:

4.BP网络示例1: 解决异或问题
1).代码:
import numpy as np
import matplotlib.pyplot as plt# 激活函数:sigmoid
# 正向传播
def sigmoid(x):return 1 / (1 + np.exp(-x))# 反向传播
def dsigmoid(x):return x * (1 - x)def update():global X, T, W, V, lrL1 = sigmoid(np.dot(X, V))L2 = sigmoid(np.dot(L1, W))L2_delta = (T.T - L2) * dsigmoid(L2)L1_delta = L2_delta.dot(W.T) * dsigmoid(L1)W_C = lr * L1.T.dot(L2_delta)V_C = lr * X.T.dot(L1_delta)W += W_CV += V_C# 判断输出值的是否大于0.5.sigmoid函数是关于(x, y)=(0, 0.5)对称的S型曲线
def judge(x):if x > 0.5:return 1else:return 0# 输入数据
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])# 标签
T = np.array([[0, 1, 1, 0]])# 权重初始值
V = np.random.random([3, 4]) * 2 - 1
W = np.random.random([4, 1]) * 2 - 1# 超参数设置
lr = 0.11
epoch = 20000error = []
for i in range(epoch):update()if i % 500 == 0:L1 = sigmoid(np.dot(X, V))L2 = sigmoid(np.dot(L1, W))error.append(np.mean(np.abs(T.T - L2)))L1 = sigmoid(np.dot(X, V))
L2 = sigmoid(np.dot(L1, W))for i in map(judge, L2):print(i)plt.figure(figsize=(6, 4))
x = np.arange(len(error))
plt.plot(x, error, 'r')
plt.xlabel('epoch')
plt.ylabel('error')
plt.show()
2).结果展示:

5.BP网络示例2: 手写数字识别
1).代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split# 激活函数:sigmoid
# 正向传播
def sigmoid(x):return 1 / (1 + np.exp(-x))# 反向传播
def dsigmoid(x):return x * (1 - x)class NeuralNetwork:def __init__(self, layers):# 权值的初始值,范围[-1,1]self.V = np.random.random((layers[0] + 1, layers[1] + 1)) * 2 - 1self.W = np.random.random((layers[1] + 1, layers[2])) * 2 - 1# 推理函数def predict(self, x):# 添加偏置temp = np.ones(x.shape[0] + 1)temp[0:-1] = xx = tempx = np.atleast_2d(x)L1 = sigmoid(np.dot(x, self.V))L2 = sigmoid(np.dot(L1, self.W))return L2def train(self, X, T, lr, epochs):# 添加偏置temp = np.ones([X.shape[0], X.shape[1] + 1])temp[:, 0:-1] = XX = tempfor n in range(epochs + 1):i = np.random.randint(X.shape[0]) # 随机选取一个数据x = [X[i]]x = np.atleast_2d(x) # 转为2维数据L1 = sigmoid(np.dot(x, self.V))L2 = sigmoid(np.dot(L1, self.W))L2_detal = (T[i] - L2) * dsigmoid(L2)L1_detal = L2_detal.dot(self.W.T) * dsigmoid(L1)W_C = lr * L1.T.dot(L2_detal)V_C = lr * x.T.dot(L1_detal)self.W += W_Cself.V += V_C# 每训练1000次预测一次精度if n % 1000 == 0:predictions = []for j in range(X_test.shape[0]):output = self.predict(X_test[j])predictions.append(np.argmax(output))accuracy = np.mean(np.equal(predictions, T_test))accuracys.append(accuracy)print('epoch:', n, 'accuracy:', accuracy)# 加载数据
digits = load_digits()# 数据和标签
X = digits.data
T = digits.target# 输入数据归一化
X = (X - X.min()) / X.max()# 创建网络[64,100,10]
nm = NeuralNetwork([64, 100, 10])# 分割数据: 1/4为测试数据,3/4为训练数据
X_train, X_test, T_train, T_test = train_test_split(X, T)# 标签二值化 0,8,6 0->1000000000 3->0001000000
labels_train = LabelBinarizer().fit_transform(T_train)print('start:')accuracys = []
nm.train(X_train, labels_train, lr=0.11, epochs=20000)print('end')plt.figure(figsize=(8, 6))
x_data = np.arange(len(accuracys))
plt.plot(x_data, accuracys, 'r')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()
2).结果展示:

6.混淆矩阵
1).示例:
- 假设有一个用来对猫(cats),狗(dogs),兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。

- 在这个混淆矩阵中,实际有8只猫,但是系统将其中的3只预测成了狗,实际6只狗,其中一只被预测成了兔子,两只被预测成了猫。
7.神经网络: sklearn手写数字识别
1).代码:
from sklearn.datasets import load_digits
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, confusion_matrix# 加载数据
digits = load_digits()# 数据和标签
x_data = digits.data
t_data = digits.target# 标准化
scaler = StandardScaler()
x_data = scaler.fit_transform(x_data)
x_train, x_test, t_train, t_test = train_test_split(x_data, t_data)# 创建模型和训练
mlp = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=1000)
mlp.fit(x_train, t_train)prediction = mlp.predict(x_test)
print(classification_report(t_test, prediction))
print(confusion_matrix(t_test, prediction))
2).结果展示:

8.神经网络:葡萄酒品质分类
1).示例:
- 我们将使用一个葡萄酒数据集。它具有不同葡萄酒的各 种化学特征,均在意大利同一地区生长,但数据标签分 类为三种不同的品种。我们将尝试建立一个可以根据其 化学特征对葡萄酒品种进行分类的神经网络模型
2).代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report, confusion_matrix# 加载数据
data = np.genfromtxt('D:\\data\\wine_data.csv', delimiter=',')# 数据和标签
x_data = data[:, 1:]
t_data = data[:, 0]# 测试数据和训练数据的切分
x_train, x_test, t_train, t_test = train_test_split(x_data, t_data)# 数据标准化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)# 创建模型和训练
mlp = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=1000)
mlp.fit(x_train, t_train)# 评估
predictions = mlp.predict(x_test)
print(classification_report(t_test, predictions))
print(confusion_matrix(t_test, predictions))
3).结果展示:

相关文章:
第四章.神经网络—BP神经网络
第四章.神经网络 4.3 BP神经网络 BP神经网络(误差反向传播算法)是整个人工神经网络体系中的精华,广泛应用于分类识别,逼近,回归,压缩等领域,在实际应用中,大约80%的神经网络模型都采用BP网络或BP网络的变化…...
如何压缩RAR格式文件?
RAR是我们日常生活工作中经常用到的压缩文件格式之一,那么RAR文件如何压缩呢? 不管压缩哪种格式的压缩文件,我们都需要用到压缩软件。针对RAR格式,我们可以选择最常见的WinRAR,当然如果有同样适用于RAR格式的压缩软件…...
JS 执行机制 详解(附图)
一、JS是单线程JS语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是JS这门脚本语言诞生的使命所致——用来处理页面中用户的交互,以及操作DOM而诞生的。单线程就意味着,所有任务需要排队,前一个任务结束…...
华为OD机试真题Java实现【 计算面积】真题+解题思路+代码(20222023)
计算面积 绘图机器的绘图笔初始位i在原点(0.0)。 机器启动后其绘图笔按下面规则绘制直线: 1 )尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E, 2 )期间可通过指令在纵坐标轴方向进行偏移。井同时绘制直线,偏移后按规则1绘制直线;指令的格式为X offsetY。表示在横坐标X…...
【JVM】运行时数据区与对象的创建流程
4、运行时数据区 4.1、运行时数据区介绍 运行时数据区也就是JVM在运⾏时产生的数据存放的区域,这块区域就是JVM的内存区域,也称为JVM的内存模型——JMM 堆空间(线程共享):存放new出来的对象 元空间(线程共…...
flutter- JSON解析框架使用方法json_serializable
对于目前来说,大部分的API网络请求的通讯内容数据格式都是JSON。JSON返回的都是字符串,假如要取到data里面的id,去直接字符串截取肯定是不行的,要通过一定的方式把它解析成Map或者解析成对象,再去处理它。像一些简单的…...
第十三届蓝桥杯国赛 C++ B 组 J 题——搬砖(AC)
目录1.搬砖1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路3.Ac_code1.搬砖 1.题目描述 这天,小明在搬砖。 他一共有 nnn 块砖, 他发现第 iii 砖的重量为 wiw_{i}wi, 价值为 viv_{i}vi 。他突然想从这些 砖中选一些出来从…...
Spring Cloud Nacos源码讲解(十)- Nacos服务端服务发现处理
Nacos集群数据同步 当我们有服务进行注册以后,会写入注册信息同时会触发ClientChangedEvent事件,通过这个事件,就会开始进行Nacos的集群数据同步,当然这其中只有有一个Nacos节点来处理对应的客户端请求,其实这其中…...
C++ 修改程序进程的优先级(Linux,Windows)
文章目录1、Linux1.1 常用命令1.1.1 不占用终端运行和后台运行方式1.1.2 查询进程1.1.3 结束进程1.1.4 优先级命令1.2 C 代码示例1.2.1 代码一1.2.2 代码二2、Windows2.1 简介2.2 函数声明2.3 C 代码示例2.3.1 代码一2.3.2 代码二结语1、Linux 1.1 常用命令 1.1.1 不占用终端…...
同步和异步promise
进程和线程进程(厂房):程序的运行环境线程(工人):进行运算的东西同步和异步同步:一件事干完才去干下一件事,前面的代码不执行,后面的代码也不执行。同步的代码可能会出现…...
CHATGPT是新的“搜索引擎终结者”吗?百度是否慌了
ChatGPT 以其非凡的自然语言处理 (NLP) 能力和清晰的响应风靡全球,有望带来一场重大的技术革命。在不知不觉中,叙事转向了ChatGPT与百度的对决,因为来自OpenAI的智能和健谈的聊天机器人已经慢慢获得了“潜在的百度终结…...
力扣-订单最多的客户
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:586. 订单最多的客户二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总…...
MyBatis学习笔记(六) —— MyBatis的各种查询功能
6、MyBatis的各种查询功能 6.1、查询一个实体类对象 SelectMapper.java接口 /*** 根据用户id查询用户信息* param id* return*/ User getUserById(Param("id") int id);SelectMapper.xml <!--User getUserById(Param("id") int id)--> <selec…...
2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客
文章目录前言一、安装和配置环境1.安装 Git2.安装 Node.js二、新建博客项目1.GitLab配置CI/CD自动化部署1.1 GitLab新建项目1.2 GitLab自建Runners1.2.1 下载gitlab-runner1.2.2 注册Runners1.2.3 安装Runners并启动1.3 添加.gitlab-ci.yml文件2.拉取和推送hexo blog2.1 拉取he…...
centos7安装
centos7安装制作U盘启动盘下载镜像下载 UltralISO制作启动盘使用U盘安装系统修改模式为 UEFI调整BOOT option保存重启进入安装界面安装图形界面安装搜狗输入法制作U盘启动盘 下载镜像 去官网下载镜像,找到 mirrors链接(速度快) 选择一个中…...
java String类(超详细,含常用方法、面试题,内存图,案例)
String类一、String类的特点二、String 类的常见构造方法三、String常见的面试题1.字符串常量池2.String s "abc"与String s new String("abc")区别3.字符拼接4.常量优化机制四、String常用方法1. 比较字符串内容2. 遍历字符串3.截取字符串4.替换字符串5…...
哈希表以及哈希冲突
目录 哈希表 哈希冲突 1. 冲突发生 2. 比较常见的哈希函数 3. 负载因子调节(重点) 散列表的载荷因子概念 负载因子和冲突率的关系 冲突-解决-闭散列 线性探测 二次探测 冲突-解决-开散列 结尾 我们在前面讲解了TerrMap(Set)的底层是一个搜索…...
测试——基本概念
概念 测试和调试有以下几点区别: 测试是测试人员进行的工作,调试是开发人员调试是发现并解决问题,测试只是发现问题测试贯穿于整个项目的生命周期,而调试主要在编码阶段 测试人员一般有如下的工作: 需求分析&#x…...
SnowFlake 雪花算法和原理(分布式 id 生成算法)
一、概述 SnowFlake 算法:是 Twitter 开源的分布式 id 生成算法。核心思想:使用一个 64 bit 的 long 型的数字作为全局唯一 id。算法原理最高位是符号位,始终为0,不可用。41位的时间序列,精确到毫秒级,41位…...
【死磕数据库专栏】MySQL对数据库增删改查的基本操作
前言 本文是专栏【死磕数据库专栏】的第二篇文章,主要讲解MySQL语句最常用的增删改查操作。我一直觉得这个世界就是个程序,每天都在执行增删改查。 MySQL 中我们最常用的增删改查,对应SQL语句就是 insert 、delete、update、select…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
