Normalization 归一化方法 BN LN IN GN

1.分类

  1. BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;
  2. LN在通道方向上,对C、H、W归一化,主要对RNN效果明显;
  3. IN在图像像素上,对H、W做归一化,用在风格化迁移;
  4. GN将channel分组,然后再做归一化。

在这里插入图片描述

2.BN

为什么要进行BN呢?
1)在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。
(2)Internal Covariate Shift (ICS) 问题:在训练的过程中,激活函数会改变各层数据的分布,随着网络的加深,这种改变(差异)会越来越大,使模型训练起来特别困难,收敛速度很慢,会出现梯度消失的问题。
BN的主要思想:针对每个神经元,使数据在进入激活函数之前,沿着通道计算每个batch的均值、方差,‘强迫’数据保持均值为0,方差为1的正态分布,避免发生梯度消失。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。求通道 1 的方差也是同理。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。
BN的使用位置:全连接层或卷积操作之后,激活函数之前。

BN算法过程:
沿着通道计算每个batch的均值μ
沿着通道计算每个batch的方差σ²
做归一化
加入缩放和平移变量 γ 和 β

其中 ε 是一个很小的正值1e-8,比如 。加入缩放和平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。
BN的作用:
(1)允许较大的学习率;

(2)减弱对初始化的强依赖性

(3)保持隐藏层中数值的均值、方差不变,让数值更稳定,为后面网络提供坚实的基础;

(4)有轻微的正则化作用(相当于给隐藏层加入噪声,类似Dropout)

BN存在的问题:
(1)每次是在一个batch上计算均值、方差,如果batch size太小,则计算的均值、方差不足以代表整个数据分布。

(2)batch size太大:会超过内存容量;需要跑更多的epoch,导致总训练时间变长;会直接固定梯度下降的方向,导致很难更新。

3.LN

针对BN不适用于深度不固定的网络(sequence长度不一致,如RNN),LN对深度网络的某一层的所有神经元的输入按以下公式进行normalization操作。
在这里插入图片描述

LN中同层神经元的输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差。
对于特征图在这里插入图片描述 ,LN 对每个样本的 C、H、W 维度上的数据求均值和标准差,保留 N 维度。其均值和标准差公式为:
在这里插入图片描述

Layer Normalization (LN) 的一个优势是不需要批训练,在单条数据内部就能归一化。LN不依赖于batch size和输入sequence的长度,因此可以用于batch size为1和RNN中。LN用于RNN效果比较明显,但是在CNN上,效果不如BN。

4.Instance Normalization, IN

IN针对图像像素做normalization,最初用于图像的风格化迁移。在图像风格化中,生成结果主要依赖于某个图像实例,feature map 的各个 channel 的均值和方差会影响到最终生成图像的风格。所以对整个batch归一化不适合图像风格化中,因而对H、W做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。

对于,IN 对每个样本的 H、W 维度的数据求均值和标准差,保留 N 、C 维度,也就是说,它只在 channel 内部求均值和标准差,其公式如下:
在这里插入图片描述

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

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

相关文章

Linux 服务器拷贝远程文件 SCP

1.复制文件 (1)将本地文件拷贝到远程 (有时候权限不允许) scp 文件名 用户名计算机IP或者计算机名称:远程路径 scp /root/install.* root192.168.1.12:/usr/local/src(2)从远程将文件拷回本地 scp 用户名…

Pytorch: model.eval(), model.train() 讲解

文章目录1. model.eval()2. model.train()两者只在一定的情况下有区别:训练的模型中含有dropout 和 batch normalization 1. model.eval() 在模型测试阶段使用 pytorch会自动把BN和DropOut固定住,不会取每个batchsize的平均,而是用训练好的…

Job for smbd.service failed because the control process exited with error code. See “systemctl statu

错误 $ sudo service smbd restartJob for smbd.service failed because the control process exited with error code. See "systemctl status smbd.service" and "journalctl -xe" for details.$ systemctl status smbd.servicesmbd.service - Samba SM…

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace o

问题 RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [4]] is at version 1; expected version 0 instead 分析 nn.relu(True) # 这个引起的问题原来的变量被替换掉了&#xff…

batchsize大小对训练速度的影响

1.batchsize越大 是不是训练越快? GPU :一块2080Ti 平台:pytorch cuda 图片数量:2700 batchsize一个图片处理时间GPU内存占用GPU算力使用一个epoch 所用时间10.117s2.5G20%2700 * 0.0117 318s50.516s8G90%2700 * 0.516/5 279s batchsize大…

os.environ[‘CUDA_VISIBLE_DEVICES‘]= ‘0‘设置环境变量

os.environ[‘环境变量名称’]‘环境变量值’ #其中key和value均为string类型 import os os.environ["CUDA_VISIBLE_DEVICES"]‘6‘’,‘7’这个语句的作用是程序可见的显卡ID。 注意 如果"CUDA_VISIBLE_DEVICES" 书写错误,也不报…

nn.ReLU() 和 nn.ReLU(inplace=True)中inplace的作用

inplace 作用: 1.用relu后的变量进行替换,直接把原来的变量覆盖掉 2.节省了内存 缺点: 有时候出现梯度回传失败的问题,因为之前的变量被替换了,找不到之前的变量了 参考这篇文章

pytorch:加载预训练模型(多卡加载单卡预训练模型,多GPU,单GPU)

在pytorch加载预训练模型时,可能遇到以下几种情况。 分为以下几种在pytorch加载预训练模型时,可能遇到以下几种情况。1.多卡训练模型加载单卡预训练模型2. 多卡训练模型加载多卡预训练模型3. 单卡训练模型加载单卡预训练模型4. 单卡训练模型加载多卡预训…

python中 numpy转list list 转numpy

list to numpy import numpy as np a [1,2] b np.array(a)numpy to list a np.zero(1,1) a.tolist()

知识蒸馏 knowledge distill 相关论文理解

Knowledge Distil 相关文章1.FitNets : Hints For Thin Deep Nets (ICLR2015)2.A Gift from Knowledge Distillation:Fast Optimization, Network Minimization and Transfer Learning (CVPR 2017)3.Matching Guided Distillation&#xff08…

模型压缩 相关文章解读

模型压缩相关文章Learning both Weights and Connections for Efficient Neural Networks (NIPS2015)Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding(ICLR2016)Learning both Weights and …

Linux 杀死进程

kill -9 进程名 杀死进程

计算图片相似度的方法

文章目录1.余弦相似度计算2.哈希算法计算图片的相似度3.直方图计算图片的相似度4.SSIM(结构相似度度量)计算图片的相似度5.基于互信息(Mutual Information)计算图片的相似度1.余弦相似度计算 把图片表示成一个向量,通…

.size .shape .size() type的运用

.size ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值 a np.array([2,2]) print(a.size)2.shap ndarray.shape 数组的维度,对于矩阵,n 行 m 列 a np.array([2,2]) print(a.shape) (1,2)torch.tensor 数组的维度 x torch.r…

矩阵相加

tensor 类型 a torch.randn(1,3,3) b torch.randn(1,3,3) c a b numpy.array 类型 a np.array([2,2]) b np.array([2,2]) print(type(a)) print(ab)[4,4]

Latex 生成的PDF增加行号 左右两边

增加行号 \usepackage[switch]{lineno}\linenumbers \begin{document} \end{document}

pytorh .to(device) 和.cuda()的区别

原理 .to(device) 可以指定CPU 或者GPU device torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 单GPU或者CPU model.to(device) #如果是多GPU if torch.cuda.device_count() > 1:model nn.DataParallel(model,devic…

Linux 修改用户名的主目录 家目录

首先root 登陆 sudo -i 输入密码然后 vim /etc/passwd 找到用户名 然后修改后面的路径即可

ubunt16.04 安装3090显卡驱动 cuda cudnn pytorch

安装驱动 需要的安装包 30系列显卡是新一代架构,新驱动不支持cuda9以及cuda10,所以必须安装cuda11、而pytorch现在稳定版为1.6,最高仅支持到cud10.2。所以唯一的办法就是使用上处于beta测试的1.7或1.8。这也是为啥一开始就强调本文的写作时…

3090显卡 torch.cuda.is_available()返回false的解决办法

问题 1.执行Nvidia-smi 命令没有报错,能够显示驱动信息; 2.执行 torch.backends.cudnn.enabled is TRUE 3.torch.cuda.is_available()一直返回False 解决 把torch,torchvision等相关安装包全部删除,安装适合版本的torch。 30系…