国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization

這篇具有很好參考價值的文章主要介紹了【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

如果為了使各層擁有適當(dāng)?shù)膹V度,“強制性”地調(diào)整激活值的分布會怎樣呢?實際上,Batch Normalization 方法就是基于這個想法而產(chǎn)生的

為什么Batch Norm這么惹人注目呢?因為Batch Norm有以下優(yōu)點:

  • 可以使學(xué)習(xí)快速進行(可以增大學(xué)習(xí)率)。
  • 不那么依賴初始值(對于初始值不用那么神經(jīng)質(zhì)) 。
  • 抑制過擬合(降低Dropout等的必要性)。

Batch Norm的思路是調(diào)整各層的激活值分布使其擁有適當(dāng)?shù)膹V度。為此,要向神經(jīng)網(wǎng)絡(luò)中插入對數(shù)據(jù)分布進行正規(guī)化的層,即Batch Normalization層(下文簡稱Batch Norm層)
【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization
Batch Norm,顧名思義,以進行學(xué)習(xí)時的mini-batch為單位,按mini-batch進行正規(guī)化。具體而言,就是進行使數(shù)據(jù)分布的均值為0、方差為1的正規(guī)化。用數(shù)學(xué)式表示的話,如下:
【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization

這里對mini-batch的m個輸人數(shù)據(jù)的集合B求均值方差。然后,對輸人數(shù)據(jù)進行均值為0、方差為1(合適的分布)的正規(guī)化。
這個式子所做的是將mini-batch的輸人數(shù)據(jù)變換為均值為0,方差為1的數(shù)據(jù)。通過將這個處理插入到激活函數(shù)的前面(或者后面),可以減少數(shù)據(jù)分布的偏向
接著,Batch Norm層會對正規(guī)化后的數(shù)據(jù)進行縮放和平移的變換用數(shù)學(xué)式可以如下表示。
【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization

這里,γ和β是參數(shù)。一開始γ=1,β=0,然后再通過學(xué)習(xí)調(diào)整到合適的值。
上面就是Batch Norm的算法。這個算法是神經(jīng)網(wǎng)絡(luò)上的正向傳播。

用計算圖表示如下:
【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization

Batch Norm的反向傳播
Batch Norm實現(xiàn)類

class BatchNormalization:
    """
    http://arxiv.org/abs/1502.03167
    """
    def __init__(self, gamma, beta, momentum=0.9, running_mean=None, running_var=None):
        self.gamma = gamma
        self.beta = beta
        self.momentum = momentum
        self.input_shape = None # Conv層的情況下為4維,全連接層的情況下為2維  

        # 測試時使用的平均值和方差
        self.running_mean = running_mean
        self.running_var = running_var  
        
        # backward時使用的中間數(shù)據(jù)
        self.batch_size = None
        self.xc = None
        self.std = None
        self.dgamma = None
        self.dbeta = None

    def forward(self, x, train_flg=True):
        self.input_shape = x.shape
        if x.ndim != 2:
            N, C, H, W = x.shape
            x = x.reshape(N, -1)

        out = self.__forward(x, train_flg)
        
        return out.reshape(*self.input_shape)
            
    def __forward(self, x, train_flg):
        if self.running_mean is None:
            N, D = x.shape
            self.running_mean = np.zeros(D)
            self.running_var = np.zeros(D)
                        
        if train_flg:
            mu = x.mean(axis=0)
            xc = x - mu
            var = np.mean(xc**2, axis=0)
            std = np.sqrt(var + 10e-7)
            xn = xc / std
            
            self.batch_size = x.shape[0]
            self.xc = xc
            self.xn = xn
            self.std = std
            self.running_mean = self.momentum * self.running_mean + (1-self.momentum) * mu
            self.running_var = self.momentum * self.running_var + (1-self.momentum) * var            
        else:
        	# 算法實現(xiàn)
            xc = x - self.running_mean
            xn = xc / ((np.sqrt(self.running_var + 10e-7)))
            
        out = self.gamma * xn + self.beta 
        return out

    def backward(self, dout):
        if dout.ndim != 2:
            N, C, H, W = dout.shape
            dout = dout.reshape(N, -1)

        dx = self.__backward(dout)

        dx = dx.reshape(*self.input_shape)
        return dx

	# 反向傳播
    def __backward(self, dout):
        dbeta = dout.sum(axis=0)
        dgamma = np.sum(self.xn * dout, axis=0)
        dxn = self.gamma * dout
        dxc = dxn / self.std
        dstd = -np.sum((dxn * self.xc) / (self.std * self.std), axis=0)
        dvar = 0.5 * dstd / self.std
        dxc += (2.0 / self.batch_size) * self.xc * dvar
        dmu = np.sum(dxc, axis=0)
        dx = dxc - dmu / self.batch_size
        
        self.dgamma = dgamma
        self.dbeta = dbeta
        
        return dx

Batch Normalization的評估

現(xiàn)在我們使用Batch Norm層進行實驗。首先,使用MNIST數(shù)據(jù)集,觀察使用Batch Norm層和不使用Batch Norm層時學(xué)習(xí)的過程會如何變化,
代碼如下:

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 為了導(dǎo)入父目錄的文件而進行的設(shè)定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net_extend import MultiLayerNetExtend
from common.optimizer import SGD, Adam

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)

# 減少學(xué)習(xí)數(shù)據(jù)
x_train = x_train[:1000]
t_train = t_train[:1000]

max_epochs = 20
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.01


def __train(weight_init_std):
    bn_network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100], output_size=10, 
                                    weight_init_std=weight_init_std, use_batchnorm=True)
    network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100], output_size=10,
                                weight_init_std=weight_init_std)
    optimizer = SGD(lr=learning_rate)
    
    train_acc_list = []
    bn_train_acc_list = []
    
    iter_per_epoch = max(train_size / batch_size, 1)
    epoch_cnt = 0
    
    for i in range(1000000000):
        batch_mask = np.random.choice(train_size, batch_size)
        x_batch = x_train[batch_mask]
        t_batch = t_train[batch_mask]
    
        for _network in (bn_network, network):
            grads = _network.gradient(x_batch, t_batch)
            optimizer.update(_network.params, grads)
    
        if i % iter_per_epoch == 0:
            train_acc = network.accuracy(x_train, t_train)
            bn_train_acc = bn_network.accuracy(x_train, t_train)
            train_acc_list.append(train_acc)
            bn_train_acc_list.append(bn_train_acc)
    
            print("epoch:" + str(epoch_cnt) + " | " + str(train_acc) + " - " + str(bn_train_acc))
    
            epoch_cnt += 1
            if epoch_cnt >= max_epochs:
                break
                
    return train_acc_list, bn_train_acc_list


# 3.繪制圖形==========
weight_scale_list = np.logspace(0, -4, num=16)
x = np.arange(max_epochs)

for i, w in enumerate(weight_scale_list):
    print( "============== " + str(i+1) + "/16" + " ==============")
    train_acc_list, bn_train_acc_list = __train(w)
    
    plt.subplot(4,4,i+1)
    plt.title("W:" + str(w))
    if i == 15:
        plt.plot(x, bn_train_acc_list, label='Batch Normalization', markevery=2)
        plt.plot(x, train_acc_list, linestyle = "--", label='Normal(without BatchNorm)', markevery=2)
    else:
        plt.plot(x, bn_train_acc_list, markevery=2)
        plt.plot(x, train_acc_list, linestyle="--", markevery=2)

    plt.ylim(0, 1.0)
    if i % 4:
        plt.yticks([])
    else:
        plt.ylabel("accuracy")
    if i < 12:
        plt.xticks([])
    else:
        plt.xlabel("epochs")
    plt.legend(loc='lower right')
    
plt.show()

運行結(jié)果如下:
【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization

從運行結(jié)果可以看到使用Batch Norm后,學(xué)習(xí)進行得更快了。
綜上,通過使用Batch Norm,可以推動學(xué)習(xí)的進行。并且,對權(quán)重初始值變得健壯(表示不那么依初始值) Batch Norm具備如此優(yōu)良的性質(zhì),一定能應(yīng)用在更多場合中。文章來源地址http://www.zghlxwxcb.cn/news/detail-495608.html

到了這里,關(guān)于【深度學(xué)習(xí)】5-3 與學(xué)習(xí)相關(guān)的技巧 - Batch Normalization的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【卷積層、BN層(Batch Normalization)、激活函數(shù)理解】

    【卷積層、BN層(Batch Normalization)、激活函數(shù)理解】

    卷積層的功能:對數(shù)據(jù)進行特征提取。 卷積層由輸出特征面組成,每個特征面有無數(shù)個神經(jīng)元(像素點)組成。其中輸出特征面的每個神經(jīng)元是通過卷積核對輸入特征面中的每個神經(jīng)元進行卷積操作得到的。 一個卷積核產(chǎn)生一張?zhí)卣鲌D,n個卷積核產(chǎn)生n個特征圖。卷積核的設(shè)

    2024年02月07日
    瀏覽(21)
  • 【深度學(xué)習(xí)】5-2 與學(xué)習(xí)相關(guān)的技巧 - 權(quán)重的初始值

    【深度學(xué)習(xí)】5-2 與學(xué)習(xí)相關(guān)的技巧 - 權(quán)重的初始值

    在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中,權(quán)重的初始值特別重要。實際上, 設(shè)定什么樣的權(quán)重初始值,經(jīng)常關(guān)系到神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能否成功 。本節(jié)將介紹權(quán)重初始值的推薦值,并通過實驗確認(rèn)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)是否會快速進行。 可以將權(quán)重初始值設(shè)為0嗎 后面我們會介紹 抑制過擬合、提高泛化

    2024年02月10日
    瀏覽(24)
  • DNNGP模型解讀-early stopping 和 batch normalization的使用

    DNNGP模型解讀-early stopping 和 batch normalization的使用

    一、考慮的因素(僅代表個人觀點) 1.首先我們看到他的這篇文章所考慮的不同方面從而做出的不同改進,首先考慮到了對于基因組預(yù)測的深度學(xué)習(xí)方法的設(shè)計?,我們設(shè)計出來這個方法就是為了基因組預(yù)測而使用,這也是主要目的,所以要抓住事物的主要方面。 2.DNNGP相比于

    2024年02月12日
    瀏覽(24)
  • pytorch10:正則化(weight_decay、dropout、Batch Normalization)

    pytorch10:正則化(weight_decay、dropout、Batch Normalization)

    往期回顧 pytorch01:概念、張量操作、線性回歸與邏輯回歸 pytorch02:數(shù)據(jù)讀取DataLoader與Dataset、數(shù)據(jù)預(yù)處理transform pytorch03:transforms常見數(shù)據(jù)增強操作 pytorch04:網(wǎng)絡(luò)模型創(chuàng)建 pytorch05:卷積、池化、激活 pytorch06:權(quán)重初始化 pytorch07:損失函數(shù)與優(yōu)化器 pytorch08:學(xué)習(xí)率調(diào)整策略

    2024年02月01日
    瀏覽(35)
  • 深度學(xué)習(xí)中epoch、batch、batch size和iterations詳解

    1.epoch 在訓(xùn)練一個模型時所用到的全部數(shù)據(jù); 備注:一般在訓(xùn)練時都要使用多于一個的epoch,因為在神經(jīng)網(wǎng)絡(luò)中傳遞完整的數(shù)據(jù)集僅僅一次是不夠的,只有將完整的數(shù)據(jù)集在同樣的神經(jīng)網(wǎng)絡(luò)中傳遞多次,才會得到比較優(yōu)秀的訓(xùn)練效果,當(dāng)然也不行,容易過擬合,所以要根據(jù)實

    2023年04月25日
    瀏覽(29)
  • 深入理解ECAPA-TDNN——兼談Res2Net、ASP統(tǒng)計池化、SENet、Batch Normalization

    深入理解ECAPA-TDNN——兼談Res2Net、ASP統(tǒng)計池化、SENet、Batch Normalization

    ECAPA-TDNN是說話人識別中基于TDNN的神經(jīng)網(wǎng)絡(luò),是目前最好的單體模型之一 關(guān)于TDNN,可以參考深入理解TDNN(Time Delay Neural Network)——兼談x-vector網(wǎng)絡(luò)結(jié)構(gòu) TDNN本質(zhì)上是1維卷積,而且常常是1維膨脹卷積,這樣的一種結(jié)構(gòu)非常注重context,也就是上下文信息,具體而言,是在frame

    2024年02月03日
    瀏覽(39)
  • 深度學(xué)習(xí)中Epoch和Batch Size的關(guān)系

    在深度學(xué)習(xí)中,Epoch(周期)和 Batch Size(批大?。┦怯?xùn)練神經(jīng)網(wǎng)絡(luò)時經(jīng)常使用的兩個重要的超參數(shù)。它們之間的關(guān)系是通過以下方式連接的: Epoch 表示整個訓(xùn)練數(shù)據(jù)集被神經(jīng)網(wǎng)絡(luò)完整地通過了一次。在一個 Epoch 內(nèi),神經(jīng)網(wǎng)絡(luò)會看到訓(xùn)練數(shù)據(jù)集中的所有樣本一次,進行前向傳

    2024年01月16日
    瀏覽(24)
  • 深度學(xué)習(xí)記錄--mini-batch gradient descent

    深度學(xué)習(xí)記錄--mini-batch gradient descent

    batch:段,塊 與傳統(tǒng)的batch梯度下降不同,mini-batch gradient descent將數(shù)據(jù)分成多個子集,分別進行處理,在 數(shù)據(jù)量非常巨大 的情況下,這樣處理可以及時進行梯度下降,大大加快訓(xùn)練速度 兩種方法的梯度下降圖如下圖所示 batch gradient descent是一條正常的 遞減 的曲線 mini-batch

    2024年01月21日
    瀏覽(28)
  • 深度學(xué)習(xí)中,什么是batch-size?如何設(shè)置?

    batch-size 是深度學(xué)習(xí)模型在訓(xùn)練過程中一次性輸入給模型的樣本數(shù)量。它在訓(xùn)練過程中具有重要的意義,影響著訓(xùn)練速度、內(nèi)存使用以及模型的穩(wěn)定性等方面。 以下是 batch-size 大小的一些影響和意義: 訓(xùn)練速度 :較大的 batch-size 通??梢约涌煊?xùn)練速度,因為在每次迭代中處

    2024年02月12日
    瀏覽(30)
  • 深度學(xué)習(xí)中epoch、batch、step、iteration等神經(jīng)網(wǎng)絡(luò)參數(shù)是什么意思?

    epoch: 表示將訓(xùn)練數(shù)據(jù)集中的所有樣本都過一遍 (且僅過一遍)的訓(xùn)練過程。在一個epoch中,訓(xùn)練算法會按照設(shè)定的順序?qū)⑺袠颖据斎肽P瓦M行前向傳播、計算損失、反向傳播和參數(shù)更新。一個epoch通常包含多個step。 batch:一般翻譯為“批次”,表示一次性輸入模型的一組

    2024年02月10日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包