python神经网络Batch Normalization底层原理详解

 更新时间:2022年05月07日 15:55:06   作者:Bubbliiiing  
这篇文章主要为大家介绍了python神经网络Batch Normalization底层原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是Batch Normalization

Batch Normalization是神经网络中常用的层,解决了很多深度学习中遇到的问题,我们一起来学习一哈。

Batch Normalization是由google提出的一种训练优化方法。参考论文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift。

Batch Normalization的名称为批标准化,它的功能是使得输入的X数据符合同一分布,从而使得训练更加简单、快速。

一般来讲,Batch Normalization会放在卷积层后面,即卷积 + 标准化 + 激活函数。

其计算过程可以简单归纳为以下3点:

1、求数据均值。

2、求数据方差。

3、数据进行标准化。

Batch Normalization的计算公式

Batch Normalization的计算公式主要看如下这幅图:

这个公式一定要静下心来看,整个公式可以分为四行:

1、对输入进来的数据X进行均值求取。

2、利用输入进来的数据X减去第一步得到的均值,然后求平方和,获得输入X的方差。

3、利用输入X、第一步获得的均值和第二步获得的方差对数据进行归一化,即利用X减去均值,然后除上方差开根号。方差开根号前需要添加上一个极小值。

4、引入γ和β变量,对输入进来的数据进行缩放和平移。利用γ和β两个参数,让我们的网络可以学习恢复出原始网络所要学习的特征分布。

前三步是标准化工序,最后一步是反标准化工序。

Bn层的好处

1、加速网络的收敛速度。在神经网络中,存在内部协变量偏移的现象,如果每层的数据分布不同的话,会导致非常难收敛,如果把每层的数据都在转换在均值为零,方差为1的状态下,这样每层数据的分布都是一样的,训练会比较容易收敛。

2、防止梯度爆炸和梯度消失。对于梯度消失而言,以Sigmoid函数为例,它会使得输出在[0,1]之间,实际上当x到了一定的大小,sigmoid激活函数的梯度值就变得非常小,不易训练。归一化数据的话,就能让梯度维持在比较大的值和变化率;

对于梯度爆炸而言,在方向传播的过程中,每一层的梯度都是由上一层的梯度乘以本层的数据得到。如果归一化的话,数据均值都在0附近,很显然,每一层的梯度不会产生爆炸的情况。

3、防止过拟合。在网络的训练中,Bn使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。

为什么要引入γ和β变量

Bn层在进行前三步后,会引入γ和β变量,对输入进来的数据进行缩放和平移。

γ和β变量是网络参数,是可学习的。

引入γ和β变量进行缩放平移可以使得神经网络有自适应的能力,在标准化效果好时,尽量不抵消标准化的作用,而在标准化效果不好时,尽量去抵消一部分标准化的效果,相当于让神经网络学会要不要标准化,如何折中选择。

Bn层的代码实现

Pytorch代码看起来比较简单,而且和上面的公式非常符合,可以学习一下,参考自

https://www.jb51.net/article/247197.htm

def batch_norm(is_training, x, gamma, beta, moving_mean, moving_var, eps=1e-5, momentum=0.9):
    if not is_training:
        x_hat = (x - moving_mean) / torch.sqrt(moving_var + eps)
    else:
        mean = x.mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
        var = ((x - mean) ** 2).mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
        x_hat = (x - mean) / torch.sqrt(var + eps)
        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
        moving_var = momentum * moving_var + (1.0 - momentum) * var
    Y = gamma * x_hat + beta
    return Y, moving_mean, moving_var
class BatchNorm2d(nn.Module):
    def __init__(self, num_features):
        super(BatchNorm2d, self).__init__()
        shape = (1, num_features, 1, 1)
        self.gamma = nn.Parameter(torch.ones(shape))
        self.beta = nn.Parameter(torch.zeros(shape))
        self.register_buffer('moving_mean', torch.zeros(shape))
        self.register_buffer('moving_var', torch.ones(shape))
    def forward(self, x):
        if self.moving_mean.device != x.device:
            self.moving_mean = self.moving_mean.to(x.device)
            self.moving_var = self.moving_var.to(x.device)
        y, self.moving_mean, self.moving_var = batch_norm(self.training,
            x, self.gamma, self.beta, self.moving_mean,
            self.moving_var, eps=1e-5, momentum=0.9)
        return y

以上就是python神经网络Batch Normalization底层原理详解的详细内容,更多关于Batch Normalization底层原理的资料请关注脚本之家其它相关文章!

相关文章

  • Python爬虫Scrapy框架CrawlSpider原理及使用案例

    Python爬虫Scrapy框架CrawlSpider原理及使用案例

    这篇文章主要介绍了Python爬虫Scrapy框架(CrawlSpider),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 你知道吗实现炫酷可视化只要1行python代码

    你知道吗实现炫酷可视化只要1行python代码

    这篇文章主要给大家介绍了关于利用Python进行数据可视化常见的9种方法!文中介绍的方法真的超实用!对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • python面向对象之类的继承详解

    python面向对象之类的继承详解

    这篇文章主要介绍了python面向对象之类的继承详解,通过概述定义讲解了类的继承的功能和创建方式,写出了代码实例供参考,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Python使用修饰器进行异常日志记录操作示例

    Python使用修饰器进行异常日志记录操作示例

    这篇文章主要介绍了Python使用修饰器进行异常日志记录操作,结合实例形式分析了Python基于修饰器的log日志文件操作的相关实现技巧,需要的朋友可以参考下
    2019-03-03
  • Python常见数据结构之栈与队列用法示例

    Python常见数据结构之栈与队列用法示例

    这篇文章主要介绍了Python常见数据结构之栈与队列用法,结合实例形式简单介绍了数据结构中栈与队列的概念、功能及简单使用技巧,需要的朋友可以参考下
    2019-01-01
  • Py之pycocotools库的简介、安装、使用方法及说明

    Py之pycocotools库的简介、安装、使用方法及说明

    这篇文章主要介绍了Py之pycocotools库的简介、安装、使用方法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python面试题之列表声明实例分析

    python面试题之列表声明实例分析

    这篇文章主要介绍了python面试题之列表声明,结合实例形式分析了Python列表的声明、计算相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Python在游戏中的热更新实现

    Python在游戏中的热更新实现

    本文主要介绍了Python在游戏中的热更新实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • python 实现图像快速替换某种颜色

    python 实现图像快速替换某种颜色

    这篇文章主要介绍了python 实现图像快速替换某种颜色,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python利用PyAutoGUI模块实现控制鼠标键盘

    Python利用PyAutoGUI模块实现控制鼠标键盘

    PyAutoGUI是一个简单易用,跨平台的可以模拟键盘鼠标进行自动操作的python库。本文将详细讲讲它是如何实现控制鼠标键盘的,感兴趣的可以了解一下
    2022-06-06

最新评论