Numpy 实现全连接神经网络

2023-10-26

神经网络与深度学习实验报告

一、实验名称

Numpy 实现全连接神经网络

二、实验要求

用 python 的 numpy 模块实现全连接神经网络。网络结构为一个输入层、一个隐藏层、一个输出层。隐藏层的激活函数为 Relu 函数,输出层的激活函数为 softmax 函数,损失函数为交叉熵。
在这里插入图片描述

图1-网络结构示意图

三、实验目的

通过学习的前馈神经网络基本原理(网络结构,损失函数,参数学习),使用numpy实现神经网络,进一步加深对神经网络的理解。掌握神经网洛原理和方法。

四、实验过程

4.1前馈神经网络

4.1.1环境配置

所需的包有:numpy,tensorflow,keras
在这里插入图片描述

4.1.2准备数据

采用手写字体数据集mnist,训练数据集包含60000个样本,测试数据集包含10000个样本,每张图片由28x28个像素点构成,每个像素点用一个灰度值表示,在这里,将28x28得像素展开为一个一维向量,并对每个像素值进行标准化处理,标签为0-9。
在这里插入图片描述

4.1.3定义矩阵乘法类

矩阵乘法类包括向前传播计算隐藏层的输入矩阵X和反向传播计算权重矩阵W和输入矩阵X的梯度,由输出矩阵Y的梯度grad_y计算而来,得到loss关于X矩阵和W矩阵的梯度,grad_x和grad_w
在这里插入图片描述

4.1.3定义Relu类,Softmax类,交叉熵类

Relu类包括向前传播计算激活值,作为下一层的输入矩阵X,反向传播根据输出值Y的梯度grad_y计算损失函数梯度。Softmax类作为输出层的激活函数,交叉熵类作为损失函数的计算。
在这里插入图片描述
在这里插入图片描述

4.1.4定义模型

包括网络权重矩阵的初始化,模型向前传播和反向传播计算loss关于权重矩阵W的梯度
在这里插入图片描述

4.1.5计算训练集准确率,迭代,计算测试集loss和准确率函数

根据Softmax值计算准确率,根据交叉熵损失函数计算loss,根据梯度值更新权重矩阵。
在这里插入图片描述

4.1.5模型训练与评价

划分训练集和测试集,标签处理,设置迭代次数,记录准确率和loss值。
在这里插入图片描述

4.2更改神经网络拓扑结构、激活规则和学习算法

4.2.1改变激活函数(sigmoid激活函数)

原始代码中采用的是Relu函数,Relu优点: relu函数在大于0的部分梯度为常数,所以不会产生梯度消失现象.。而对于sigmod函数,在正负饱和区的梯度都接近于0,可能会导致梯度消失现象。Relu函数的导数计算更快,所以使用梯度下降时比Sigmod收敛起来要快很多。Relu缺点:Relu死亡问题。Sigmod优点:具有很好的解释性,将线性函数的组合输出为0,1之间的概率。Sigmodu缺点:激活函数计算量大,反向传播求梯度时,求导涉及除法。反向传播时,在饱和区两边导数容易为0,即容易出现梯度消失的情况,从而无法完成深层网络的训练。自定义Sigmoid函数类,将激活函数更改,代码如下:
在这里插入图片描述

4.2.2改变学习算法(小批量梯度下降)

原始代码中采用的是批量梯度下降算法,每次需要计算所有样本的交叉熵损失函数,当样本数过大时,计算量大,随机梯度下降法的缺点是无法利用计算机的并行计算能力。小批量梯度下降算法(Mini-Batch Gradient Descent)是批量梯度下降和随机梯度下降的折中。每次迭代时,选取小部分样本来计算梯度并更新参数。这样既可以兼顾随机梯度下降法的有点,也可以提高训练效率。在实际应用中,小批量梯度下降算法有收敛快、计算开销小的优点。具体代码如下:
在这里插入图片描述

4.2.3改变网络结构(增加层数和神经元个数)

为了使模型精度更高,增加了网络层数,由一层隐藏层变为两层隐藏层,神经元个数为100,具体代码如下:
在这里插入图片描述

五、实验结果
在这里插入图片描述
在这里插入图片描述

六、实验总结

本次实验通过numpy实现了前馈神经网络的搭建与训练过程,将数学理论推导通过代码实现,加深了对神经网络的理解,同时通过对神经网络拓扑结构、激活规则和学习算法的更改,比较前后模型学习能力,与理论知识相结合,有很大的收获。根据实验结果对比分析得到了如下心得体会:
(1) 随着网络层数的加深和神经元个数的增加,模型的拟合能力会变强。
(2) Sigmoid激活函数在收敛速度上不如Relu函数,原因应该是Sigmoid函数两端饱和,易发生梯度消失问题,在本次实验中效果一般。
(3) 小批量梯度下降算法比批量梯度下降算法收敛速度快很多,且模型的准确率更高。
(4) 综合模型采用激活函数,3层神经网络(2层隐藏层),小批量梯度下降算法,模型的收敛速度快,在eopch为20时就已基本收敛,且准确率最高,在训练集和测试集上分别为0.95358和0.9494。

在实验的过程中也遇到了问题,当加深神经网络或增加神经元个数时,输出层Softmax函数在计算时会发生上溢出,但是输入时,像素值已经进行了标准化,通过查阅资料以及和同学讨论后发现,可能是因为权重初始化时值较大,随着神经网络层数的增加,向前传播不断累积,导致最后输出时值较大,做指数运算后数值太大导致溢出,解决方案有:减小初始化权重值并适当增大学习率,从Softmax函数计算做出改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy 实现全连接神经网络 的相关文章

随机推荐

  • python爬虫网络出错怎么办_Python爬虫异常处理

    100 继续 客户端应当继续发送请求 客户端应当继续发送请求的剩余部分 或者如果请求已经完成 忽略这个响应 101 转换协议 在发送完这个响应最后的空行后 服务器将会切换到在Upgrade 消息头中定义的那些协议 只有在切换新的协议更有好处
  • linux上redis常用命令以及遇到的问题

    1 在linux上解压缩后使用make命令进行编译的时候 错误类型 zmalloc h 50 31 致命错误 jemalloc jemalloc h 没有那个文件或目录 原因是因为编译的时候Linux默认内存分配器是jemalloc 而Re
  • 添加商品到购物车 Vuex

    商品详情 购物车页面 code
  • OFDM插入导频过程详解

    ofdm符号的长度 有效数据 cp的长度 cp就是将有效数据的后半部分1 4截取并添加到有效数据的开始部分 比如一个ofdm符号的长度为4us 那么有效数据的长度为3 2us cp的长度为0 8us 子载波的间隔 1 有效数据的长度 就是有
  • Unity使用c#开发遇上的问题(十三)(unity平台下使用 Vuforia 以及 ARFoundiation 的总结,根据个人观点)

    文章目录 前言 一 Vuforia的使用感觉 二 ARfoundiation的使用感觉 总结 前言 有一段时间没有更新系列的内容 上次更新完又重新思考了一下以后进行的方向 这里就目前接触的Vuforia 和 unity 自带的AR 之前叫A
  • 自动生成根据mysql表创建hive表脚本

    bin bash source etc profile 该脚本为手动传参根据MySQL表信息创建hive表 输入参数判断逻辑 必须数据两个参数 一个是MySQL库名 第二个是表名 if eq 2 then db name 1 mysql 库
  • 浅析java垃圾回收机制

    一 什么是垃圾回收 1 垃圾回收 顾名思义 便是将已经分配出去的 但却不再使用的内存回收回来 以便能够再次分配 在 Java 虚拟机的语境下 垃圾指的是死亡的对象所占据的堆空间 垃圾回收只会负责释放那些对象占有的内存 此时对象也就被销毁 2
  • 0长度数组的使用,重点掌握的知识

    0长度的数组在ISO C和C 的规格说明书中是不允许的 但是GCC的C99支持的这种用法 GCC对0长度数组的文档参考 Arrays of Length Zero 如下代码片段 哪个更简洁更灵活 看一眼就知道了 include
  • 用vscode开发autojs,输出窗口不显示任何输出结果

    我的情况是 我vscode开发autojs 程序 之前在一切正常的情况下 输出窗口可以正常显示程序运行结果 右侧红圈里可以选择我连接的手机型号 如下图 但是现在出现问题 就是输出窗口不显示任何结果 在右侧的选项卡里也找不到我的手机型号 之前
  • 2021年全球与中国龙胆苦苷行业市场规模及发展前景分析

    2021年全球与中国龙胆苦苷行业市场规模及发展前景分析 本报告研究全球与中国市场龙胆苦苷的发展现状及未来发展趋势 分别从生产和消费的角度分析龙胆苦苷的主要生产地区 主要消费地区以及主要的生产商 重点分析全球与中国市场的主要厂商产品特点 产品
  • (R,线性回归)R语言里的模型诊断图(Residuals vs Fitted,Normal QQ , Scale-Location ,Residuals Leverage)

    线性回归 是概率统计学里最重要的统计方法 也是机器学习中一类非常重要的算法 线性模型简单理解非常容易 但是内涵是非常深奥的 尤其是线性回归模型中的Diagnostics plot的阅读与理解一直被认为是线性回归中的一个难点 在任何线性模型中
  • 获取微信公众号地址的图片不能正常显示的问题

    获取微信公众号地址的图片不能正常显示的问题 目前已经获取微信公众号发布的图片 但不能正常显示 提示 此图片来自微信公众平台 未经允许不得引用 看了一下他的地址是这样的 https mmbiz qpic cn mmbiz jpg ic70qV
  • Codeforces Round #291 (Div. 2)

    题目链接contest 514 A Chewba ca and Number 不允许有前导零 所以如果第一位是9的话 需要特别考虑 一开始理解错了题意 又WA了呜呜呜 include
  • 弱密码测试工具blaster使用演示

    声明 出品 安全客 以下内容 来自安全客作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责任 关于blaster blaster是一款强大的弱密码隐患检测
  • RabbitMQ-Java 简单使用

    RabbitMQ Java 入门案例 参考非常详细的博主教程 https www cnblogs com dtdx p 14362760 html SpringBoot Java 版教程 https blog csdn net lgl782
  • 【C/C++】智能指针

    文章目录 1 智能指针的原理 1 1RAII 1 2实现一个自己的智能指针 1 2 1拷贝出现的二次析构问题 2 标准库中的智能指针 2 1std auto ptr 2 2std unique ptr 2 3std shared ptr 2
  • ovs-vswitchd的启动分析

    ovs vswitchd的启动分析 无修改源码 一 主要数据结构和概念了解 1 概念 在 OVS 中 有几个非常重要的概念 Bridge Bridge 代表一个以太网交换机 Switch 一个主机中可以创建一个或者多个 Bridge 设备
  • 解决:DevTools failed to load SourceMap:... net::ERR_HTTP_RESPONSE_CODE_FAILURE的问题

    Google chrome开发人员控制台中一直报此错误 虽然只是一个警告 但是体验还是非常不好 先说解决方案 第一种 在Google chrome浏览器调试工具中 设置该调试工具 点开之后选择Settings 关闭此选项 虽然这种方式是隐藏
  • 小白的福音:零基础入门机器人操作系统ROS

    小小的机器人 如何运作 如何操作 作为一名程序员 你不想了解吗 今天就给大家解密 机器人操作系统ROS 今天分享的课程采用由浅入深 层层递进的讲解方式 让你0基础轻松入门ROS机器人操作系统 并利用ROS框架开发硬件驱动 课程亮点 1 课程
  • Numpy 实现全连接神经网络

    神经网络与深度学习实验报告 一 实验名称 Numpy 实现全连接神经网络 二 实验要求 用 python 的 numpy 模块实现全连接神经网络 网络结构为一个输入层 一个隐藏层 一个输出层 隐藏层的激活函数为 Relu 函数 输出层的激活