作业2:BP 算法实验报告

article/2025/8/23 19:56:10

作业2:BP 算法实验报告

1. 算法介绍

BP 算法全称叫做误差反向传播(error Back Propagation, 或者叫作误差逆传播)算法。现实任务中使用神经网络时,大多是在是使用 BP 算法进行训练。BP 算法不仅可以用户多层前馈神经网络,还可以用于其它类型的神经网络,例如训练递归神经网络。但通常说“BP 网络”时,一般是指用 BP 算法训练的多层前馈神经网络。

BP 神经网络是这样一种神经网络模型,它是由一个输入层、一个输出层和一个或多个隐层构成,它的激活函数采用 sigmoid 函数,采用 BP 算法训练构成前馈神经网络。
在这里插入图片描述

上图为一个单隐层前馈神经网络的拓扑结构,BP神经网络算法使用梯度下降法(gradient descent),以单个样本的均方误差的负梯度方向对权重进行调节。可以看出:BP算法首先将误差反向传播给隐层神经元,调节隐层到输出层的连接权重与输出层神经元的阈值;接着根据隐含层神经元的均方误差,来调节输入层到隐含层的连接权值与隐含层神经元的阈值。

2. 算法基本思想

算法基本思想:在前馈网络中,输入信号经过输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。

BP 算法包括信号的向前传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。

3. 算法流程

  1. 网络初始化:权值初始值使用较小的随机数设定。

  2. 输入 <输入向量>(向前)

    • 首先,将<输入向量>输给传输层;

    • <输入向量>向输出层传播;

    • 各神经元:求来自前层神经元的附加权值和,由传输函数决定输出值。如激活函数为 Gigmoid函数 f(x),则 输出值 = f(输入和)

  3. 向输出层输入 <教师信号>,将与 <输入向量> 对应的 <教师信号> 提供给输出层。

  4. 误差反传的权值学习:

    • 根据:新权值=旧权值×常数×𝛿×(来自前一层的神经元输出) 进行权值更新。

    • 当激活函数为 Sigmoid 函数时,

    • 输出层:𝛿=(输出)×(1−输出)×[(教师信号)−(神经元输出)]

    • 隐层:𝛿=(输出)×(1−输出)×(来自紧接其后层的的附加权值和)

  5. 返回到 2,重复 2~4 进行权值学习。

4. 数据集介绍

本次实验采用经典的手写体识别数据集作为实验数据。MINST数据库是由Yann提供的手写数字数据库文件,其官方下载地址http://yann.lecun.com/exdb/mnist/。数据库的里的图像都是28*28大小的灰度图像,每个像素的是一个八位字节(0~255)。这个数据库主要包含了60000张的训练图像和10000张的测试图像,主要是下面的四个文件:

Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)

部分数据集如下:
在这里插入图片描述

5. 算法实现

5.1. 算法过程

在这里插入图片描述

网络结构包含一个输入层、一个隐层和一个输出层。其实总共只有两个层级结构。

5.2. 数据集导入

定义一个读取数据集的方法 load_mnist,方法的参数有:normalize 表示将图像的像素值正规化为 0.0~1.0,one_hot_labelTrue 的情况下,标签作为 one-hot 数组返回,one-hot 数组是指[0,0,1,0,0,0,0,0,0,0] 这样的数组;:flatten 表示是否将图像展开为一维数组。最终返回 (训练图像, 训练标签), (测试图像, 测试标签)

def load_mnist(normalize=True, flatten=True, one_hot_label=False):if not os.path.exists(save_file):init_mnist()with open(save_file, 'rb') as f:dataset = pickle.load(f)if normalize:for key in ('train_img', 'test_img'):dataset[key] = dataset[key].astype(np.float32)dataset[key] /= 255.0if one_hot_label:dataset['train_label'] = _change_one_hot_label(dataset['train_label'])dataset['test_label'] = _change_one_hot_label(dataset['test_label'])if not flatten:for key in ('train_img', 'test_img'):dataset[key] = dataset[key].reshape(-1, 1, 28, 28)return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label']) 

5.3. 层级结构设计

定义一个两层的网络,输入层大小 input_size784,隐层大小 hidden_size50,输出层大小 output_size10。权重初始化 weight_init_std 默认设置为 0.01

network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)

隐层牵涉到权值参数与偏置项的设定。在未运行算法之前,需要对权重参数与偏置项进行初始化。权重初始化如下:

self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
self.params['b1'] = np.zeros(hidden_size)
self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 
self.params['b2'] = np.zeros(output_size)

生成层初始化:

self.layers = OrderedDict()
self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])
self.layers['Relu1'] = Relu()
self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])

定义损失函数:

def loss(self, x, t):y = self.predict(x)return self.lastLayer.forward(y, t)

定义精度:

def accuracy(self, x, t):y = self.predict(x)y = np.argmax(y, axis=1)if t.ndim != 1 : t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(x.shape[0])return accuracy

定义预测方法:

def predict(self, x):for layer in self.layers.values():x = layer.forward(x)return x

定义梯度下降方法 gradientx 表示输入数据。t 表示监督数据。w1b1w2b2:分别代表隐层的突触权重、偏置项,输出层的突触权重、偏置项。激活函数设定为 relu 函数。

def gradient(self, x, t):self.loss(x, t)dout = 1dout = self.lastLayer.backward(dout)layers = list(self.layers.values())layers.reverse()for layer in layers:dout = layer.backward(dout)grads = {}grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].dbgrads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].dbreturn grads

5.4. 算法迭代过程

for i in range(iters_num):batch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]grad = network.gradient(x_batch, t_batch)for key in ('W1', 'b1', 'W2', 'b2'):network.params[key] -= learning_rate * grad[key]loss = network.loss(x_batch, t_batch)train_loss_list.append(loss)if i % iter_per_epoch == 0:train_acc = network.accuracy(x_train, t_train)test_acc = network.accuracy(x_test, t_test)train_acc_list.append(train_acc)test_acc_list.append(test_acc)print(train_acc, test_acc)

5.5. 训练结果

在这里插入图片描述
从训练结果不难看出,精度不断升,并最终稳定在 0.9797 左右。


http://chatgpt.dhexx.cn/article/R3gV9e7b.shtml

相关文章

企业三层架构、冗余、STP生成树协议总结

总结 1.企业三层架构 2. 冗余(线路冗余+设备冗余) 3. STP生成树协议:IEEE802.1D,PVST+,802.1W,RSTP(rpvst),802.1S(MST) 企业三层架构(内网结构) 接入层: 常使用二层交换机,就近提供接口密度,用于用户的接入 汇聚层(分布层): 集合所有接入层流量(星型),…

利用BP神经网络 设计一个三层神经网络解决手写数字的识别问题

文章目录 1. 题目描述2. 求解原理&#xff08;1&#xff09;算法模型&#xff08;2&#xff09;算法原理 3.编程实现&#xff08;1&#xff09;环境说明&#xff08;2&#xff09;实验方案&#xff08;3&#xff09;Python实现 1. 题目描述 设计一个三层神经网络解决手写数字的…

模式识别八--三层BP神经网络的设计与实现

文章转自&#xff1a;http://www.kancloud.cn/digest/prandmethod/102850 本文的目的是学习和掌握BP神经网络的原理及其学习算法。在MATLAB平台上编程构造一个3-3-1型的singmoid人工神经网络&#xff0c;并使用随机反向传播算法和成批反向传播算法来训练这个网络&#xff0c…

多层前馈神经网络及BP算法

一.多层前馈神经网络 首先说下多层前馈神经网络&#xff0c;BP算法&#xff0c;BP神经网络之间的关系。多层前馈[multilayer feed-forward]神经网络由一个输入层、一个或多个隐藏层和一个输出层组成&#xff0c;后向传播[BP]算法在多层前馈神经网络上面进行学习&#xff0c;采用…

bp神经网络的拓扑结构,bp神经网络模型结构图

试画出BP神经网络结构输入层3节点,隐层5节点,输出层2节点 BP&#xff08;BackPropagation&#xff09;神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出&#xff0c;是一种按误差逆传播算法训练的多层前馈网络&#xff0c;是目前应用最广泛的神经网络模型之一。 …

人工神经网络的拓扑结构,三层神经网络结构图

人工神经网络的基本组成是什么啊 谷歌人工智能写作项目&#xff1a;小发猫 神经网络BP模型 一、BP模型概述误差逆传播(ErrorBack-Propagation)神经网络模型简称为BP(Back-Propagation)网络模型常见的神经网络结构。 PallWerbas博士于1974年在他的博士论文中提出了误差逆传播…

模式识别:三层BP神经网络的设计与实现

本文的目的是学习和掌握BP神经网络的原理及其学习算法。在MATLAB平台上编程构造一个3-3-1型的singmoid人工神经网络&#xff0c;并使用随机反向传播算法和成批反向传播算法来训练这个网络&#xff0c;这里设置不同的初始权值&#xff0c;研究算法的学习曲线和训练误差。有了以上…

数学建模常用模型21:BP神经网络(三层)

给大家安利一款朋友开发的自研国产数据分析基础工具&#xff0c;一键式自动分析&#xff0c;自动生成分析模板&#xff0c;5分钟掌握主流61个统计类数学模型&#xff08;几乎涵盖SPSS绝大部分功能&#xff09;&#xff0c;以及23个有监督机器学习&#xff08;包括随机森林&…

三层神经网络的BP(BackPropagation)算法推导

BP算法&#xff1a; 利用的是sigmoid函数来搭建的一个三层神经网络。假设其拓扑结构如图1-1所示。 图1-1 三层神经网络 该网络的运行流程为&#xff1a;当输入一个样例后&#xff0c;获得该样例的特征向量&#xff0c;再根据权向量得到感知机的输入值&#xff0c;然后使用si…

多层神经网络BP算法解释

# 多层神经网络BP算法解释 ## 前向传播 *** * 该项目采用反向传播算法描述了多层神经网络的教学过程。 为了说明这个过程&#xff0c;使用了具有两个输入和一个输出的三层神经网络&#xff0c;如下图所示: 每个神经元由两个单元组成。 第一单元添加权重系数和输入信号的乘积。 …

python实现神经网络_Python实现的三层BP神经网络算法示例

本文实例讲述了Python实现的三层BP神经网络算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 这是一个非常漂亮的三层反向传播神经网络的python实现&#xff0c;下一步我准备试着将其修改为多层BP神经网络。 下面是运行演示函数的截图&#xff0c;你会发现预测的…

BP神经网络(3层)

终于放假啦&#xff0c;于是就想着把前一段时间学习的知识给整理一下&#xff0c;希望能够对小伙伴们有所帮助。 数学原理 BP(Back Propagation)(Rummelhart D, McClelland J.,1986)神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络。 三层BP神经网络的组成主要…

基于三层BP神经网络的人脸识别

实验四、基于三层BP神经网络的人脸识别 一、 实验要求 采用三层前馈BP神经网络实现标准人脸YALE数据库的识别&#xff0c;编程语言为C系列语言。 二、BP神经网络的结构和学习算法 实验中建议采用如下最简单的三层BP神经网络&#xff0c;输入层为 &#xff0c;有n个神经元节点&a…

神经网络笔记1-三层BP神经网络

神经网络笔记1-三层BP神经网络 神经网络性质简介信息正向传输预期神经网络的获得误差反向更新&#xff08;输出层→隐藏层&#xff09;误差反向更新&#xff08;隐藏层→输入层&#xff09; 伪代码实现训练函数测试函数&#xff0c;用训练好的神经网络预测 手写数字识别举例识别…

BP神经网络的梯度公式推导(三层结构)

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一. 推导目标 1.1 梯度公式目标 1.2 本文梯度公式目标 二. 网络表达式梳理 2.1 梳理三层BP神经网络的网络表达式 三. 三层BP神经网络梯度推导过程 3.1 简化推导目标 3.2 输出层权重…

三层架构的搭建

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 使用的技术有&#xff1a; ospf技术、NAT技术、静态、DHCP、VRRP 、STP、 VLAN、TRUNK 、 access接口模式、 以太网中继Eth-Trunk(华为) 技术、vlan管理技术 实验思路&#xff1a; 实验过程&#xff1a; IP地址的配置&am…

tfs路径映射已存在

环境&#xff1a;VS2019、Win10 最近公司服务器更换&#xff0c;想要将tfs项目映射到原来的工作区&#xff0c;提示“tfs-路径 XXX 已在工作区 XXX;XXX 中映射”&#xff0c;通过网络查找资料得知&#xff0c;需要修改Team Foundation的配置文件&#xff1a; 1.找到目录&#x…

TFS2012 权限设置

环境&#xff1a; TFS2012 win7 1.安装好TFS 2.创建系统用户组&#xff1a; TFSAdmins、TFSDevs、TFSUsers 分别为TFS管理人员组、TFS开发人员组、TFS普通用户组。 如下图&#xff1a; 这样我们在TFS的权限设置里&#xff0c;都只针对这三个组设权限&#xff0c;不会具体到…

TFS学习

一、TFS是什么 TFS全称是 Team Foundation Server&#xff0c;是 Microsoft 提供的 源代码管理、数据收集、报告和项目跟踪的平台工具。 主要功能 版本管理&#xff1a;工作区&#xff08;workspace&#xff09;、变更集&#xff08;changeset&#xff09;、标签并行开发支持…

tfs java_TFS (Team Foundation Server) 2013集成Maven构建

Team Foundation Server原生就支持跨平台的构建&#xff0c;包括Ant和Maven两种构建方式。通过配置构建服务器&#xff0c;连接TFS源代码库&#xff0c;可以实现持续集成构建&#xff0c;自动检测代码库健康状况&#xff0c;进而实现自动测试和部署。本文以Maven为例&#xff0…