Batch Normalization

news2025/1/13 17:27:31

1、原理

在图像预处理过程中会对图像进行标准化处理,这样能够加速网络的收敛速度。
如下图所示,对于Conv1来说输入的是满足某一分布的特征矩阵,但对于Conv2来说输入的feature map就不一定满足某一分布规律。 Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。

注意:这里所说满足某一分布规律并不是指某一个feature map的数据要满足分布规律,理论上是指整个训练样本集所对应feature map的数据要满足分布规律,即要计算出整个训练集的feature map然后再进行标准化处理。
对于一个大型的数据集来说,这明显是不可能计算的,所以论文中说的是Batch Normalization,也就是我们计算一个Batch的feature map然后再进行标准化(Batch越大越接近整个数据集的分布,效果越好)。

在这里插入图片描述
原论文中说“对于一个拥有d维的输入x,我们将对它的每一个维度进行标准化处理。” 假设输入的x是RGB三通道的彩色图像,那么d就是输入图像的channels,即d=3。x=(x1, x2, x3),其中x1, x2, x3分别代表R、G、B通道所对应的特征矩阵。所以标准化就是:分别对我们的R通道,G通道,B通道进行处理。公式如下所示:

在这里插入图片描述
在这里插入图片描述

2、计算过程

在这里插入图片描述

上图展示了一个batch size=2(两张图片)的Batch Normalization的计算过程:假设feature1、feature2分别是由image1、image2经过一系列卷积池化后得到的特征矩阵,它们的channel都为2,x(1)代表这个batch里所有feature的channel1的数据,x(2)代表这个batch里所有feature的channel2的数据,根据公式分别计算每个channel的标准化值。

3、计算细节

在训练网络的过程中,我们通过一个batch一个batch的数据进行训练,但是在预测过程中,通常都是输入一张图片进行预测,此时batch size=1,如果在通过上述方法计算均值和方差就没有意义了。所以在训练过程中要不断的计算每个batch的均值和方差,并使用移动平均(moving average)的方法来记录统计的均值和方差,在训练完后可以近似认为所统计的均值和方差等于整个训练集的均值和方差。然后在验证以及预测过程中,就使用统计得到的均值和方差进行标准化处理。

在这里插入图片描述

4、Pytorch实验

bn_process函数是自定义的BN处理方法,用来验证与使用官方的BN处理方法得到结果是否一致:

  1. 在bn_process中计算batch里所有feature的每个维度(这里的维度是channel维度)的均值和标准差(标准差等于方差开平方);
  2. 然后使用均值和总体标准差对feature的每个维度进行标准化处理;
  3. 最后使用均值和样本标准差对均值和标准差进行更新统计。
    在这里插入图片描述
import numpy as np
import torch.nn as nn
import torch
 
 
def bn_process(feature, mean, var):
    feature_shape = feature.shape
    for i in range(feature_shape[1]):
        # [batch, channel, height, width]
        feature_t = feature[:, i, :, :]
        mean_t = feature_t.mean()
        # 总体标准差
        std_t1 = feature_t.std()
        # 样本标准差
        std_t2 = feature_t.std(ddof=1)
 
        # bn process
        # 这里记得加上eps和pytorch保持一致
        feature[:, i, :, :] = (feature[:, i, :, :] - mean_t) / np.sqrt(std_t1 ** 2 + 1e-5)
        # update calculating mean and var
        mean[i] = mean[i] * 0.9 + mean_t * 0.1
        var[i] = var[i] * 0.9 + (std_t2 ** 2) * 0.1
    print(feature)
 
 
# 随机生成一个batch为2,channel为2,height=width=2的特征向量
# [batch, channel, height, width]
feature1 = torch.randn(2, 2, 2, 2)
# 初始化统计均值和方差
calculate_mean = [0.0, 0.0]
calculate_var = [1.0, 1.0]
# print(feature1.numpy())
 
# 注意要使用copy()深拷贝
bn_process(feature1.numpy().copy(), calculate_mean, calculate_var)
 
bn = nn.BatchNorm2d(2, eps=1e-5)
output = bn(feature1)
print(output)

打印自定义bn_process函数得到的输出以及使用官方的BN处理方法得到输出,明显结果是一样的(只是精度不同)。
在这里插入图片描述

5、使用BN时的注意事项

  1. 训练时要将traning参数设置为True,在验证时将trainning参数设置为False。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。
  2. batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。(设置的大小具体还是要看电脑配置)
  3. 建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,因为没有用,即使使用了偏置bias求出的结果也是一样的。

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

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

相关文章

大坝安全在线监控系统包含哪些内容?怎样提升水库大坝信息化管理水平?

平升电子大坝安全在线监控系统根据SL551-2012《土石坝安全监测技术规范》的整编要求,设置了变形监测、渗流监测、环境量监测。大坝安全在线监控系统可及时了解大坝的工作性态和水库可能存在的事故隐患,为大坝安全管理与水库运行调度提供了准确、及时的现…

Elasticsearch集群搭建

前言在如今的开发过程中,单节点的Elasticsearch肯定是支撑不了大数据量的,而且还存在单节点故障的问题,所以Elasticsearch也提供了集群功能,像其他中间件也基本都会考虑到这个问题准备信息首先, 由于我机器有限&#x…

如何在虚拟机上安装Linx系统

前言作为Java开发的我们,可能有时候想自己玩玩linux服务器,但是如果买阿里云或者腾讯云的服务器又很贵,这时候我们就可以在自己电脑上安装虚拟机了,这也是本篇文章出现的原因,下面我就安装centOS7为例子来进行介绍首先…

openEuler资源利用率提升之道 05:虚机混部介绍与功耗管理技术

随着云计算市场规模的快速增长,各云厂商基础设施投入也不断增加,但行业普遍存在资源利用率低的问题,在上述背景下,提升资源利用率已经成为了一个重要的技术课题。将业务区分优先级混合部署(下文简称混部)是典型有效的资源利用率提…

【C语言】使用C语言实现静态、动态的通讯录(简单易懂)

我们在学习结构体之后,就可以尝试去实现通讯录的制作,如果您这边对于结构体还没有太多的认识的话,请先访问这一篇文章,会有利于接下来的学习。【自定义类型】带你走进结构体、枚举、联合_小王学代码的博客-CSDN博客 目录 一、通讯录 二、静…

JVM-【面试题】-对象内存分配

一、对象内存分配流程图如果能在栈分布就直接在栈创建如果是大对象就直接在old区创建如果不大于TLAB则在TLAB创建,否则在Eden区创建如果Eden区空间不足就会发生Minor GC进行回收,回收的空间放不下或年龄达到上限就直接放到Old区,之后S0区的存…

Vue3.0 性能提升主要是通过哪几方面体现的?

一、编译阶段 回顾Vue2,每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher,从而使关联的组件重新渲染 试想一下&…

34420A万用表

18320918653 34420A Agilent 34420A 七位半台式数字万用表|安捷伦纳伏表34420A|微欧表|安捷伦34420A 品牌: Agilent(安捷伦) 1.3nV rms噪声/8n Vp-p 100pV,100nΩ灵敏度 两通道可编程电压输入:差分和比值功能 71/2位分辨率 1mV到100V量程…

如何通过指令控制将一副扑克牌变成一种简单的计算机

题目 题目就是文章的标题 已知 牌数:每套扑克牌有54张,其中去掉大小王,剩下52张,这52张中又有4种花色黑桃,红桃,梅花,方片每种花色都有13张(1,2,3,4,5,6,7,8,9,10,J,Q,K&#xff…

【Ubuntu】在VMWare虚拟机中安装Ubuntu【教程】

文章目录【Ubuntu】在VMWare虚拟机中安装Ubuntu教程一、安装VMWare二、下载Ubuntu的iso文件三、安装UbuntuReference【Ubuntu】在VMWare虚拟机中安装Ubuntu教程 一、安装VMWare 具体的安装方法,可以参考这一篇博客,这里就不详细介绍了 二、下载Ubuntu…

centos禁止root登录

ssh登录linux服务器的时候,经常会有提示 There were * failed login attempts since the last successful login. 说明有大量的非法登录尝试 检查服务器是否被恶意登录 # Ubuntu # 1. 查看近期成功的密码登录: grep "password" /var/log/au…

如何搭建邮箱服务器?mail系统架设的两种方法

邮件mail通信是常用的办公场景,对于技术和网管等人员,往往需要搭建自己的邮箱服务器。那么,如何架设邮箱系统呢?通常有两种方案,一种是在在本地主机部署,另一种是在云端如云服务器上部署应用。根据主机IP情…

以交互方式导入图像、音频和视频

以交互方式将数据导入到 MATLAB 工作区。 查看文件的内容 指定变量 生成可重用的 MATLAB 代码 注意:​有关导入文本文件的信息,可以参考使用导入工具读取文本文件数据。有关导入电子表格的信息,可以参考使用导入工具读取电子表格数据。 查…

【Redis数据对象与结构】string与其底层结构

【Redis数据对象与结构】string与其底层结构 【Redis数据对象与结构】系列的主线如下,本文主要讲解string数据对象及其底层结构在redis中的实现。 redis中基本的数据对象有字符串类型(String)、列表类型(List)、字典类型(Hash)、集合类型(Set)、有序列表类型(Sorte…

自定义类型之枚举与联合

文章目录前言一、枚举1.枚举的定义2.枚举的几种情况3.枚举类型的大小4.枚举的优点二、联合(共用体)1.联合类型的定义2.联合的特点3.联合的大小计算总结前言 自定义类型很多人可能只知道结构体,因为结构体相对来说确实用的比较多,而…

爬虫攻守道 - 2023最新 - 正则表达式勇猛精进 - 爬取某天气网站历史数据

前言 在 正则表达式 - 匹配开头、结尾、中间 - 某天气网站网页源代码分析 这篇文章里,我们介绍了如何用正则表达式匹配包含特定样式的Table标签,也就是同时匹配开头、结尾、以及中间。 当你能真正理解这个写法,就会觉得不过是柳暗花明罢了。…

如何把拍摄视频中多余的人或物去除?

大家应该都有这样一个烦恼吧?就是拍摄的一段视频中有多余的人物出现,想要把里面的人物去除掉,或者是自己拍摄的一段视频,视频里出现了多余的人物,但是又不能重启拍摄的情况下,想要把视频中的人物去除掉应该…

Spring Security笔记

创建个项目 引入Spring Web和Spring Security 即可 写个Controller接收请求 转发重定向都可以 static下定义两个页面 login.html页面 用来登录 main.html如果可以跳到这里,说明登录成功 启动运行程序 我们访问登录接口 或者是访问静态资源都会重定向到这个页面 这个页面说…

并发编程(多线程)

一、进程与线程 多进程编程已经能够解决并发编程的问题了(已经可以利用cpu多核资源了).但是仍然存在这缺陷. 就是,进程太重了(消耗资源多,速度慢),线程应运而生被称为"轻量级编程",解决并发编程的各种问题的同时,让IO速度大大提升. 线程"轻"主要"轻…

SOFAEnclave:蚂蚁金服新一代可信编程环境,让机密计算为金融业务保驾护航102年

引言 互联网金融本质上是对大量敏感数据的处理以及由此沉淀的关键业务智能。近年来涌现出来的新业态更是将数据处理的范畴从单方数据扩展到了涉及合作方的多方数据。 另一方面,从 GDPR 到 HIPAA,数据隐私监管保护的范围愈加扩大,力度日益增…