什么是Batch Normalization?
一、概念
Batch Normalization是在2015年提出的数据归一化方法,主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度,使模型训练过程更加稳定,避免梯度爆炸或消失,并起到一定的正则化作用,有时甚至可以替代Dropout。
BN可以应用于全连接层和卷积层,在非线性映射(激活函数)之前对数据进行规范化,使得结果的输出信号的各个维度均值为0,方差为1。这有助于网络的训练,特别是在梯度消失或爆炸的情况下
二、原理
BN的核心思想是让每一层的输入保持一个稳定的分布,这样模型在训练时可以减少对输入分布变化的依赖,从而加速收敛并提升稳定性。具体来说,BN包含以下几个步骤:
1、计算小批量数据的均值和方差
在每一层的输入特征图上,BN会在当前batch的数据上计算其均值和方差。
2、数据归一化
BN对每一个样本的输出进行归一化处理,通过减去均值后再除以标准差,使得归一化后的输出数据具有零均值和单位方差的标准正态分布。
3、缩放和平移
直接归一化会限制模型的学习能力,因为归一化后的输出被严格限制在均值为0和方差为1的分布中。为了恢复模型的表达能力,BN引入了两个可学习的参数:缩放参数γ和偏移参数β,将归一化后的数据进行线性变换:
其中,是均值;
是方差;
是一个极小值,用于防止分母为0;缩放参数γ和偏移参数β是可训练参数,参与整个网络的反向传播。
4、示例
这里我们简单调用torch中的nn.BatchNorm1d来实现Batch Normalization。在torch中,训练模型时缩放参数γ和偏移参数β是自动更新的,不需要我们额外操作。
import torch
import torch.nn as nn# 假设我们有一个输入张量x和一个batch_size
x = torch.randn(6, 10) # 例如,10维的特征,6是批次大小
print(x)# 实现Batch Normalization
batch_norm = nn.BatchNorm1d(10) # 10是特征的维度
x_bn = batch_norm(x)
print(x_bn)
三、python应用
这里,我们简单创建一个MLP,并对比BN前后的数据变化。
import torch
import torch.nn as nn
import matplotlib.pyplot as plt# 设置随机种子以确保结果可复现
torch.manual_seed(0)# 创建一个简单的模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(100, 50) # 一个线性层self.bn = nn.BatchNorm1d(50) # Batch Normalization层def forward(self, x):x = self.linear(x)x = self.bn(x)return x# 创建模型实例
model = SimpleModel()# 生成模拟数据:100个样本,每个样本100个特征
x = torch.randn(100, 100, requires_grad=True)# 前向传播,计算BN前的数据
x_linear = model.linear(x)
x_linear = x_linear.detach()# 计算BN前的数据均值和方差
mean_before = x_linear.mean(dim=0)
var_before = x_linear.var(dim=0)# 应用BN
x_bn = model(x)
x_bn = x_bn.detach()# 计算BN后的数据均值和方差
mean_after = x_bn.mean(dim=0)
var_after = x_bn.var(dim=0)# 绘制BN前后数据的分布
fig, ax = plt.subplots(2, 2, figsize=(12, 8))# 绘制BN前的数据分布
ax[0, 0].hist(x_linear.detach().numpy().flatten(), bins=30, color='blue', alpha=0.7)
ax[0, 0].set_title('Before BN: Data Distribution')# 绘制BN后的数据分布
ax[0, 1].hist(x_bn.detach().numpy().flatten(), bins=30, color='green', alpha=0.7)
ax[0, 1].set_title('After BN: Data Distribution')# 绘制BN前的数据均值和方差
ax[1, 0].bar(range(50), var_before, color='blue', alpha=0.7)
ax[1, 0].set_title('Before BN: Variance per Feature')
ax[1, 0].set_xticks(range(0, 50, 5))# 绘制BN后的数据均值和方差
ax[1, 1].bar(range(50), var_after, color='green', alpha=0.7)
ax[1, 1].set_title('After BN: Variance per Feature')
ax[1, 1].set_xticks(range(0, 50, 5))plt.tight_layout()
plt.show()# 打印BN前后的数据均值和方差
print(f"Mean before BN: {mean_before}")
print(f"Mean after BN: {mean_after}")
print(f"Variance before BN: {var_before}")
print(f"Variance after BN: {var_after}")
四、总结
BN在模型架构搭建的过程中很常用,但也并不是必要的,例如我们在数据预处理的过程中就对数据进行了归一化的话,BN就显得不那么重要了。当然,加上BN在某些场景中也能够使得模型适应不同批次数据的分布变化,且一定程度可以减少内部协变量偏移。具体是否增加BN可以看加入之后是否提升了模型性能。
相关文章:

什么是Batch Normalization?
一、概念 Batch Normalization是在2015年提出的数据归一化方法,主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度,使模型训练过程更加稳定,避免梯度爆炸或消失,并起到一定的正则化作用,有时…...

十四(AJAX)、AJAX、axios、常用请求方法(GET POST...)、HTTP协议、接口文档、form-serialize
1. AJAX介绍及axios基本使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&q…...

vue2怎么写computed属性
在Vue 2中,computed属性是基于它们的响应式依赖进行缓存的计算属性。只有当计算属性依赖的响应式数据发生变化时,计算属性才会重新计算。以下是如何在Vue 2中定义computed属性的步骤: 定义响应式数据:首先,你需要在组件…...

【从零开始的LeetCode-算法】35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入: …...

vscode + conda + qt联合开发
安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境,激活这个环境,然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…...

技术总结(四十三)
1 索引介绍 1.1 什么时MySQL的索引 MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。 MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通…...

mac终端自定义命令打开vscode
1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh,那么配置文件是.zshrc(打开zsh配置,这里举🌰使用zsh) sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本(这里的code就是快捷命令可以进…...

代码设计:设计模式:应对变化
文章目录 概述1.拆分代码2.解耦3.扩展总结概述 代码的设计模式主要为了应对变化 三种代码设计中应对变化的方式 1.拆分代码 2.解耦 3.扩展 1.拆分代码 减小变化对代码的影响 需要拆分代码的几种情况 1.类或方法的代码量巨大,导致代码可读性降低 2.存在复杂的代码,如…...

Proteus中添加新元件库
手上村:本来打算在Proteus中设计充电电路,发现软件自带的元器件库中没有我想要充电芯片。因此,看了其他大神的导入新的元器件步骤,建立自己的元器件库!自己也来记录一波!话不多说,赶紧上菜&…...
Hive学习基本概念
基本概念 hive是什么? Facebook 开源,用于解决海量结构化日志的数据统计。 基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能 本质是将HQL转化为MapReduce程序。 Hive处理的数据存储在H…...

运维工程师.云计算工程师面试题.考试题
《(全国)运维自动化阶段第1套卷》 卷面总分 题号 单选题 90 题分 得分 一、单选题(每题2分,共计70分;得分____) 1. 下面哪个选项可以做变量名称?( ) A、if B、123abc C、for D、User_Name 2. 哪种数据类型可以做增,删,改相关操作?( ) A、字符串 B、列表 C、元…...

四、初识C语言(4)
一、作业:static修饰局部变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> //作业:static修饰局部变量 int sum (int a) {int c 0;static int b 3;c 1;b 2;return (abc); } int main() {int i 0;int a …...

解决爬虫ConnectionResetError出现的问题
提问 使用python进行网络爬虫出现ConnectionResetError如何解决? 解答 遇到ConnectionResetError错误时,通常是因为远程服务器端主动重置了连接。常见原因包括请求频率过高、网络问题或触发了防爬虫机制。为解决该问题,可以采取以下方法&a…...

Qt桌面应用开发 第十天(综合项目二 翻金币)
目录 1.主场景搭建 1.1重载绘制事件,绘制背景图和标题图片 1.2设置窗口标题,大小,图片 1.3退出按钮对应关闭窗口,连接信号 2.开始按钮创建 2.1封装MyPushButton类 2.2加载按钮上的图片 3.开始按钮跳跃效果 3.1按钮向上跳…...

vue跳转以及传参
1.跳转页面的三种方法 <template><button click"twopage">跳转</button> </template><script setup> import { useRouter } from "vue-router"; const router useRouter(); // 获取 router 实例const twopage () > {r…...

Meta Reality Labs的VR/AR投资战略转向:内部视角与市场影响
最近,关于Meta(原Facebook)计划减少其在消费者虚拟现实(VR)领域的投资而增加对增强现实(AR)眼镜的投资的消息引起了广泛讨论。这一战略调整不仅反映了Meta对未来技术趋势的看法,也揭示了公司在面对激烈的市场竞争时所采取的新方向。本文将从不同角度探讨此次战略转向的…...

animate.css和wow.js结合使用实现动画效果
前景 手机站网页实现动画效果,animate.css是一个轻量级的css动画库,提供预定义的动画效果,使用方法参考 Animate.css | A cross-browser library of CSS animations. 问题: 添加好动画后,发现动画会在页面加载后一…...

【大模型】ChatGPT 提示词优化进阶操作实战详解
目录 一、前言 二、ChatGPT 提示词几个基本的优化原则 2.1 明确的提示词 2.1.1 提示词具体而清晰 2.1.1.1操作案例演示 2.2 确定焦点 2.2.1 操作案例演示 2.3 保持提示词的相关性 2.3.1 什么是相关性 2.3.2 提示词相关性操作案例一 2.3.2 提示词相关性操作案例二 三…...

网络安全:攻击和防御练习(全战课), DDos压力测试
XSS 跨站脚本攻击: Cross-site scripting(简称xss)跨站脚本。 一种网站的安全漏洞的攻击,代码注入攻击的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使…...

【落羽的落羽 C语言篇】指针·之其五
文章目录 一、冒泡排序二、qsort排序1. qsort使用指南2.回调函数3. qsort函数的模拟实现 一、冒泡排序 冒泡排序的核心思想就是:两两相邻的元素进行比较和交换。 现在,我们想编写一个函数,使它能够运用冒泡排序的原理,由小到大排…...

go的web框架介绍
Go 语言有许多优秀的 Web 框架,适用于不同类型的 Web 应用开发,涵盖从简单的 API 开发到复杂的微服务架构。以下是一些常见的 Go Web 框架: 1. Gin 简介:Gin 是一个高性能的 Go Web 框架,设计目标是让开发者能够以极…...

基于群晖搭建个人图书架-TaleBook based on Docker
前言 在群晖Container Manager中部署失败,转通过ssh部署。 一、准备工作 名称备注群晖SSH“终端机和SNMP”中启用SSH软件secureCRT等docker-compose.ymlGithub下载并修改 二、过程 2.1 创建本地文件夹 本地路径为: /docker/Calibre/data 2.2 下载d…...

redis哨兵安装部署
1、下载redis安装包,上传到3台服务器上 redis.tar.gz 解压处理 2、分别编译安装 cd redis/src make make install 3、配置哨兵模式 修改redis.conf文件内容 主节点 和 从节点都需要修改 bind 0.0.0.0 -::1 或者真实的ip地址 protected-mode no port 637…...

JVS低代码里表单与表格不同数据关联场景的实现方法
在业务处理与数据管理中,表单与表格模型的数据关联及同步保存是一个常见的需求。特别是在涉及多个数据模型且字段存在关联或差异时,合理设计表单与表格之间的数据交互逻辑特别重要。接下来小编以JVS低代码系统为例,详细介绍两种不同场景下&am…...

NaviveUI框架的使用 ——安装与引入(图标安装与引入)
文章目录 概述安装直接引入引入图标样式库 概述 🍉Naive UI 是一个轻量、现代化且易于使用的 Vue 3 UI 组件库,它提供了一组简洁、易用且功能强大的组件,旨在为开发者提供更高效的开发体验,特别是对于构建现代化的 web 应用程序。…...

Cannot resolve symbol ‘ActivityThread‘ | Android 语法
背景 ActivityThread 是 Android 系统内部使用的一个类,它位于 android.app 包中,但在 Android SDK 的公共 API 中并没有公开。 由于 ActivityThread 是隐藏的内部类,因此在编写单元测试或功能开发时,无法直接引用它。可以使用反射来访问内部 API,或者使用依赖注入的方式…...

OpenSSH-9.9p1 OpenSSL-3.4.0 升级步骤详细
前言 收到漏洞扫描通知 OpenSSH 安全漏洞(CVE-2023-38408) OpenSSH 安全漏洞(CVE-2023-51385) OpenSSH 安全漏洞(CVE-2023-51384) OpenSSH 安全漏洞(CVE-2023-51767) OpenSSH 安全漏洞(CVE-2023-48795) OpenSSH(OpenBSD SecureShell)是加拿大OpenBSD计划…...

python 练习题
目录 1,输入三个整数,按升序输出 2,输入年份及1-12月份,判断月份属于大月,小月,闰月,平月,并输出本月天数 3,输入一个整数,显示其所有是素数因子 4&#…...

数学建模——Topsis法
数模评价类(2)——Topsis法 概述 Topsis:Technique for Order Preference by Similarity to Ideal Solution 也称优劣解距离法,该方法的基本思想是,通过计算每个备选方案与理想解和负理想解之间的距离,从而评估每个…...

Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录
前言 我这边一直用的electron-vue框架是基于electron 21版本的,electron 29版本追加了很多新功能,但是这些新功能对开发者不友好,对electron构建出来的软件,使用者更安全,所以,我暂时不想研究electron 29版…...