什么是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函数的模拟实现 一、冒泡排序 冒泡排序的核心思想就是:两两相邻的元素进行比较和交换。 现在,我们想编写一个函数,使它能够运用冒泡排序的原理,由小到大排…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

