最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python神經(jīng)網(wǎng)絡(luò)Batch?Normalization底層原理詳解

 更新時(shí)間:2022年05月07日 15:55:06   作者:Bubbliiiing  
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Batch?Normalization底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是Batch Normalization

Batch Normalization是神經(jīng)網(wǎng)絡(luò)中常用的層,解決了很多深度學(xué)習(xí)中遇到的問(wèn)題,我們一起來(lái)學(xué)習(xí)一哈。

Batch Normalization是由google提出的一種訓(xùn)練優(yōu)化方法。參考論文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift。

Batch Normalization的名稱為批標(biāo)準(zhǔn)化,它的功能是使得輸入的X數(shù)據(jù)符合同一分布,從而使得訓(xùn)練更加簡(jiǎn)單、快速。

一般來(lái)講,Batch Normalization會(huì)放在卷積層后面,即卷積 + 標(biāo)準(zhǔn)化 + 激活函數(shù)。

其計(jì)算過(guò)程可以簡(jiǎn)單歸納為以下3點(diǎn):

1、求數(shù)據(jù)均值。

2、求數(shù)據(jù)方差。

3、數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。

Batch Normalization的計(jì)算公式

Batch Normalization的計(jì)算公式主要看如下這幅圖:

這個(gè)公式一定要靜下心來(lái)看,整個(gè)公式可以分為四行:

1、對(duì)輸入進(jìn)來(lái)的數(shù)據(jù)X進(jìn)行均值求取。

2、利用輸入進(jìn)來(lái)的數(shù)據(jù)X減去第一步得到的均值,然后求平方和,獲得輸入X的方差。

3、利用輸入X、第一步獲得的均值和第二步獲得的方差對(duì)數(shù)據(jù)進(jìn)行歸一化,即利用X減去均值,然后除上方差開(kāi)根號(hào)。方差開(kāi)根號(hào)前需要添加上一個(gè)極小值。

4、引入γ和β變量,對(duì)輸入進(jìn)來(lái)的數(shù)據(jù)進(jìn)行縮放和平移。利用γ和β兩個(gè)參數(shù),讓我們的網(wǎng)絡(luò)可以學(xué)習(xí)恢復(fù)出原始網(wǎng)絡(luò)所要學(xué)習(xí)的特征分布。

前三步是標(biāo)準(zhǔn)化工序,最后一步是反標(biāo)準(zhǔn)化工序。

Bn層的好處

1、加速網(wǎng)絡(luò)的收斂速度。在神經(jīng)網(wǎng)絡(luò)中,存在內(nèi)部協(xié)變量偏移的現(xiàn)象,如果每層的數(shù)據(jù)分布不同的話,會(huì)導(dǎo)致非常難收斂,如果把每層的數(shù)據(jù)都在轉(zhuǎn)換在均值為零,方差為1的狀態(tài)下,這樣每層數(shù)據(jù)的分布都是一樣的,訓(xùn)練會(huì)比較容易收斂。

2、防止梯度爆炸和梯度消失。對(duì)于梯度消失而言,以Sigmoid函數(shù)為例,它會(huì)使得輸出在[0,1]之間,實(shí)際上當(dāng)x到了一定的大小,sigmoid激活函數(shù)的梯度值就變得非常小,不易訓(xùn)練。歸一化數(shù)據(jù)的話,就能讓梯度維持在比較大的值和變化率;

對(duì)于梯度爆炸而言,在方向傳播的過(guò)程中,每一層的梯度都是由上一層的梯度乘以本層的數(shù)據(jù)得到。如果歸一化的話,數(shù)據(jù)均值都在0附近,很顯然,每一層的梯度不會(huì)產(chǎn)生爆炸的情況。

3、防止過(guò)擬合。在網(wǎng)絡(luò)的訓(xùn)練中,Bn使得一個(gè)minibatch中所有樣本都被關(guān)聯(lián)在了一起,因此網(wǎng)絡(luò)不會(huì)從某一個(gè)訓(xùn)練樣本中生成確定的結(jié)果,這樣就會(huì)使得整個(gè)網(wǎng)絡(luò)不會(huì)朝這一個(gè)方向使勁學(xué)習(xí)。一定程度上避免了過(guò)擬合。

為什么要引入γ和β變量

Bn層在進(jìn)行前三步后,會(huì)引入γ和β變量,對(duì)輸入進(jìn)來(lái)的數(shù)據(jù)進(jìn)行縮放和平移。

γ和β變量是網(wǎng)絡(luò)參數(shù),是可學(xué)習(xí)的。

引入γ和β變量進(jìn)行縮放平移可以使得神經(jīng)網(wǎng)絡(luò)有自適應(yīng)的能力,在標(biāo)準(zhǔn)化效果好時(shí),盡量不抵消標(biāo)準(zhǔn)化的作用,而在標(biāo)準(zhǔn)化效果不好時(shí),盡量去抵消一部分標(biāo)準(zhǔn)化的效果,相當(dāng)于讓神經(jīng)網(wǎng)絡(luò)學(xué)會(huì)要不要標(biāo)準(zhǔn)化,如何折中選擇。

Bn層的代碼實(shí)現(xiàn)

Pytorch代碼看起來(lái)比較簡(jiǎn)單,而且和上面的公式非常符合,可以學(xué)習(xí)一下,參考自

http://www.fzitv.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神經(jīng)網(wǎng)絡(luò)Batch Normalization底層原理詳解的詳細(xì)內(nèi)容,更多關(guān)于Batch Normalization底層原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python基礎(chǔ)之變量與內(nèi)存管理方式

    python基礎(chǔ)之變量與內(nèi)存管理方式

    本文介紹了變量的定義、賦值、使用原則、命名規(guī)范、內(nèi)存管理以及變量的特征,變量是程序中可變化的量,需要先定義后使用,可多次更改值,Python作為弱類型語(yǔ)言,變量無(wú)需聲明類型即可賦值
    2024-09-09
  • python Paramiko使用示例

    python Paramiko使用示例

    這篇文章主要介紹了python Paramiko的使用示例,幫助大家遠(yuǎn)程控制類 UNIX 系統(tǒng),感興趣的朋友可以了解下。
    2020-09-09
  • python-pymysql獲取字段名稱-獲取內(nèi)容方式

    python-pymysql獲取字段名稱-獲取內(nèi)容方式

    這篇文章主要介紹了python-pymysql獲取字段名稱-獲取內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Pycharm報(bào)錯(cuò)Non-zero?exit?code?(2)的完美解決方案

    Pycharm報(bào)錯(cuò)Non-zero?exit?code?(2)的完美解決方案

    最近在使用pycharm安裝或升級(jí)模塊時(shí)出現(xiàn)了錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于Pycharm報(bào)錯(cuò)Non-zero?exit?code?(2)的完美解決方案,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 五個(gè)Python命令使用的小妙招分享

    五個(gè)Python命令使用的小妙招分享

    平常在使用python命令過(guò)程中,基本上都是用來(lái)安裝python庫(kù)時(shí)才使用到在控制臺(tái)的python命令。然而,python命令還有更多的妙用,本文就來(lái)為大家詳細(xì)講講
    2022-07-07
  • 如何用Python搭建gRPC服務(wù)

    如何用Python搭建gRPC服務(wù)

    gRPC是一個(gè)高性能、通用的開(kāi)源RPC框架,其由Google主要面向移動(dòng)應(yīng)用開(kāi)發(fā)并基于HTTP/2協(xié)議標(biāo)準(zhǔn)而設(shè)計(jì),基于ProtoBuf序列化協(xié)議開(kāi)發(fā),且支持眾多開(kāi)發(fā)語(yǔ)言
    2021-06-06
  • python通過(guò)裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法

    python通過(guò)裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法

    這篇文章主要介紹了python通過(guò)裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法,涉及Python裝飾器的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Macbook安裝Python最新版本、GUI開(kāi)發(fā)環(huán)境、圖像處理、視頻處理環(huán)境詳解

    Macbook安裝Python最新版本、GUI開(kāi)發(fā)環(huán)境、圖像處理、視頻處理環(huán)境詳解

    這篇文章主要介紹了Macbook安裝Python最新版本(3.6.4)、GUI開(kāi)發(fā)環(huán)境、圖像處理、視頻處理環(huán)境詳解,需要的朋友可以參考下
    2020-02-02
  • python矩陣的基本運(yùn)算及各種操作

    python矩陣的基本運(yùn)算及各種操作

    python的numpy庫(kù)提供矩陣運(yùn)算的功能,因此我們?cè)谛枰仃囘\(yùn)算的時(shí)候,需要導(dǎo)入numpy的包,下面這篇文章主要給大家介紹了關(guān)于python矩陣的基本運(yùn)算及各種操作的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Python幾種繪制時(shí)間線圖的方法

    Python幾種繪制時(shí)間線圖的方法

    這篇文章主要介紹了Python幾種繪制時(shí)間線圖的方法,Matplotlib 作為 Python 家族最為重要的可視化工具,其基本的 API 以及繪制流程還是需要掌握的
    2022-08-08

最新評(píng)論

芮城县| 阜新市| 河北省| 松桃| 昌都县| 兰溪市| 辽宁省| 柏乡县| 镇雄县| 新乐市| 昌黎县| 页游| 河西区| 沅江市| 丁青县| 无棣县| 鄂伦春自治旗| 胶南市| 吴忠市| 阿瓦提县| 江津市| 芒康县| 政和县| 乐都县| 上虞市| 和田市| 凌源市| 临武县| 兴海县| 徐州市| 武陟县| 康乐县| 壤塘县| 抚松县| 襄樊市| 哈巴河县| 哈尔滨市| 阳新县| 三江| 萝北县| 房产|