第四章.神经网络—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…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
