CNNS:基于AlexNet的分类任务

2023-05-16

CNNS:基于AlexNet的分类任务

  • 数据集介绍
    • 1. pokeman数据集介绍
    • 2. flower数据集介绍
  • 超参数对模型的影响
    • 1. 激活函数对模型的影响
      • (1) 使用`Sigmoid`进行训练
      • (2) 使用`tanh`进行训练
      • (3) 使用`ReLU`进行训练
    • 2. `学习率`对模型的影响
    • 3. `batch size`对模型的影响
  • 补充

数据集介绍

由于硬件的限制和网络模型的复杂度不是很高,目前我们应用与分类任务验证的数据集用到了pokemanflower两个数据集,这两个数据集都比较小,相关介绍请参考具体内容。

关于为什么会选择两个数据集?
我们想要通过数据集的大小去验证数据集对模型训练的影响。当然,我们也可以对已有的数据集进行数据集增强,我们在后续的实验过程中将对两个不同的数据集都进行数据集大小不同对模型训练影响进行验证。

pokenman数据集百度网盘下载:
https://pan.baidu.com/s/1Yro67aY4PF4qoaUM2Zu5fQ?pwd=jjjj
提取码:jjjj

flower数据集百度网盘下载:
链接:https://pan.baidu.com/s/1EW-VMHbDDQTTA83sigtEpQ?pwd=jjjj
提取码:jjjj

1. pokeman数据集介绍

pokeman数据集有五类,分别是bulbasaurcharmandermewtwopikachu、和squirtle。其中每一类大约是235左右张图片,图片的格式为.pngjpg
在这里插入图片描述

2. flower数据集介绍

flower数据集有五类,分别是daisydandelionrosessunflowers、和tulips。其中每一类包含的图片640张以上,图片的格式为jpg
请添加图片描述

超参数对模型的影响

1. 激活函数对模型的影响

AlexNet之前,激活函数一般都是用Sigmoid函数以及tanh函数。接下来我们将对激活函数SigmoidtanhReLU进行简单分析(关于其他的激活函数,待我们在具体使用的模型中进行探讨)。

(1) Sigmoid函数
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
在这里插入图片描述

Sigmoid函数优点:

  • 它是一个光滑的函数,导数可计算,且具有单调可微性。
  • Sigmoid函数的输出值在0到1之间,可以看作是概率值,适合进行分类任务。

Sigmoid函数缺点:

  • Sigmoid函数的导数在函数值接近饱和区时会变得非常小,这意味着梯度下降的步长也会变得非常小,从而导致训练过程缓慢。
  • Sigmoid函数的输出并不是以0为中心的,这会导致在反向传播时梯度的传递存在问题,从而影响模型的训练效果。
  • 当输入很大或很小时,Sigmoid函数的输出接近于0或1,这种情况被称为饱和,这会导致梯度消失或梯度爆炸的问题,进而影响模型的训练效果。

(2) tanh函数
t a n h ( x ) = s i n h ( x ) c o s h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{sinh(x)}{cosh(x)}=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=cosh(x)sinh(x)=ex+exexex
在这里插入图片描述

Tanh作为一种激活函数,与Sigmoid类似,也是一种S型函数。Tanh相比于Sigmoid有以下优缺点:
Tanh优点:

  • Tanh的输出范围是[-1,1],相比于Sigmoid的[0,1],中心化更明显,因此Tanh可以在数据正负对称的情况下有更好的表现。
  • Tanh在输入为负数的情况下会输出负数,可以更好的表达负数的影响,而Sigmoid在输入为负数时输出接近0,不够敏感。
  • Tanh的导数比Sigmoid的更加陡峭,更加容易在梯度下降时达到收敛。

Tanh缺点:

  • Sigmoid类似,Tanh也存在梯度消失的问题。当输入的值过大或过小时,其梯度值会趋近于0,导致神经网络难以进行优化。
  • Tanh的计算量比Sigmoid稍大,因此在计算速度要求高的场景下,可能不太适合使用。

综上所述,Tanh相比于Sigmoid在梯度下降时更容易达到收敛,并且可以在数据正负对称的情况下表现更好,但仍然存在梯度消失和计算量较大的问题。在实际应用中,需要根据具体情况选择适合的激活函数。

(3) ReLU函数
f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)
在这里插入图片描述

ReLU优点:

  • 加速模型收敛速度:ReLU在x>0时的导数为常数1,而在x<0时的导数为0,这使得神经网络训练时误差反向传播时的计算量大大降低,加速了模型收敛速度。
  • 稀疏性:由于ReLU在负数部分输出为0,因此可以使得一部分神经元的输出为0,产生稀疏性,减少参数的计算量和存储量,避免过拟合。
  • 有效解决梯度消失问题:由于ReLU在x>0时梯度为常数1,因此能够很好地缓解梯度消失的问题。

ReLU缺点:

  • 死亡ReLU问题:由于ReLU在x<0时输出为0,因此当某个神经元输出一直为负数时,就会导致梯度一直为0,这个神经元就不再对输入数据产生响应,称为“死亡ReLU”,这会影响模型的表达能力。
  • 输出不是零中心:ReLU在负数部分的输出为0,因此其输出不是以0为中心的,这会影响模型的训练效果,导致某些神经元可能无法收敛。
  • 对噪声敏感:ReLU在x<0时输出为0,因此对于输入数据中的噪声,会产生很大的影响,使得噪声被强制映射到0处。

实验中,数据集使用了pokeman,训练集和测试集的占比分别为80%和20%。epoch为100,learning rate = 0.01(此时,我们标记为策略1)。

lr = 0.01
epochs = 150
batch_size = 8

(1) 使用Sigmoid进行训练

在这里插入图片描述
使用Sigmoid激活函数,可以看到模型在训练过程中error收敛比较理想,但是训练集和测试集的效果都不好,出现了欠拟合现象。

(2) 使用tanh进行训练

tanh激活函数

(3) 使用ReLU进行训练

在这里插入图片描述
综上,使用激活函数tanh时,模型的error相对ReLU来说收敛较好(其他参数不变的情况下),激活函数Sigmoid 使用很不乐观。对于训练精度和测试精度来说,使用激活函数ReLUtanh相对较好。但是激活函数ReLU在模型中使用,error收敛过程并不理想,我们可以通过调整学习率learning rate进行调整。

声明:我们现有的实验结果精度并不算高,这其中之一的原因是因为数据集太少(测试集和训练集)。

2. 学习率对模型的影响

学习率是深度学习中一个重要的超参数,它决定了参数在每一次更新中的变化程度。学习率的大小直接影响着模型的训练效果,如果学习率过大或者过小都会对训练过程产生负面影响。

学习率过大时,会导致参数的更新过于剧烈,可能会错过局部最优解,而且可能导致损失函数震荡甚至爆炸,使得模型无法收敛。这种情况下可以采用学习率衰减等策略来降低学习率,使得参数更新的幅度逐渐减小。

学习率过小时,会导致参数更新的速度变慢,训练时间会变得很长,而且可能会陷入到局部最优解中无法跳出。这种情况下可以采用增大学习率或使用自适应学习率的方法。

一般来说,学习率的选取需要根据具体的问题进行调整,常用的方法有手动调节、学习率衰减、自适应学习率等。在实践中需要结合具体情况进行选择,不断地调整学习率以获得最好的训练效果。

本节,我们将针对策略1得出的结论,使用激活函数ReLU进行调整参数学习率。我们可以看到当lr=0.01时,error收敛在epoch在20左右并不好,首先我们对lr的调整策略(策略2)为:

epoch <= 18, lr = 0.01
epoch > 18, lr = 0.005
epochs = 150
batch_size = 8

在这里插入图片描述
我们针对策略2,损失error收敛过程中,在epoch为20以后,仍有小幅度的震荡,因此再一步进行调整(策略3):

epoch <= 18, lr = 0.01
epoch > 18, lr = 0.003
epochs = 150
batch_size = 8

在这里插入图片描述
由实验结果可以看到,此时(策略2)的效果已经达到了我们的预期(策略3的效果也比较好)。当然,我们也探索了其相反的方向,即在epoch大于16时,lr取0.8,其损失error收敛效果相较于策略1更差。

3. batch size对模型的影响

batch size 的大小会影响深度学习模型的训练精度。具体来说,batch size 的大小会影响以下几个方面:

  • 训练速度:batch size 越大,每个 epoch中需要的迭代次数就越少,从而训练速度就越快。但是,如果 batch size 超过了 GPUCPU 的内存容量,就会导致程序崩溃或训练速度变慢。
  • 模型泛化能力:batch size 越大,模型的泛化能力通常会越好,因为每个 batch 中的样本更加多样化,可以更好地表示整个数据集的特征。但是,如果 batch size 过大,就可能会导致模型过拟合,因为模型只学习到了局部的特征而没有充分学习整个数据集的特征。
  • 训练精度:batch size 的大小也会影响训练精度。一般来说,较小的 batch size 可以帮助模型更好地学习数据集的细节特征,从而提高训练精度。但是,如果 batch size 太小,就可能会导致模型无法充分利用 GPUCPU 的计算资源,从而训练速度变慢,甚至无法收敛。

因此,在选择 batch size 大小时,需要综合考虑以上几个方面,根据具体的情况选择合适的 batch size 大小。

较小的 batch size 可以帮助模型更好地学习数据集的细节特征,这是因为:

  • 较小的 batch size 使得模型在训练时可以看到更多的样本,每个样本都被独立处理,可以更好地掌握数据集的细节特征,如图像中的纹理、边缘等。相比之下,较大的 batch size 可能包含大量相似的样本,导致模型只学习到一些共性的特征,而忽略了一些细节信息。
  • 较小的 batch size 也可以增加模型的随机性,这有助于模型避免陷入局部最优解。因为每个 batch 中的样本都是随机抽样的,所以不同的 batch 中包含的样本是不同的,这可以使得模型更全面地学习数据集的特征,而不是陷入到某个局部最优解中。

由本章第二节内容可知,我们在实验过程中我们采用策略2比较好,所以,基于策略2的基础上,我们进行探索batch size对模型的影响。

首先,我们的超参数为(此时,我们标记为策略4):

epoch <= 18, lr = 0.01
epoch > 18, lr = 0.005
epochs = 150
batch_size = 16

在这里插入图片描述
通过实验发现,在在epoch大于50时,损失error出现了震荡。针对以上做进一步调整:

epoch <= 18, lr = 0.01
epoch > 18 ,lr = 0.003
epochs = 150
batch_size = 16

在这里插入图片描述
由实验发现,此时损失error没有达到收敛,所以我们调整超参数epoch

epoch <= 18, lr = 0.01
epoch > 18 ,lr = 0.003
epochs = 200
batch_size = 16

在这里插入图片描述
由实验可以看到,随着batch size的增大,测试精度有所改善,即验证了合理batch size可以提高模型的泛化能力。但是这里我们需要注意,不是batch size越大越好,这需要结合具体数据集、模型以及各种超参数等因素综合考虑。

同时,由实验数据可以看到,batch size为16时,验证集的精度不一定稳定(当然,我们可以进一步去调整在epoch在100以后的学习率进一步进行调整)。

在实验中,我们使用了batch size = 32进行实验,其他参数一定的情况下,验证集的精度更加不稳定且其验证集的精度低于batch size = 16的验证集的精度。

综上,我们经过调整参数lrbatch size以及激活函数等我们最终认为基于现有的数据集pokemanAlexNet数据集,其超参数较好的是:

epoch <= 18, lr = 0.01
epoch > 18 ,lr = 0.003
epochs = 150
batch_size = 16

补充

我们在整个实验过程中,没有关注一个很重要的参数时间,这是因为现在的过程并没有去探索在不降低精度的同时优化模型,而是通过调整各个参数去验证模型的能力。

更多请关注微信公众号【Hope Hut】:
在这里插入图片描述

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

CNNS:基于AlexNet的分类任务 的相关文章

  • windows下面安装git

    注意在安装过程中选择override这个选项
  • QT中Map的使用

    Qt中的QMap介绍与使用 xff0c 在坛子里逛了一圈 xff0c 发现在使用QMap中 xff0c 出现过很多的问题 xff0c Map是一个很有用的数据结构 它以 键 值 的形式保存数据 在使用的时候 xff0c 通过提供字符标示 x
  • ubuntu 更新内核切换内核启动

    1 查看需要更新的内核命令 xff1a apt cache search linux 该命令将会显示所有可以获取的内核 2 安装内核 xff0c 假设你要安装的内核为2 6 39 0 xff0c 则使用下面的命令 sudo apt get
  • 多线程实现对同一个或多个文件的读写操作

    程序用途 xff1a 实现多个线程对同一文件的读写操作 程序代码 xff1a test c 该程序在Ubuntu下测试通过 include lt stdio h gt include lt pthread h gt include lt s
  • linux下设置共享目录

    Linux系统的文件或目录的共享功能是非常强大 xff0c 而且是非常灵活的 xff0c 其对权限的控制可以做到非常的细致 xff0c 当然如果你是通过命令行方式进行设置的 话 xff0c 那么对于刚接触linux系统的用户来说将是一件十分
  • shell 数组赋值

    shell编程 xff0c 给数组赋值及两个数组初始化与比较 bin sh output files 61 cat outfiles for i 61 0 i lt output files 64 43 43 i do echo 34 ar
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • linux制作本地镜像

    1 前提条件 xff1a 有安装linux系统的iso 2 添加yum文件 xff1a touch etc yum repos d iso repo iso name 61 CentOS releasever Media baseurl 6
  • 使用parted创建分区

    今天在网上查找分区方法 xff0c 发现都是用的fdisk xff0c 但自己使用总是出错 xff0c 后来请求大神帮忙 xff0c 发现了一个好用的工具 xff0c 这里把具体的使用过程记录下来 root 64 pc160 parted
  • “结构体名”和“结构体名是个指针”的区别

    经常看见下面这样的定义 xff1a typedef struct int a double b emp i pemp i typedef 了两个新的数据类型 xff08 结构体 xff09 xff0c 其中一个是指针方式的名字 int ma
  • 简答实用的宏的写法

    本篇文章主要实现打印参数的传递 xff0c 这里定义了一个宏 define debug printf format printf 34 s d 34 format 34 34 func LINE VA ARGS
  • RK1126从入门到放弃:(二)Buildroot说明

    一 目录介绍 buildroot arch 存放CPU架构相关的配置脚本 xff0c 如arm mips x86 xff0c 这些CPU相关的配置 xff0c 在制作工具链时 xff0c 编译uboot和kernel时很关键 board x
  • 二进制基础及位运算

    一 什么是二进制 二进制是计算机运算时所采用的数制 xff0c 基数是2 xff0c 也就是说它只有两个数字符号 xff0c 即0和1 如果在给定的数中 xff0c 除0和1外还有其他数 xff08 例如1061 xff09 xff0c 那
  • Django学习笔记2 HTTP协议

    HTTP协议 web前端系统和后端系统之间是通过HTTP协议进行通信的HTTP 协议全称是超文本传输协议 xff0c 英文是 Hypertext Transfer ProtocolHTTP 协议最大的特点是通讯双方分为客户端和服务端 由于目
  • VINS-Mono视觉初始化代码详解

    摘要 视觉初始化的过程是至关重要的 xff0c 如果在刚开始不能给出很好的位姿态估计 xff0c 那么也就不能对IMU的参数进行精确的标定 这里就体现了多传感器融合的思想 xff0c 当一个传感器的数据具有不确定性的时候 xff0c 我们需
  • 5G DTU 数据上传 无线通信

    5G数据采集上传DTU xff0c 和各种使用串口通信的用户设备进行连接 xff0c 通过无线网络进行数据云端上传实现远程实时在线监测 采用心跳包保持永久在线 xff0c 支持断线自动重连 自动重拨号等特点 5G DTU组网迅速灵活 xff
  • 5G DTU地下水水位监测

    地下水监管不当会造成地面沉降 地裂缝 岩溶塌陷 海水入侵 水质污染等危害 xff0c 掌握了解地下水水位 分布等状态 xff0c 响应可持续发展的号召 xff0c 提高地下水资源科学保护和合理利用 计讯物联地下水水位监测系统平台采用5GDT
  • 5g DTU 无线数传终端应用

    DTU无线数传终端TD210全网通2G 3G 4G网络 xff0c 实现串口数据与IP数据的转换 xff0c DTU作为串口数据的无线终端设备 xff0c 可广泛应用于各行各业 DTU无线数传终端TD210应用 第一 xff0c 农业领域
  • 使用L298N电机驱动器和Arduino控制步进电机

    在本文中 xff0c 您将学习如何使用L298N电动机驱动器控制步进电动机 该驱动板通常用于控制直流电动机 xff0c 但它还是控制步进电动机的廉价替代品 xff01 它可以控制大多数步进电机 xff08 例如NEMA 17 xff09 的
  • STM32串口通讯(接收完成一整个数据帧再将数据发送出去)

    STM32串口通信可以分为查询 xff0c 中断 xff0c DMA三种方式进行通讯 xff0c 本文主要就中断的方式进行讲解 采用中断的方式进行通讯时 xff0c 可以使能接受非空中断 xff08 RXNE xff09 xff0c 当接收

随机推荐

  • 树的先序、中序、后序遍历

    遍历分分先序 中序 后序 先序 xff1a 先访问根结点 左结点 右结点 中序 xff1a 先访问左结点 根结点 右结点 后序 xff1a 先访问左结点 右结点 根结点 先序 xff1a ABC 中序 xff1a BAC 后序 xff1a
  • 调整Arduino STM32的串口缓存大小的方法

    通常Arduino中调整串口缓存大小的方法是修改HardwareSerial h中的常量 其实根本无需修改系统core中的定义值 xff0c 只需要在代码最上方添加以下常量定义 xff0c 抢在HardwareSerial h之前定义缓存大
  • C++入门学习(头文件)

    1 C 43 43 中的头文件 1 1 标准库中的头文件 C 43 43 标准库中的一切内容都被放在名字空间std中 xff08 名字空间中的内容对外是不可见的 xff09 xff0c 但是带来了一个新问题 xff0c 无数现有的C 43
  • 用for循环实现delay延时原理

    void Delay10ms unsigned int c 误差 0us unsigned char a b for c gt 0 c c可以不用初始化 xff0c 因为默认传的参数即为初始化 for b 61 38 b gt 0 b fo
  • 解决ROS中运行gazebo出现process has died的情况

    项目场景 xff1a gazebo 1 process has died pid 397 exit code 255 cmd opt ros melodic lib gazebo ros gzserver e ode worlds empt
  • 使用Ventoy制作U盘启动项

    最近在安装linux镜像的时候遇到了使用UltraISO软件制作U盘启动盘无法使用的情况 下面介绍另外一个软件把U盘制作成启动盘Ventoy xff1a 下载地址 xff1a Ventoy 使用方法 xff1a 1 下载好Ventoy xf
  • git 快速入手

    目录 一 xff1a 初次使用git及github 二 xff1a 将github上下载的代码上传到自己的github仓库里 三 xff1a 使用HTTP上传自己写的项目至github git常用指令汇总 使用需求 xff1a 初次接触gi
  • 线程、进程、并发、cpu、gpu的联系

    1 线程和进程的区别 进程 xff1a 一个在内存中运行的应用程序 每个进程都有自己独立的一块内存空间 xff0c 一个进程可以有多个线程 比如在Windows系统中 xff0c 一个运行的xx exe就是一个进程 线程 xff1a 进程中
  • ubuntu系统安装cuda、cudnn、pytorch和libtorch

    1 安装cuda和cudnn 本机安装的cuda版本11 0 2 cudnn版本 v8 0 5 cu11 0 Ubuntu20 04下CUDA cuDNN的详细安装与配置过程 xff08 图文 xff09 ubuntu20 04安装cuda
  • 深度学习语法篇

    一 基本常识 图像的分辨率的通道数 分辨率和通道数是两个不同的概念 分辨率指的是图像的像素数量 xff0c 它反映了图像的清晰度和细节程度 例如 xff0c 一个分辨率为64x64的图像意味着它有64个像素行和64个像素列 xff0c 总共
  • 第二讲:线性表示及坐标

    第二讲 xff1a 线性表示及坐标 一 线性表示 1 线性表示定义 xff1a 设 是线性空间V中的向量 xff0c 若存在V中一组向量 1 xff0c 2 xff0c xff0c n xff0c 及一组数x1 xff0c x2 xff0c
  • 快速理解掌握指针

    p gt next 61 q 像这种语句 xff0c 表示改变了p后面的连接关系 p 61 q gt next 这类语句 xff0c 没改变连接关系 xff0c 只是赋值而已 解读代码中指针所代表的节点之间的前后连接关系 只要输出该指针对应
  • 第三讲:子空间

    第三讲 xff1a 子空间 一 子空间定义 1 子空间 xff1a 设V是数域F上的线性空间 xff0c W是V的子集 xff0c 若对W中的任意元素 xff0c 及数K F xff0c 按V中的加法和数乘有 xff1a 1 xff09 4
  • Qt多线程之线程之间的传递数据

    hpp span class token macro property span class token directive keyword ifndef span MAINWINDOW H span span class token ma
  • 循环队列c代码实现

    循环队列的抽象数据类型 ADT 队列 xff08 Queue xff09 Data 同线性表 元素具有相同的类型 xff0c 相邻元素具有前驱和后继的关系 Operator span class token function InitQue
  • CMake(四):变量

    前面展示了如何定义基本目标和生成构建输出 就其本身而言 xff0c 这已经很有用了 xff0c 但CMake还附带了一大堆其他特性 xff0c 这些特性带来了极大的灵活性和便利性 本章涵盖了CMake最基本的部分之一 xff0c 即变量的使
  • CMake(六):使用子目录

    对于简单的项目 xff0c 将所有内容保存在一个目录中是可以的 xff0c 但是大多数实际项目倾向于将它们的文件分割到多个目录中 通常可以找到不同的文件类型或分组在各自的目录下的独立模块 xff0c 或者将属于逻辑功能组的文件放在项目目录层
  • CMake(九):生成器表达式

    当运行CMake时 xff0c 开发人员倾向于认为它是一个简单的步骤 xff0c 需要读取项目的CMakeLists txt文件 xff0c 并生成相关的特定于生成器的项目文件集 例如Visual Studio解决方案和项目文件 xff0c
  • CNNs系列---AlexNet网络介绍

    CNNs系列 AlexNet介绍 导言AlexNet介绍1 网络结构 1 参数量 计算量和输出尺寸计算公式 2 网络参数解析 2 AlexNet中涉及到的知识点 1 基本概念 2 AlexNet网络结构的贡献 导言 我们将开启关于卷积神经网
  • CNNS:基于AlexNet的分类任务

    CNNS 基于AlexNet的分类任务 数据集介绍1 pokeman数据集介绍2 flower数据集介绍 超参数对模型的影响1 激活函数对模型的影响 1 使用 96 Sigmoid 96 进行训练 2 使用 96 tanh 96 进行训练