nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示

这篇具有很好参考价值的文章主要介绍了nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 nn.BatchNorm

        BatchNorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,是深度网络训练必不可少的一部分,几乎成为标配;

        BatchNorm 即批规范化,是为了将每个batch的数据规范化为统一的分布,帮助网络训练, 对输入数据做规范化,称为Covariate shift;

        数据经过一层层网络计算后,数据的分布也在发生着变化,因为每一次参数迭代更新后,上一层网络输出数据,经过这一层网络参数的计算,数据的分布会发生变化,这就为下一层网络的学习带来困难 -- 也就是在每一层都进行批规范化(Internal Covariate shift),方便网络训练,因为神经网络本身就是要学习数据的分布;

        下面通过代码掩饰BatchNorm的作用;

        首先要清楚,BatchNorm后是不改变输入的shape的

        nn.BatchNorm1d: N * d --> N * d

        nn.BatchNorm2d: N * C * H * W  -- > N * C * H * W

        nn.BatchNorm3d: N * C * d * H * W --> N * C * d * H * W

下面讲解nn.BatchNorm1d,和nn.BatchNorm2d的情况

1.1 nn.BatchNorm1d

        首先看其参数:

CLASStorch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, 
track_running_stats=True, device=None, dtype=None)

        主要参数介绍:

                num_features: 输入维度,也就是数据的特征维度;

                eps: 是在分母上加的一个值,是为了防止分母为0的情况,让其能正常计算;

                affine: 是仿射变化,将nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示,分别初始化为1和0;

        使用方法介绍:

        主要作用在特征上,比如输入维度为N*d, N代表batchsize大小,d代表num_features;

        而nn.BatchNorm1d是对num_features做归一化处理,也就是对批次内的特征进行归一化;

如输入 N = 5(batch_size = 5), d = 3(数据特征维度为3);

nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示

         上图中的r, b是可学习的参数,文档中成为放射变换,文档中称为nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示,  可以使用x.weight 和 x.bias获得, r初始化值为1,b初始化值为0;

        上图中方差的计算是采用的有偏估计;

        归一化处理公式:

nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示

                 E(x)表示均值, Var(x)表示方差;nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示表示为上述参数的eps,防止分母为0 的情况;

        演示代码:

>>> import torch 
>>> import torch.nn as nn
 m = nn.BatchNorm1d(3) #首先要实例化,才能使用,3 对应输入特征,也就是number_features 
>>> m.weight # 对应r ,初始化值为1
Parameter containing:
tensor([1., 1., 1.], requires_grad=True)
>>> m.bias # 对应b,初始化为0
Parameter containing:
tensor([0., 0., 0.], requires_grad=True)
>>> output.mean(dim = 0) # 归一化后,平均值都是0, e-08 实际上也就是0了
tensor([ 0.0000e+00, -1.1921e-08, -2.3842e-08], grad_fn=<MeanBackward1>)
>>> output.std(dim = 0,unbiased = False) # 标准差为1, 有偏估计,所以unbiased = False
tensor([1.0000, 1.0000, 1.0000], grad_fn=<StdBackward0>)

 采用普通方法实现BatchNorm:

>>> x
tensor([[ 0.0482, -0.1098,  0.4099],
        [ 0.9851,  2.8229, -0.7795],
        [ 0.3493, -1.0165, -0.0416],
        [ 1.5942, -1.3420,  1.0296],
        [ 0.0452, -1.0462, -1.1866]])
>>> mean = x.mean(dim = 0)
>>> mean
tensor([ 0.6044, -0.1383, -0.1136])
>>> std = torch.sqrt(1e-5 + torch.var(x,dim = 0, unbiased = False))
>>> std
tensor([0.6020, 1.5371, 0.7976])
>>> (x - mean)/std
tensor([[-0.9239,  0.0185,  0.6564],
        [ 0.6325,  1.9265, -0.8348],
        [-0.4238, -0.5713,  0.0903],
        [ 1.6442, -0.7831,  1.4333],
        [-0.9290, -0.5906, -1.3452]])
>>> m(x) # 和上述计算结果相同
tensor([[-0.9239,  0.0185,  0.6564],
        [ 0.6325,  1.9265, -0.8348],
        [-0.4238, -0.5713,  0.0903],
        [ 1.6442, -0.7831,  1.4333],
        [-0.9290, -0.5906, -1.3452]], grad_fn=<NativeBatchNormBackward0>)

1.2 nn.BatchNorm2d

首先看其参数:

CLASStorch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, 
track_running_stats=True, device=None, dtype=None)

使用方法介绍:

        主要作用在特征上,比如输入维度为B*C*H*W, B代表batchsize大小,C代表channel,H代表图片的高度维度,W代表图片的宽度维度;

        而nn.BatchNorm2d是对channel做归一化处理,也就是对批次内的特征进行归一化;

如输入B * C * H * W = (2 * 3 * 2 * 2):

nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示

         计算的均值和方差的方式实际上是把batch内对应通道的数据拉平计算;

        演示代码:

>>> y = torch.randn(2,3,2,2)
>>> y
tensor([[[[-0.3008,  0.7066],
          [ 0.5374, -0.4211]],

         [[-0.3935,  0.6193],
          [ 0.5375, -0.2747]],

         [[ 0.8895,  0.0956],
          [-0.0622,  1.7511]]],


        [[[-0.2402,  0.6884],
          [ 0.5264,  0.3918]],

         [[-0.3101, -0.6729],
          [-0.5292, -1.0383]],

         [[-0.6681, -0.3747],
          [ 0.3431,  0.3245]]]])
>>> n = nn.BatchNorm2d(3)
>>> n.weight
Parameter containing:
tensor([1., 1., 1.], requires_grad=True)
>>> n.bias
Parameter containing:
tensor([0., 0., 0.], requires_grad=True)
>>> n(y)
tensor([[[[-1.2111,  1.0613],
          [ 0.6797, -1.4823]],

         [[-0.2544,  1.6433],
          [ 1.4902, -0.0318]],

         [[ 0.8494, -0.2705],
          [-0.4931,  2.0649]]],


        [[[-1.0742,  1.0204],
          [ 0.6549,  0.3513]],

         [[-0.0981, -0.7779],
          [-0.5086, -1.4626]],

         [[-1.3479, -0.9340],
          [ 0.0786,  0.0524]]]], grad_fn=<NativeBatchNormBackward0>)

        关于均值方差的计算方法演示:

>>> z = [-1.2111,  1.0613, 0.6797, -1.4823, -1.0742,  1.0204, 0.6549,  0.3513] # 每个通道拉平计算
>>> import numpy as np
>>> np.mean(z) # 10的-17次方就是0
-2.7755575615628914e-17
>>> np.std(z) # numpy默认是有偏的, torch的模式是无偏的
0.9999846111315913

参考:[pytorch 网络模型结构] 深入理解 nn.BatchNorm1d/2d 计算过程_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-417277.html

到了这里,关于nn.BatchNorm讲解,nn.BatchNorm1d, nn.BatchNorm2d代码演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一维卷积神经网络理解(torch.nn.Conv1d)

    in_channels : (int)输入数据的通道数,即对某条训练数据来说由多少组向量表示。例如对于由一维向量表示的一条数据来说,通道数为1;对于文本数据来说,一个句子是由m个单词组成,那么通道数就可以是m out_channels : (int)卷积产生的通道数,可以理解为卷积核的个数 kernel_siz

    2023年04月08日
    浏览(44)
  • BatchNorm详解

    前几天被同事问到了一个问题:当batch_size=1时,Batch Normalization还有没有意义,没有说出个所以然,才意识到自己从来不好好读过BN的论文(Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift),寻思着看看可不可以从论文中得到答案,本文就是自己学习记

    2023年04月08日
    浏览(36)
  • BatchNorm原理解析

    BatchNorm 要解决的问题 我们都知道,深度学习的话尤其是在CV中,都需要对 数据进行归一化处理 ,因为深度学习网络主要就是为了学习训练数据的分布,并在测试集中得到更好的泛化效果。但是我们 每一个 batch 输入的数据都具有不同的分布 ,显然会给网络训练带来困难。此

    2024年02月13日
    浏览(45)
  • Batchnorm 和Layernorm 区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 BatchNorm,一般用于CV任务,是把一个 batch (N张图片)中 同一通道 的特征,将其标准化。可以理解为对Batch中的所有图的每一层像素进行标准化。 LayerNorm,一般用于NLP任务中,是把batch中的 一个样本 (

    2024年02月10日
    浏览(41)
  • D. 1D Eraser

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a strip of paper s that is n cells long. Each cell is either black or white. In an operation you can take any k consecutive cells and make them all white. Find the minimum number of operations needed to remove all black cells. Inpu

    2024年02月08日
    浏览(44)
  • 深度学习:BatchNorm、LayerNorm、InstanceNorm、GroupNorm和SwitchableNorm的理解

    在深度学习中会经常遇到BatchNorm、LayerNorm、InstanceNorm和GroupNorm,四者区别如下: 除此之外还有SwitchableNorm的方法,下面会逐一进行介绍。 BatchNorm 的处理对象是对 一批样本 的 同一个通道 特征,BatchNorm 是对这批样本的同一维度特征计算均值和方差做归一化,BatchNorm在CV领域应

    2024年02月15日
    浏览(47)
  • PyTorch-实现对表格类型数据的一维卷积(CNN1D)

    看到大家都私信要代码,太多了发不过来,我把代码放到github上了: github链接: https://github.com/JiaBinBin233/CNN1D 我的数据集是一个二分类的数据集,是一个12维的数据(第一列为标签列,其他的11列是属性列) 首先看一下没有经过处理过的数据 输出结果如下 原始数据是一个128行

    2024年02月11日
    浏览(43)
  • CNN(一维卷积Conv1D)实现时间序列预测(PyTorch版)

    💥项目专栏:【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)

    2024年02月01日
    浏览(43)
  • 分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测

    分类效果 基本介绍 结合1D时序-2D图像多模态融合的CNN-GRU故障识别算法,基于一维时序信号和二维图像多元信息融合的卷积神经网络结门控循环单元网络的数据分类预测/故障识别算法。要求2020版以上。 采用双支路输入,一路为图像输入经CNN提取特征,一路为特征序列输入经

    2024年02月12日
    浏览(42)
  • 基于FPGA的一维卷积神经网络算法实现(1D-CNN、BNN的FPGA加速实现)

    本文介绍一种基于FPGA的1维卷积神经网络算法加速实现的方案,其中为了进一步提升运算速度,除了第一层卷积采用的是普通卷积运算(CONV),其余卷积层和池化层采用的是二值化运算,即二值化的卷积与池化。 运算过程包含了卷积层、池化层、批标准化层、全局池化、二值

    2024年02月16日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包