欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python深度學(xué)習(xí)理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化

 更新時(shí)間:2021年10月11日 10:02:36   作者:Supre_yuan  
這篇文章主要是Python深度學(xué)習(xí)篇,通過(guò)示例的詳解讓大家更好的理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化,有需要的的朋友可以借鑒參考下,希望能夠有所幫助

訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)是十分困難的,特別是在較短的實(shí)踐內(nèi)使他們收斂更加棘手。在本節(jié)中,我們將介紹批量歸一化(batch normalization),這是一種流行且有效的技術(shù),可持續(xù)加速深層網(wǎng)絡(luò)的收斂速度。在結(jié)合之后將介紹的殘差快,批量歸一化使得研究人員能夠訓(xùn)練100層以上的網(wǎng)絡(luò)。

訓(xùn)練深層網(wǎng)絡(luò)

為什么要批量歸一化層呢?

讓我們回顧一下訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)出現(xiàn)的一些實(shí)際挑戰(zhàn):

1.數(shù)據(jù)預(yù)處理的方式通常會(huì)對(duì)最終結(jié)果產(chǎn)生巨大影響。回想一下我們應(yīng)用多層感知機(jī)來(lái)預(yù)測(cè)房?jī)r(jià)的例子。使用真實(shí)數(shù)據(jù)時(shí),我們的第一步是標(biāo)準(zhǔn)化輸入特征,使其平均值為0,方差為1。直觀地說(shuō),這種標(biāo)準(zhǔn)化可以很好地與我們地優(yōu)化器配合使用,因?yàn)樗梢詫?shù)的量級(jí)進(jìn)行統(tǒng)一。

2.對(duì)于典型的多層感知機(jī)或卷積伸進(jìn)網(wǎng)絡(luò)。當(dāng)我們訓(xùn)練時(shí),中間層中的變量(例如,多層感知機(jī)中的仿射變換輸出)可能具有更廣的變化范圍:不論是沿著從輸入到輸出的層,跨同一層中的單元,或是隨著時(shí)間的推移,模型的參數(shù)隨著訓(xùn)練更新變幻莫測(cè)。批量歸一化的發(fā)明者非正式地假設(shè),這些變量分布中的這種偏移可能會(huì)阻礙網(wǎng)絡(luò)的收斂。直觀地說(shuō),我們可能會(huì)猜想,如果一個(gè)層的可變值是另一層的100倍,這可能需要對(duì)學(xué)習(xí)率進(jìn)行補(bǔ)償調(diào)整。

3.更深層的網(wǎng)絡(luò)很復(fù)雜,容易過(guò)擬合。這意味著正則化變得更加需要。

批量歸一化應(yīng)用于單個(gè)可選層(也可以應(yīng)用到所有層),其原理如下:
在每次訓(xùn)練迭代中,我們首先歸一化輸入,即通過(guò)減去其平均值并除以其標(biāo)準(zhǔn)差,其中兩者均基于當(dāng)前小批量處理。
接下來(lái),我們應(yīng)用比例系數(shù)和比例偏移。
正是由于這個(gè)基于批量統(tǒng)計(jì)的標(biāo)準(zhǔn)化,才有了批量標(biāo)準(zhǔn)化的名稱。

這里,如果我們嘗試使用大小為1的小批量應(yīng)用小批量歸一化,我們將無(wú)法學(xué)到任何東西。這是因?yàn)樵跍p去均值之后,每個(gè)隱藏單元將為0。所以,只有使用足夠大的小批量,批量歸一化這種方法才是有效且穩(wěn)定的。請(qǐng)注意,在應(yīng)用批量歸一化時(shí),批量大小的選擇可能比沒(méi)有批量歸一化時(shí)更重要。

現(xiàn)在,我們了解一下批量歸一化在實(shí)踐中是如何工作的。

批量歸一化層

回想一下,批量歸一化和其他圖層之間的一個(gè)關(guān)鍵區(qū)別是,由于批量歸一化在完整的小批次上運(yùn)行,因此我們不能像以前在引入其他圖層時(shí)忽略批處理的尺寸大小。我們?cè)谙旅嬗懻撨@兩種情況:全連接層和卷積層,它們的批量歸一化實(shí)現(xiàn)略有不同。

全連接層

通常,我們將批量歸一化層置于全連接層中的仿射變換和激活函數(shù)之間。

卷積層

同樣,對(duì)于卷積層,我們可以在卷積層之后和非線性激活函數(shù)之前應(yīng)用批量歸一化。當(dāng)卷積有多個(gè)輸出通道時(shí),我們需要對(duì)這些通道的“每個(gè)”輸出執(zhí)行批量歸一化,每個(gè)用到都有自己的拉伸和偏移參數(shù),這兩個(gè)參數(shù)都是標(biāo)量。假設(shè)我們的微批次包含 m m m個(gè)示例,并且對(duì)于每個(gè)通道,卷積的輸出具有高度 p p p和寬度 q q q。那么對(duì)于卷積層,我們?cè)诿總€(gè)輸出通道的 m ∗ p ∗ q m*p*q m∗p∗q個(gè)元素上同時(shí)執(zhí)行每個(gè)批量歸一化。因此,在計(jì)算平均值和方差時(shí),我們會(huì)收集所有空間位置的值,然后在給定通道內(nèi)應(yīng)用相同的均值和方差,以便在每個(gè)空間位置對(duì)值進(jìn)行歸一化。

預(yù)測(cè)過(guò)程中的批量歸一化

正如我們前面提到的,批量歸一化在訓(xùn)練模式和預(yù)測(cè)模式下的行為通常是不同的。
首先,將訓(xùn)練好的模型用于預(yù)測(cè)時(shí),我們不再需要樣本均值中的噪聲以及在微批次上估計(jì)每個(gè)小批次產(chǎn)生的樣本方差了。
其次,例如,我們可能需要使用我們的模型對(duì)逐個(gè)樣本進(jìn)行預(yù)測(cè)。一種常用的方法是通過(guò)移動(dòng)平均估算整個(gè)訓(xùn)練數(shù)據(jù)集的樣本均值和方差,并在預(yù)測(cè)時(shí)使用它們得到確定的輸出。可見(jiàn),和dropout一樣,批量歸一化層在訓(xùn)練模式和預(yù)測(cè)模式下的計(jì)算結(jié)果也是不一樣的。

使用批量歸一化層的LeNet

為了更好理解如何應(yīng)用BatchNorm,下面我們將其應(yīng)用于LeNet模型?;叵胍幌拢繗w一化是在卷積層或全連接層之后、相應(yīng)的激活函數(shù)之前應(yīng)用的。

net = nn.Sequential(
	nn.Conv2d(1, 6, kernel_size = 5), BatchNorm(6, num_dims=4), nn.Sigmoid(),
	nn.MaxPool2d(kernel_size=2, stride=2)
	nn.Conv2d(6, 16, kernel_size=5), BatchNorm(16, num_dims=4), nn.Sigmoid(),
	nn.MaxPool2d(kernel_size=2, stride=2), nn.Flatten(),
	nn.Linear(16*4*4, 120), BatchNorm(120, num_dims=2), nn.Sigmoid(),
	nn.Linear(120, 84), BatchNorm(84, num_dims=2), nn.Sigmoid(),
	nn.Linear(84, 10)
)

和以前一樣,我們將在Fashion-MNIST數(shù)據(jù)集上訓(xùn)練網(wǎng)絡(luò)。這個(gè)代碼與我們第一次訓(xùn)練LeNet時(shí)幾乎完全相同,主要區(qū)別在于學(xué)習(xí)率大得多。

lr, num_epochs, batch_size = 1.0, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.250, train acc 0.907, test acc 0.801
35560.7 examples/sec on cuda:0

在這里插入圖片描述

讓我們來(lái)看看從第一個(gè)批量歸一化層中學(xué)到的拉伸參數(shù)gamma和便宜參數(shù)beta。

net[1].gamma.reshape((-1,)), net[1].beta.reshape((-1,))
(tensor([0.7562, 1.2784, 2.3527, 1.3189, 2.0457, 2.8424], device='cuda:0',
grad_fn=<ViewBackward>),
tensor([ 0.7436, -0.8156, -0.2711, -0.5087, 0.5847, -3.0033], device='cuda:0',
grad_fn=<ViewBackward>))

簡(jiǎn)明實(shí)現(xiàn)

除了使用我們剛剛定義的BatchNorm,我們也可以直接使用深度學(xué)習(xí)框架中定義的BatchNorm。該代碼看起來(lái)幾乎與我們上面的代碼相同。

net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5), nn.BatchNorm2d(6), nn.Sigmoid(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.BatchNorm2d(16), nn.Sigmoid(),
nn.MaxPool2d(kernel_size=2, stride=2), nn.Flatten(),
nn.Linear(256, 120), nn.BatchNorm1d(120), nn.Sigmoid(),
nn.Linear(120, 84), nn.BatchNorm1d(84), nn.Sigmoid(),
nn.Linear(84, 10))

下面,我們使用相同超參數(shù)來(lái)訓(xùn)練模型。請(qǐng)注意,通常高級(jí)API變體運(yùn)行速度快得多,因?yàn)樗拇a已編譯為C++或CUDA,而我們自定義代碼由Python實(shí)現(xiàn)。

d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.248, train acc 0.908, test acc 0.869
60219.9 examples/sec on cuda:0

在這里插入圖片描述

爭(zhēng)議

直觀地說(shuō),批量歸一化被認(rèn)為可以使優(yōu)化更加平滑。

然而,在提出批量歸一化的論文中,作者除了介紹了其應(yīng)用,還解釋了其原理:通過(guò)減少內(nèi)部協(xié)變量。然而這種解釋更偏向于個(gè)人直覺(jué)。

但是批量歸一化的效果很好,它適用于幾乎所有圖像分類器,并在學(xué)術(shù)界獲得了數(shù)萬(wàn)引用。

以上就是Python深度學(xué)習(xí)理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化的詳細(xì)內(nèi)容,更多關(guān)于pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中類的創(chuàng)建和實(shí)例化操作示例

    Python中類的創(chuàng)建和實(shí)例化操作示例

    這篇文章主要介紹了Python中類的創(chuàng)建和實(shí)例化操作,涉及Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的定義、實(shí)例化、方法調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • Python正則表達(dá)式re模塊詳解(建議收藏!)

    Python正則表達(dá)式re模塊詳解(建議收藏!)

    正則表達(dá)式是用來(lái)匹配與查找字符串的,從網(wǎng)上爬取數(shù)據(jù)自然或多或少會(huì)用到正則表達(dá)式,python的正則表達(dá)式要先引入re模塊,這篇文章主要給大家介紹了關(guān)于Python正則表達(dá)式re模塊的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • pandas行和列的獲取的實(shí)現(xiàn)

    pandas行和列的獲取的實(shí)現(xiàn)

    本文主要介紹了pandas行和列的獲取的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Python實(shí)現(xiàn)郵件自動(dòng)下載的示例詳解

    Python實(shí)現(xiàn)郵件自動(dòng)下載的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)郵件自動(dòng)下載以及附件解析功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-07-07
  • Python基于checksum計(jì)算文件是否相同的方法

    Python基于checksum計(jì)算文件是否相同的方法

    這篇文章主要介紹了Python基于checksum計(jì)算文件是否相同的方法,涉及Python針對(duì)二進(jìn)制文件的讀取與判定技巧,需要的朋友可以參考下
    2015-07-07
  • Python錯(cuò)誤: SyntaxError: Non-ASCII character解決辦法

    Python錯(cuò)誤: SyntaxError: Non-ASCII character解決辦法

    這篇文章主要介紹了Python錯(cuò)誤: SyntaxError: Non-ASCII character解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • python 視頻逐幀保存為圖片的完整實(shí)例

    python 視頻逐幀保存為圖片的完整實(shí)例

    今天小編就為大家分享一篇python 視頻逐幀保存為圖片的完整實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python實(shí)現(xiàn)SQL注入檢測(cè)插件實(shí)例代碼

    Python實(shí)現(xiàn)SQL注入檢測(cè)插件實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)SQL注入檢測(cè)插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Python 自由定制表格的實(shí)現(xiàn)示例

    Python 自由定制表格的實(shí)現(xiàn)示例

    這篇文章主要介紹了Python 自由定制表格的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python簡(jiǎn)單操作sqlite3的方法示例

    Python簡(jiǎn)單操作sqlite3的方法示例

    這篇文章主要介紹了Python簡(jiǎn)單操作sqlite3的方法,結(jié)合實(shí)例形式分析了Python針對(duì)sqlite3數(shù)據(jù)庫(kù)的讀取、創(chuàng)建、增刪改查等基本操作技巧,需要的朋友可以參考下
    2017-03-03

最新評(píng)論