【深度学习】批量规范化

news2024/11/12 16:24:17

训练深层神经网络是十分困难的,光是之前简单的模型在简单的数据集上训练都不太轻松。

而批量规范化(batch normalization)是一种流行且有效的技术,可以帮助加快深层网络的收敛速度。

一、训练深层网络

我们回顾一下训练神经网络时出现的一些挑战。

首先,数据预处理的方式通常对最终结果产生巨大影响。

第二,对于典型的多层感知机或卷积神经网络,当我们训练时,中间层的变量可能具有更广的变化范围,随着训练更新的模型参数变幻莫测。

第三,更深层的网络很复杂,容易过拟合。

批量规范化应用于单个可选层(也可应用到所有层),其原理如下:

在每次迭代训练中,我们首先规范化输入,即通过减去其均值并除以其标准差,其中两者均基于当前小批量得到。接下来,我们应用比例系数和比例偏移。

需要注意的是,如果批量大小为 1,减去均值之后,每个隐藏单元将变为 0,那我们将无法学习到任何东西。

因此,只有使用足够大的小批量,批量规范化这种方法才是有效且稳定的。所以在应用批量规范化时,批量大小的选择相当重要。

二、批量规范化层

和激活函数、丢弃法(dropout)一样,批量规范化可看成一层网络:批量规范化层。

对于全连接层和卷积层,它们的批量规范化实现略有不同。

全连接层的批量规范化作用在特征维度上,而卷积层作用在通道维度上。

把图像的像素视为样本,通道视为特征,卷积层可理解为高维的全连接层。

全连接层

通常,我们将批量规范化层置于全连接层中的仿射变换和激活函数之间。

设全连接层的输入为 x x x,权重参数和偏置参数分别为 W \pmb{W} W b \pmb{b} b,激活函数为 ϕ \phi ϕ,批量规范化的运算符为 BN。

那么,使用批量规范化的全连接层的输出 h \pmb{h} h计算详情为:
h = ϕ ( B N ( W x + b ) ) . \pmb{h}=\phi(BN(\pmb{W}\pmb{x}+\pmb{b})). h=ϕ(BN(Wx+b)).

卷积层

同样,对于卷积层,我们可以在卷积层之后和非线性激活函数之前应用批量规范化。

当卷积层有多个输出通道时,我们需要对这些通道的“每个”输出执行批量规范化,每个通道都有自己的拉伸(scale)和偏移(shift)参数。

三、使用批量规范化层的 LeNet

回顾一下 LeNet 架构,一层 5$\times 5 卷积,填充大小为 2 ,输出通道数为 6 ;一层 2 5 卷积,填充大小为 2,输出通道数为 6;一层 2 5卷积,填充大小为2,输出通道数为6;一层2\times 2 汇聚层,步幅为 2 ;再一层 5 2 汇聚层,步幅为 2;再一层 5 2汇聚层,步幅为2;再一层5\times 5 卷积层,输出通道数为 16 ;之后一层 2 5 卷积层,输出通道数为 16;之后一层 2 5卷积层,输出通道数为16;之后一层2\times$2 汇聚层,步幅为 2;最后展平加上三层全连接层。

LeNet 中的数据流

代码实现为:

    net = nn.Sequential(      # LeNet模型
        nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
        nn.AvgPool2d(kernel_size=2, stride=2),
        nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
        nn.AvgPool2d(kernel_size=2, stride=2),
        nn.Flatten(),
        nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
        nn.Linear(120, 84), nn.Sigmoid(),
        nn.Linear(84, 10))

若想添加批量规范化层,在相应位置处加入相应的nn.BatchNorm即可。全连接层使用nn.BatchNorm1d,即 1 维;卷积层使用nn.BatchNorm2d,即 2 维。

传入的参数为全连接层的输出数量或卷积层的输出通道数,代码实现为:

    net = nn.Sequential(  # 带BN的LeNet模型
        nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.BatchNorm2d(6), nn.Sigmoid(),
        nn.AvgPool2d(kernel_size=2, stride=2),
        nn.Conv2d(6, 16, kernel_size=5), nn.BatchNorm2d(16), nn.Sigmoid(),
        nn.AvgPool2d(kernel_size=2, stride=2),
        nn.Flatten(),
        nn.Linear(16 * 5 * 5, 120), nn.BatchNorm1d(120), nn.Sigmoid(),
        nn.Linear(120, 84), nn.BatchNorm1d(84), nn.Sigmoid(),
        nn.Linear(84, 10))

由于批量规范化的作用是加快收敛速度,因此需要关注这 10 轮训练的损失变化情况,我们利用 tensorboard 来可视化。

运行后得到的损失变化图如下:

带 BN 的 LeNet 训练损失变化情况

我们再运行之前写的 LeNet 模型,其损失变化图为:

不带 BN 的 LeNet 训练损失变化情况

可以发现加了 BN 后,训练损失收敛加快了不少(纵轴的范围),早早地就降低为 0.55;而最初的 LeNet,训练了好多轮后才到达同样的损失水平。

总结一下:

  • 在模型训练过程中,批量规范化利用小批量的均值和标准差,不断调整神经网络的中间输出,使得整个神经网络各层的中间输出值更加稳定,从而加快收敛速度。
  • 批量规范化在全连接层和卷积层的使用均略有不同。

上次 VGG 的代码和这次批量规范化的代码见附件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第十三章:Sentosa_DSML社区版-机器学习之聚类】

目录 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章:Sentosa_DSML社区版-机器学习之聚类】 13.1 KMeans聚类 1.算子介绍 KMeans…

【全新课程】正点原子《ESP32物联网项目实战》培训课程上线!

正点原子《ESP32物联网项目实战》全新培训课程上线啦!正点原子工程师手把手教你学!通过多个项目实战,掌握ESP32物联网项目的开发! 一、课程介绍 本课程围绕物联网实战项目展开教学,内容循序渐进,涵盖了环…

后台管理系统开箱即用的组件库!!【送源码】

今天给大家推荐几款的后台管理系统开箱即用的组件库,基于ElementUI二次封装,开发必备 Headless UI Headless UI 是一款出色的前端组件库,专为与 Tailwind CSS 集成而设计。一组完全无样式、完全可访问的 UI 组件,可以自由的引入…

【Linux】nginx连接前端项目

文章目录 一、项目编译1.编译文件2.dist文件 二、Linux nginx配置三、启动nginx 一、项目编译 1.编译文件 2.dist文件 二、Linux nginx配置 在Xshell软件中,点击CtrlAltF进入文件传输找到地址:/usr/local/nginx/html将dist文件传入 找到nginx.conf&…

考研数据结构——C语言实现冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较每对相邻元素,并在顺序错误的情况下交换它们。这个过程重复进行,直到没有需要交换的元素,这意味着列表已经排序完成。冒泡排序的名字来源于较小的元素会逐…

mybaits获取sqlsession对象后自动开启事务,增删改要记得提交事务!

mybaits中在使用 SQLSession 对象进行数据库操作时,需要注意事务的处理。 以下是关于这个问题的详细说明: 一、SQLSession 与事务的关系 SQLSession 是 MyBatis 框架中用于执行 SQL 语句和与数据库交互的关键对象。当获取 SQLSession 对象后&#xff…

Kali crunsh字典工具

查看自带密码字典 vim /usr/share/wordlists 使用 crunch 字典工具 随机组成6位纯数字密码 crunch 6 6 0123456789 -o test1.txt 由 Abc1234 随机组成的 6~8 位密码 crunch 6 8 Abc1234 -o test2.txt 以A开头后面跟3位数字组成的4位密码 crunch 4 4 -t A%%% -o test3.txt

【鸿蒙HarmonyOS NEXT】用户首选项Preference存储数据

【鸿蒙HarmonyOS NEXT】数据存储之用户首选项Preference 一、环境说明二、Preference运作机制三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、Preference运作机制 应用场景: 用户首选项为应用提…

2024全球科技品牌价值榜50强:苹果第一

根据《Brand Finance 2024年全球最具价值科技品牌榜单报告》,中国品牌在社交媒体、电子和电器行业表现卓越。 全球排名前三的是:苹果、微软以及 Google。国内前几的是:抖音、微信和华为,分为位于第五、十一、十五位。 英伟达在人工…

深度学习|误差逆传播:梯度速解

文章目录 引言链式法则误差逆传播加法的逆传播乘法的逆传播逆传播求梯度 SoftmaxWithLoss 层正向传播逆传播代码实现参考 结语 引言 我们知道训练神经网络模型的核心是以损失函数为基准来调整优化网络参数,使得网络的输出尽可能接近真实标签。在神经网络中&#xf…

关于区块链的安全和隐私

背景 区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…

Python酷库之旅-第三方库Pandas(124)

目录 一、用法精讲 551、pandas.DataFrame.notna方法 551-1、语法 551-2、参数 551-3、功能 551-4、返回值 551-5、说明 551-6、用法 551-6-1、数据准备 551-6-2、代码示例 551-6-3、结果输出 552、pandas.DataFrame.notnull方法 552-1、语法 552-2、参数 552-3…

BitSet-解决数据压缩问题

一、问题引入 假设QQ音乐服务器上有9000万首音乐,用户按照歌名来搜索歌曲,如何使得满足这一需求所需的数据占用的内存空间最小以及用户搜索歌曲速度更快 二、分析问题 1、为了满足使得数据占用的内存更小,可以采用映射的思路,按…

项目实战bug修复

实操bug修复记录 左侧侧边栏切换,再次切换侧边栏,右侧未从顶部初始位置展示。地图定位展示,可跳转到设置的对应位置。一个页面多个el-dialog弹出框导致渲染层级出现问题。锚点滚动定位错位问题。动态类名绑定。el-tree树形通过 draggable 属性…

Linux 进程与进程状态

目录 1.进程。 1.进程的概念 2.并行和并发 3.并行和并发的区别: 4.PCB(程序控制块) 5.进程组与会话。 6.进程状态。 1.进程。 1.进程的概念 进程是操作系统进行资源分配和调度的一个独立单位。每个进程都运行在操作系统的控制之下&…

游戏化在电子课程中的作用:提高参与度和学习成果

游戏化,即游戏设计元素在非游戏环境中的应用,已成为电子学习领域的强大工具。通过将积分、徽章、排行榜和挑战等游戏机制整合到教育内容中,电子课程可以变得更具吸引力、激励性和有效性。以下是游戏化如何在转变电子学习中发挥重要作用&#…

git命令将已经commit的代码push到其他分支

文章目录 一:对于多分支的代码库,将提交记录从一个分支转移到另一个分支是常见需求方法1:撤销commit操作方法2:实用命令git cherry-pick 来移动commit 二、不小心revert导致代码消失的问题 一:对于多分支的代码库&…

U8集成网页开发的数据查询(二)

前言 根据上一篇的开发,最近又做了一些单据查询的开发。 效果展示图片 结语 目前网页查询已经完善功能: 1.与U8的账号密码保持一致,定时从U8同步账号密码。 2.角色管理,权限分配。 3.U8基础档案数据查询(示例&#…

828华为云征文 | 解锁企业级邮件服务,在华为云Flexus x实例上部署Mailcow开源方案

前言 华为云Flexus X实例携手Mailcow开源邮件方案,为企业打造了一个既高效又安全的邮件服务解决方案。Flexus X实例的柔性算力与高性能,是这一方案的坚实基石。它提供CPU内存的灵活定义,以经济型价格实现旗舰级性能,确保邮件服务的…

实例讲解电动汽车故障分级处理策略及Simulink建模方法

电动汽车的故障有很多种,每种故障发生时产生危害性是不同的,因此对于不同故障应采取不同的处理方式。目前一般有两种故障处理方式,一种是针对每一种故障对其故障危害性进行判断,然后针对不同故障设定不同的故障处理机制&#xff1…