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

article/2025/8/23 19:57:07

文章目录

  • 1. 题目描述
  • 2. 求解原理
    • (1)算法模型
    • (2)算法原理
  • 3.编程实现
    • (1)环境说明
    • (2)实验方案
    • (3)Python实现

1. 题目描述

设计一个三层神经网络解决手写数字的识别问题。
要求:
(1)三层神经网络如图:784-15-10结构
(2)使用随机梯度下降算法和MNIST训练数据。
http://yann.lecun.com/exdb/mnist/
在这里插入图片描述

2. 求解原理

(1)算法模型

利用BP神经网络,这里有输入层、隐藏层、输出层共三层,包括两个阶段,

  1. 第一阶段是输入信息的正向传播,其中隐藏层节点的输出为:
    在这里插入图片描述
    输出层节点的输出:
    在这里插入图片描述
  2. 第二阶段是误差反向传播阶段
    第p个样本的误差:
    在这里插入图片描述
    p个样本的总误差:
    在这里插入图片描述

(2)算法原理

BP算法可以描述如下:
(1)工作信号正向传播:输入信号从输入层经隐藏层,传向输出层,在输出端产生输出信号,这是工作信号的正向传播。在信号的向前传递过程中网络的权值是固定不变的,每一层神经元的状态只影响下一层神经元的状态。如果在输出层不能得到期望的输出,则转入误差信号反向传播。正向传播的数学模型为:
在这里插入图片描述
在这里插入图片描述
其中n为样本数,w为权值,θ为偏置,
在这里插入图片描述
为激活函数,这里选择sigmoid函数为激活函数。
(2)误差信号反向传播:网络的实际输出与期望输出之间差值即为误差信号,误差信号由输出端开始逐层向前传播,这是误差信号的反向传播。在误差信号反向传播的过程中,网络的权值由误差反馈进行调节。通过权值的不断修正使网络的实际输出更接近期望输出。
在反向传播中,第p个样本的误差为:
在这里插入图片描述
p个样本的总误差:
在这里插入图片描述
梯度为:
在这里插入图片描述
其中:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3.编程实现

(1)环境说明

python3.7
tensorflow2.1.0

(2)实验方案

数据来源:
手写数字图片数据集MNIST,它包含了0-9共10种数字的手写图片,每种数字一共7000张图片,采样自不同书写风格的真实手写图片,一共70000张图片,其中60000张图片作为训练集,用来训练模型,剩下的10000图片作为测试集,用来预测或者测试,训练集和测试集共同组成了MNIST数据集。
考虑到手写数字图片包含的信息比较简单,每张图片均被缩放到28 × 28的大小,同时
只保留了灰度信息。这些图片由真人书写,包含了如字体大小、书写风格、粗细等丰富的样式,确保这些图片的分布与真实的手写数字图片的分布尽可能的接近,从而保证了模型的泛化能力。
实验计划和流程:
(1)网络搭建。搭建784-15-10结构的神经网络,激活函数类型为 ReLU。
(2)模型训练。使用交叉熵作为损失函数。
验证和测试:
手写数字图片 MNIST 数据集的训练误差曲线如图所示,由于 3 层的神经网络表达能力较强,手写数字图片识别任务相对简单,误差值可以较快速、稳定地下降。其中,把对数据集的所有样本迭代一遍叫作一个Epoch,我们可以在间隔数个 Epoch 后测试模型的准确率等指标,方便监控模型的训练效果。
通过简单的 3 层神经网络,训练固定的 200 个 Epoch 后,我们在测试集上获得了91.59%的准确率。模型的训练误差曲线如图一所示,误差函数为交叉熵,其值越小,模型预测效果就越好。测试准确率曲线如图二所示。
如果使用复杂的神经网络模型,增加数据增强环节,精调网络超参数等技巧,可以获得更高的模型性能。
在这里插入图片描述

图一 训练误差

在这里插入图片描述

图二 准确率

(3)Python实现

import tensorflow as tf  # 导入TF库
from tensorflow import keras  # 导入TF子库keras
from tensorflow.keras import layers, optimizers, datasets  # 导入Tf子库
import matplotlib.pyplot as pltdef preprocess(x, y):"""数据处理函数"""x = 2 * tf.cast(x, dtype=tf.float32) / 255. - 1  # tf.cast函数可以完成精度转换y = tf.cast(y, dtype=tf.int32)return x, y# load_data()函数返回两个元组(tuple)对象,第一个是训练集,第二个是测试集
# 每个tuple的第一个元素是多个训练图片数据的X,第二个元素是训练图片对应的类别数字Y
# 其中X的大小为(60000,28,28),代表了60000个样本,每个样本由28行、28列构成
# 由于是灰度图片,故没有RGB通道;训练集Y的大小为(60000),代表了这60000个样本的标签数字
# 每个样本标签用一个范围为0~9的数字表示。测试集X的大小为(10000,28,28)
(x, y), (x_test, y_test) = datasets.mnist.load_data()  # 加载MNIST数据集
print(x.shape, y.shape)
# TensorFlow中加载的MNIST数据图片,数值的范围为[0,255]。在机器学习中间,一般希望数据的范围
# 在0周围的小范围内分布。通过预处理步骤,我们把[0,255]像素范围归一化到[0,1.]区间,在缩放到
# [-1,1]区间,从而有利于模型的训练
# x = 2*tf.convert_to_tensor(x, dtype=tf.float32)/255.-1  # 转换为浮点张量,并缩放到-1~1
# y = tf.convert_to_tensor(y, dtype=tf.int32)  # 转换为整型张量# 处理训练数据
batch_size = 512
train_dataset = tf.data.Dataset.from_tensor_slices((x, y))  # 构建数据集对象
train_dataset = train_dataset.map(preprocess).shuffle(10000).batch(batch_size)  # 随机打散,批量训练# 处理测试数据
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_dataset = test_dataset.map(preprocess).batch(batch_size)# 使用TensorFlow的Sequential容器可以非常方便地搭建多层网络
# 利用Sequential容器封装3个网络层,前网络层的输出默认作为下一层的输入
model = keras.Sequential([  # 2个非线性层的嵌套模型layers.Dense(15, activation='relu'),  # 隐藏层1 ,15layers.Dense(10)])  # 输出层,输出节点为10
# w' = w - lr * grad, 更新网络参数
optimizer = optimizers.Adam(lr=1e-5)  # 优化器,加快训练速度
total_epoch = 200  # 迭代次数def main():loss_ce = 0.for epoch in range(total_epoch):for step, (x, y) in enumerate(train_dataset):# 模型训练with tf.GradientTape() as tape:  # 构建梯度记录环境# 打平操作,[b,28,28] => [b,784]x = tf.reshape(x, (-1, 28 * 28))# step1. 得到模型输出output [b, 784] => [b, 10]out = model(x)# [b] => [b, 10]y_onehot = tf.one_hot(y, depth=10)  # one-hot编码# 计算交叉熵 [b, 10]loss_ce = tf.reduce_mean(tf.losses.categorical_crossentropy(y_onehot, out, from_logits=True))# step3. 自动计算参数的梯度w1, w2, w3, b1, b2, b3grads = tape.gradient(loss_ce, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))if step % 100 == 0:print(epoch, step, f'loss_ce: {float(loss_ce)}')# testtotal_correct = 0total_num = 0for x, y in test_dataset:# x:[b,28,28] --> [b,784]# y:[b]x = tf.reshape(x, [-1, 28 * 28])# [b,10]out = model(x)# out --> prob [b,10]prob = tf.nn.softmax(out, axis=1)# [b,10] --> [b], int32pred = tf.argmax(prob, axis=1)pred = tf.cast(pred, dtype=tf.int32)# pred:[b]# y:[b]# correct: [b], True: equal; False: not equalcorrect = tf.equal(pred, y)correct = tf.reduce_sum(tf.cast(correct, dtype=tf.int32))total_correct += int(correct)total_num += x.shape[0]acc = total_correct / total_numprint(epoch, f'test acc: {acc}')if epoch % 10 == 0:epoch_plt.append(epoch)ce_plt.append(loss_ce)acc_plt.append(acc)return epoch_plt, ce_plt, acc_pltif __name__ == '__main__':epoch_plt, ce_plt, acc_plt = [], [], []epoch_plt, ce_plt, acc_plt = main()plt.figure()plt.plot(epoch_plt, ce_plt, color="yellow", marker='s')plt.xlabel('Epoch')plt.ylabel('CrossEntropy')plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文标签plt.rcParams['axes.unicode_minus'] = Falseplt.legend(('训练误差',))plt.figure()plt.plot(epoch_plt, acc_plt, color="red", marker='s')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文标签plt.rcParams['axes.unicode_minus'] = Falseplt.legend(('准确率',))plt.show()

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

多层神经网络BP算法解释

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

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

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

BP神经网络(3层)

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

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

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

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

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

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

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

三层架构的搭建

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

tfs路径映射已存在

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

TFS2012 权限设置

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

TFS学习

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

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

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

Azure DevOps Server 2019 (TFS)安装教程

(1)安装教程: Azure DevOps Server 2019 (TFS)安装教程 - danzhang - 博客园 Azure DevOps Server 的安装教程_躺平佛系周大侠的博客-CSDN博客 1.配置数据库,使用默认的sql express 2.搜索配置, 使用默认…

TFS用户组说明和用户权限配置过程

一、TFS默认用户组的说明 服务器级别用户组: 1、TFS服务器/Team Foundation Valid Users:可以访问TFS服务器。 2、TFS服务器/Team Foundation Licensed Users:可以连接TFS服务器。这个组只在 Team Foundation Server Workgroup Edition 版本…