国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

html5手機(jī)網(wǎng)站發(fā)布阿里云注冊(cè)域名

html5手機(jī)網(wǎng)站發(fā)布,阿里云注冊(cè)域名,怎么做學(xué)校網(wǎng)站和微信公眾號(hào),織夢(mèng)備份網(wǎng)站數(shù)據(jù)課程3. 分批訓(xùn)練與數(shù)據(jù)規(guī)范、標(biāo)準(zhǔn)化 理論神經(jīng)網(wǎng)絡(luò)的梯度優(yōu)化反向傳播算法 批量訓(xùn)練網(wǎng)絡(luò)輸入的規(guī)范化BatchNorm 驗(yàn)證樣本實(shí)踐加載數(shù)據(jù)集網(wǎng)絡(luò)構(gòu)建訓(xùn)練神經(jīng)網(wǎng)絡(luò) 課程計(jì)劃: 1.理論: 批量訓(xùn)練; 輸入數(shù)據(jù)的規(guī)范化; 批量標(biāo)準(zhǔn)化&#xff…

課程3. 分批訓(xùn)練與數(shù)據(jù)規(guī)范、標(biāo)準(zhǔn)化

  • 理論
    • 神經(jīng)網(wǎng)絡(luò)的梯度優(yōu)化
      • 反向傳播算法
    • 批量訓(xùn)練
    • 網(wǎng)絡(luò)輸入的規(guī)范化
    • BatchNorm
  • 驗(yàn)證樣本
  • 實(shí)踐
    • 加載數(shù)據(jù)集
    • 網(wǎng)絡(luò)構(gòu)建
    • 訓(xùn)練神經(jīng)網(wǎng)絡(luò)

課程計(jì)劃:

1.理論:
批量訓(xùn)練;
輸入數(shù)據(jù)的規(guī)范化;
批量標(biāo)準(zhǔn)化(batchnorm); ——驗(yàn)證樣品;

2.練習(xí):
在 PyTorch 上使用神經(jīng)網(wǎng)絡(luò)進(jìn)行 MNIST 數(shù)字圖像分類。

理論

神經(jīng)網(wǎng)絡(luò)的梯度優(yōu)化

我們已經(jīng)知道,神經(jīng)網(wǎng)絡(luò)是使用基于梯度下降的反向傳播算法進(jìn)行訓(xùn)練的。其本質(zhì)是通過(guò)計(jì)算損失 L L L對(duì)網(wǎng)絡(luò)參數(shù) ? L ? w i \frac{\partial L}{\partial w_i} ?wi??L?的偏導(dǎo)數(shù)來(lái)持續(xù)改變神經(jīng)網(wǎng)絡(luò)參數(shù)的值。

我們來(lái)回憶一下神經(jīng)網(wǎng)絡(luò)訓(xùn)練算法的思路是什么樣的:

假設(shè)我們有一個(gè)神經(jīng)網(wǎng)絡(luò) F F F,一個(gè)由 n n n 個(gè)元素組成的數(shù)據(jù)集 { X i , Y i } i = 0 n \{X_i, Y_i\}_{i=0}^n {Xi?,Yi?}i=0n?,以及一個(gè)損失函數(shù) l o s s loss loss。然后我們的任務(wù)就是找到這樣的神經(jīng)網(wǎng)絡(luò)權(quán)重值,使得數(shù)據(jù)集所有元素的損失函數(shù) l o s s loss loss的平均值很小:

L = ∑ i = 1 n l o s s ( y i , y ^ i ) n → m i n L = \frac{∑^{n}_{i=1} loss(y_i, \widehat{y}_i)}{n} \to min L=ni=1n?loss(yi?,y ?i?)?min

這里 y i y_i yi?是數(shù)據(jù)集中第i個(gè)元素的正確答案, y ^ i \widehat{y}_i y ?i?是神經(jīng)網(wǎng)絡(luò)對(duì)數(shù)據(jù)集中第 i i i個(gè)元素的答案。

梯度下降算法利用以下思想來(lái)幫助找到最佳權(quán)重:

  • 偏導(dǎo)數(shù) ? L ? w i \frac{\partial L}{\partial w_i} ?wi??L? 的符號(hào)表示權(quán)重 w i w_i wi? 應(yīng)該向哪個(gè)方向移動(dòng),以使損失值 L L L 變小;
  • 偏導(dǎo)數(shù) ? L ? w i \frac{\partial L}{\partial w_i} ?wi??L? 的模越大, w i w_i wi? 的值距離最優(yōu)值越遠(yuǎn);

在這里插入圖片描述
神經(jīng)網(wǎng)絡(luò)的梯度優(yōu)化算法如下所示:

  1. 用隨機(jī)值初始化所有網(wǎng)絡(luò)權(quán)重 W i W_i Wi? b i b_i bi?。我們選擇梯度下降步長(zhǎng) α \alpha α 的值
  2. 直到滿足停止標(biāo)準(zhǔn)為止,執(zhí)行以下操作:
    • 利用參數(shù) W i W_i Wi? b i b_i bi?的當(dāng)前值計(jì)算 L L L的值;
    • 我們計(jì)算偏導(dǎo)數(shù) ? L ? W i \frac{\partial L}{\partial W_i} ?Wi??L? ? L ? b i \frac{\partial L}{\partial b_i} ?bi??L?的值;
    • 更新網(wǎng)絡(luò)參數(shù)值:
      W i = W i ? α ? L ? W i , b i = b i ? α ? L ? b i W_i = W_i - \alpha \frac{\partial L}{\partial W_i}, \ \ b_i = b_i - \alpha \frac{\partial L}{\partial b_i} Wi?=Wi??α?Wi??L?,??bi?=bi??α?bi??L?

停止標(biāo)準(zhǔn)可能有所不同。最合乎邏輯和最普遍的說(shuō)法是:當(dāng)每次迭代(或從一個(gè)時(shí)代到另一個(gè)時(shí)代)的損失變化幅度變小時(shí),我們就停止。此外,我們還監(jiān)控過(guò)度訓(xùn)練:如果開(kāi)始過(guò)度訓(xùn)練,我們就會(huì)停止算法。

反向傳播算法

從之前的講座中大家可以知道,在標(biāo)準(zhǔn)梯度下降的基礎(chǔ)上,人們已經(jīng)發(fā)明了大量的修改方法,其中當(dāng)今最流行、最有效的修改方法就是ADAM(Adaptive Gradients with Momentum)算法。對(duì)于每一種可能的梯度方法,都會(huì)出現(xiàn)一個(gè)問(wèn)題:如何根據(jù)深度神經(jīng)網(wǎng)絡(luò)的參數(shù)有效地計(jì)算損失函數(shù)的梯度。問(wèn)題是這樣的:為了對(duì)神經(jīng)網(wǎng)絡(luò)的所有權(quán)重進(jìn)行自動(dòng)微分,需要計(jì)算最終函數(shù)的值,計(jì)算次數(shù)與我們計(jì)算梯度的參數(shù)數(shù)量成線性比例。對(duì)于深度神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),這個(gè)值可以達(dá)到數(shù)十億、數(shù)千億。有必要簡(jiǎn)化這一過(guò)程,并學(xué)會(huì)在比使用標(biāo)準(zhǔn)數(shù)值方法計(jì)算導(dǎo)數(shù)更短的時(shí)間內(nèi)計(jì)算模型所有參數(shù)的導(dǎo)數(shù)。為此,有一個(gè)眾所周知的算法叫做反向傳播。

反向傳播算法是一種將復(fù)雜函數(shù)的微分法則應(yīng)用于神經(jīng)網(wǎng)絡(luò)層層逐次計(jì)算梯度的問(wèn)題的方法。

在這里插入圖片描述
為了方便起見(jiàn),我們引入以下符號(hào)和術(shù)語(yǔ):

  • 我們將原始張量 X X X 在神經(jīng)網(wǎng)絡(luò)處理過(guò)程中的連續(xù)變換稱為信號(hào)。
  • 對(duì)于每個(gè)完全連接的層,經(jīng)過(guò)線性變換處理但尚未輸入到激活函數(shù)的信號(hào)值將被稱為預(yù)激活,并用 z z z 表示
  • 經(jīng)過(guò)激活函數(shù)變換后,該層的輸出將被稱為層 a a a的激活
  • Q Q Q 表示要最小化的函數(shù), L L L 表示層內(nèi)線性變換的應(yīng)用

層間信號(hào)轉(zhuǎn)換由以下公式確定:

z i + 1 = L i ( a i ) = L i ( f i ( z i ) ) z_{i+1} = L_i(a_i) = L_i(f_i(z_i)) zi+1?=Li?(ai?)=Li?(fi?(zi?))

其中 L i L_i Li? 是定義第 i 層的線性變換(即,在基本情況下,只是乘以某個(gè)矩陣), f i f_i fi? 是第 i 層的激活函數(shù)。反向傳播算法提出將損失函數(shù)Q關(guān)于第i層參數(shù)的導(dǎo)數(shù)展開(kāi)如下:

? Q ? ω i = ? Q ? z i + 1 ? z i + 1 ? ω i = ? Q ? z i + 1 ? z i + 1 ? z i ? z i ? ω i \frac{? Q}{? ω_i} = \frac{? Q}{? z_{i+1}}\frac{? z_{i+1}}{? ω_i} = \frac{? Q}{? z_{i+1}}\frac{? z_{i+1}}{? z_i}\frac{? z_{i}}{? \omega_i} ?ωi??Q?=?zi+1??Q??ωi??zi+1??=?zi+1??Q??zi??zi+1???ωi??zi??

該公式應(yīng)這樣理解:此處的索引表示相應(yīng)名稱所指的層的編號(hào)。這里 ω i ω_i ωi?是第i層的任意參數(shù),也就是說(shuō),這個(gè)公式對(duì)于定義第i個(gè)線性層的矩陣 W i W_i Wi?的任何元素都成立。

此外,該公式中以下結(jié)論也成立:

(1)對(duì)于最后一層,計(jì)算關(guān)于參數(shù)和預(yù)激活的導(dǎo)數(shù)并不困難。它們的數(shù)量相當(dāng)多,并且不會(huì)花費(fèi)太多時(shí)間。在標(biāo)準(zhǔn)分類和回歸問(wèn)題中,最后一層只包含一個(gè)神經(jīng)元。

(2)如果我們知道對(duì)第i+1層預(yù)激活的導(dǎo)數(shù),那么根據(jù)最后一個(gè)公式,我們不難計(jì)算出對(duì)第i層參數(shù)的導(dǎo)數(shù)。事實(shí)上: ? z i + 1 ? z i \frac{? z_{i+1}}{? z_i} ?zi??zi+1?? 很容易表示,因?yàn)? z i + 1 = W i + 1 ? f i ( z i ) z_{i+1} = W_{i+1}?f_i(z_i) zi+1?=Wi+1??fi?(zi?),其中我們知道矩陣 W i W_i Wi? 和函數(shù) f i f_i fi?。我們還可以計(jì)算導(dǎo)數(shù) ? z i ? ω i \frac{? z_{i}}{? \omega_i} ?ωi??zi??,因?yàn)? ω i \omega_i ωi? 是矩陣 W i W_i Wi? 的一個(gè)分量,且 z i = W i ? a i ? 1 z_i = W_i \cdot a_{i-1} zi?=Wi??ai?1?

(3)因此,我們可以從最后一層的導(dǎo)數(shù)開(kāi)始,一步步回到第一層,重新計(jì)算所有的導(dǎo)數(shù)

批量訓(xùn)練

現(xiàn)在讓我們想象一下我們有一個(gè)大型數(shù)據(jù)集。例如,1,000,000 個(gè)元素。對(duì)于這樣的數(shù)據(jù)集,上述算法的每次迭代都會(huì)花費(fèi)非常長(zhǎng)的時(shí)間,因?yàn)槊看蔚夹枰?jì)算神經(jīng)網(wǎng)絡(luò)的輸出值以及所有數(shù)據(jù)元素的損失 L L L
此外,還可能出現(xiàn)第二個(gè)問(wèn)題:大型數(shù)據(jù)集可能不適合放入 GPU 內(nèi)存。那么我們基本上就無(wú)法在算法中邁出一步。

解決方案是這樣的:讓我們?cè)诿總€(gè)步驟中針對(duì)部分?jǐn)?shù)據(jù)集元素計(jì)算損失 L L L 和偏導(dǎo)數(shù)的值,而不是一次性針對(duì)所有數(shù)據(jù)集元素計(jì)算損失 L L L 和偏導(dǎo)數(shù)的值。例如,對(duì)于 100 個(gè)元素。那么算法將如下所示:

神經(jīng)網(wǎng)絡(luò)的梯度優(yōu)化算法如下所示:

  1. 用隨機(jī)值初始化所有網(wǎng)絡(luò)權(quán)重 W i W_i Wi? b i b_i bi?。我們選擇梯度下降步長(zhǎng) α \alpha α 的值
  2. 直到滿足停止標(biāo)準(zhǔn)為止,執(zhí)行以下操作:
    • 我們將數(shù)據(jù)分成,每批有 k k k個(gè)元素。對(duì)于每個(gè) batch 我們執(zhí)行以下操作:
      • 我們根據(jù)當(dāng)前第 j j j 個(gè)批次的元素,用參數(shù) W i W_i Wi? b i b_i bi? 的當(dāng)前值計(jì)算 L j L^j Lj 的值;
      • 我們計(jì)算偏導(dǎo)數(shù) ? L j ? W i \frac{\partial L^j}{\partial W_i} ?Wi??Lj?、 ? L j ? b i \frac{\partial L^j}{\partial b_i} ?bi??Lj?的值;
      • 更新網(wǎng)絡(luò)參數(shù)值:
        W i = W i ? α ? L j ? W i , b i = b i ? α ? L j ? b i W_i = W_i - \alpha \frac{\partial L^j}{\partial W_i}, \ \ b_i = b_i - \alpha \frac{\partial L^j}{\partial b_i} Wi?=Wi??α?Wi??Lj?,??bi?=bi??α?bi??Lj?

該算法稱為小批量梯度下降或隨機(jī)梯度下降(SGD)。

這種算法的每次迭代都比通常的梯度下降的每次迭代快得多,在梯度下降中我們每次都會(huì)計(jì)算數(shù)據(jù)集所有元素的 L L L 值。但隨機(jī)梯度下降所需的總迭代次數(shù)較高。

為了理解其含義,讓我們考慮批量大小等于一的極端情況。也就是說(shuō),在梯度下降的每次迭代中,我們僅根據(jù)數(shù)據(jù)集的一個(gè)元素來(lái)計(jì)算表達(dá)式 L L L 的值和偏導(dǎo)數(shù)。這意味著在算法的每一步我們都會(huì)改變網(wǎng)絡(luò)權(quán)重,以便網(wǎng)絡(luò)開(kāi)始針對(duì)當(dāng)前元素 y i y_i yi? 產(chǎn)生最佳答案。但是這種權(quán)重變化的方向并不一定與導(dǎo)致數(shù)據(jù)集所有元素的網(wǎng)絡(luò)性能提高的方向完全一致。

事實(shí)證明,每一步的隨機(jī)梯度下降都會(huì)使參數(shù)值朝著略微偏離理想的方向移動(dòng)。

具體如下:
在這里插入圖片描述
這里 D i D_i Di?是第 i i i個(gè)batch上的損失值最小的網(wǎng)絡(luò)參數(shù)值向量。平均而言, D i D_i Di? C i C_i Ci?更接近 B B B。因此,小批量的梯度下降所需的迭代次數(shù)將比批量大小為 1 時(shí)更少。

事實(shí)證明,我們需要在算法一次迭代的執(zhí)行速度和所需的迭代次數(shù)之間進(jìn)行權(quán)衡。實(shí)際上,批量大小通常被認(rèn)為是 GPU 允許的最大值。

網(wǎng)絡(luò)輸入的規(guī)范化

對(duì)于神經(jīng)網(wǎng)絡(luò),在將輸入數(shù)據(jù)輸入網(wǎng)絡(luò)之前對(duì)其進(jìn)行規(guī)范化是很有用的。規(guī)范化是將所有輸入特征的分布帶到同一尺度的過(guò)程。

例如,假設(shè)我們有一項(xiàng)任務(wù),是根據(jù)客戶信息確定信用評(píng)分。讓信息包括客戶的年齡。此特征的值變化為[18, 80],即在相當(dāng)大的范圍內(nèi),它的絕對(duì)值可能相當(dāng)大。這使得梯度下降算法的效率降低,需要更多的迭代來(lái)訓(xùn)練網(wǎng)絡(luò),還會(huì)導(dǎo)致網(wǎng)絡(luò)中梯度爆炸等其他問(wèn)題。您可以通過(guò)“附加”部分中的鏈接了解為什么會(huì)發(fā)生這種情況。

最常見(jiàn)的規(guī)范化方法是標(biāo)準(zhǔn)化。這減少到了平均值 0 和方差 1。

假設(shè)我們有一個(gè)特征 F F F,以及它在數(shù)據(jù)集中的值 { x i f } \{x_i^f\} {xif?}。那么每個(gè)元素的屬性值變化如下:
x i f ? μ f σ f \frac{x_i^f-\mu_f}{\sigma_f} σf?xif??μf??

,其中 μ f \mu_f μf?是數(shù)據(jù)集中特征 F F F的平均值, σ f \sigma_f σf?是數(shù)據(jù)集中特征 F F F的標(biāo)準(zhǔn)差。經(jīng)過(guò)這樣的標(biāo)準(zhǔn)化之后,數(shù)據(jù)集的特征的平均值將為0,標(biāo)準(zhǔn)差將為1。

特征的規(guī)范化可以說(shuō)明如下。假設(shè)數(shù)據(jù)集中有兩個(gè)特征。我們將數(shù)據(jù)集的元素可視化為平面上的點(diǎn)。
在這里插入圖片描述
這里的藍(lán)點(diǎn)表示標(biāo)準(zhǔn)化之前的數(shù)據(jù)集元素,紅點(diǎn)表示標(biāo)準(zhǔn)化之后的數(shù)據(jù)集元素。

BatchNorm

現(xiàn)在我們來(lái)討論網(wǎng)絡(luò)的一個(gè)新的層——批量標(biāo)準(zhǔn)化。 這一層有助于使網(wǎng)絡(luò)訓(xùn)練更穩(wěn)定、更快。此外,具有批量規(guī)范層的神經(jīng)網(wǎng)絡(luò)通常比沒(méi)有批量規(guī)范的相同網(wǎng)絡(luò)更好地學(xué)習(xí)任務(wù)。

讓我們看一下具有多層的神經(jīng)網(wǎng)絡(luò)。請(qǐng)注意,該神經(jīng)網(wǎng)絡(luò)的 2-3 層可以被視為一個(gè)單獨(dú)的、較小的神經(jīng)網(wǎng)絡(luò)。該神經(jīng)網(wǎng)絡(luò)的輸入數(shù)據(jù)是網(wǎng)絡(luò)第一層的輸出。

我們已經(jīng)知道,為了更好地訓(xùn)練神經(jīng)網(wǎng)絡(luò),輸入數(shù)據(jù)需要規(guī)范化。事實(shí)證明,規(guī)范化每個(gè)中間層的輸出也有助于更好的網(wǎng)絡(luò)訓(xùn)練。 BatchNorm 是執(zhí)行此標(biāo)準(zhǔn)化的層。
在這里插入圖片描述

但是還有第二個(gè)原因來(lái)規(guī)范中間層的輸出。這是神經(jīng)網(wǎng)絡(luò)內(nèi)部協(xié)變量轉(zhuǎn)移的影響。 BatchNorm 最初是為了消除這種影響而設(shè)計(jì)的。

什么是內(nèi)部協(xié)變量轉(zhuǎn)移:讓我們看一下具有幾層的神經(jīng)網(wǎng)絡(luò)。在訓(xùn)練過(guò)程中,各層一起學(xué)習(xí)。并且網(wǎng)絡(luò)在訓(xùn)練時(shí)每一層都必須適應(yīng)前一層產(chǎn)生的值。但是在網(wǎng)絡(luò)訓(xùn)練的時(shí)候,網(wǎng)絡(luò)每一層輸出的數(shù)值的分布是會(huì)發(fā)生變化的。并且算法每次迭代時(shí)每個(gè)隱藏層都必須適應(yīng)前一層輸出的新分布。正因?yàn)槿绱?#xff0c;網(wǎng)絡(luò)學(xué)習(xí)得比較慢。同時(shí),在每次訓(xùn)練迭代中,權(quán)重可能會(huì)發(fā)生相當(dāng)大的變化,這可能會(huì)引發(fā)其他問(wèn)題,例如梯度爆炸。

規(guī)范化神經(jīng)網(wǎng)絡(luò)層的輸出將有助于解決這個(gè)問(wèn)題。

那么我們?nèi)绾螌?shí)現(xiàn)層輸出的規(guī)范化呢?最簡(jiǎn)單的想法是在將每一層的輸出進(jìn)一步輸入到網(wǎng)絡(luò)之前對(duì)其進(jìn)行嚴(yán)格的規(guī)范化,就像我們規(guī)范化輸入數(shù)據(jù)一樣。假設(shè),也將所有層輸出的平均值降低為 0,方差降低為 1。

但是為什么不給神經(jīng)網(wǎng)絡(luò)更多的自由并讓它自己決定如何最好地規(guī)范化每一層的輸出呢?
這就是 BatchNorm 背后的想法。 BatchNorm 是一個(gè)可訓(xùn)練層,它使用可訓(xùn)練參數(shù)對(duì)網(wǎng)絡(luò)輸出進(jìn)行規(guī)范化。

BatchNorm層應(yīng)用在網(wǎng)絡(luò)層之后,其工作原理如下:

  1. 我們按批次計(jì)算網(wǎng)絡(luò)層輸出的平均值 μ B \mu_B μB?和標(biāo)準(zhǔn)差 σ B \sigma_B σB?。也就是說(shuō),我們有層 { x i } i = 1 b \{x_i\}_{i=1}^b {xi?}i=1b? b b b 個(gè)輸出,其中 b b b 是批量大小。然后:

μ B = ∑ i = 1 b x i b \mu_B = \frac{\sum_{i=1}^b x_i} μB?=bi=1b?xi??
σ B 2 = ∑ i = 1 b ( x i ? μ B ) 2 b \sigma^2_B = \frac{\sum_{i=1}^b (x_i - \mu_B)^2} σB2?=bi=1b?(xi??μB?)2?

  1. 規(guī)范化層輸出:
    x i ^ = x i ? μ B σ B \widehat{x_i} = \frac{x_i - \mu_B}{\sigma_B} xi? ?=σB?xi??μB??

  2. 計(jì)算更新后的層輸出為

y i = γ x i ^ + β y_i = \gamma\widehat{x_i} + \beta yi?=γxi? ?+β

,其中 γ \gamma γ β \beta β是訓(xùn)練參數(shù)。

所以這個(gè)想法是這樣的:我們對(duì)每個(gè)神經(jīng)元的輸出進(jìn)行標(biāo)準(zhǔn)化,使得其輸出的平均值是 0,方差是 1。然后我們將每個(gè)神經(jīng)元的輸出乘以可訓(xùn)練值 γ \gamma γ 并添加可訓(xùn)練值 β \beta β。也就是說(shuō),我們改變神經(jīng)元輸出的平均值及其方差。但同時(shí),我們使得該層的所有神經(jīng)元的平均輸出值和方差相同。

每層的可學(xué)習(xí)平均值和方差使得神經(jīng)網(wǎng)絡(luò)能夠?yàn)樘囟ㄈ蝿?wù)選擇最方便的層值標(biāo)準(zhǔn)化。

在實(shí)踐中,BatchNorm 幾乎用于所有神經(jīng)網(wǎng)絡(luò),尤其是深度神經(jīng)網(wǎng)絡(luò)。當(dāng)我們討論流行的網(wǎng)絡(luò)架構(gòu)時(shí)我們會(huì)再次看到這一點(diǎn)。

驗(yàn)證樣本

為了在訓(xùn)練過(guò)程中跟蹤網(wǎng)絡(luò)的當(dāng)前質(zhì)量,訓(xùn)練樣本通常分為兩部分:訓(xùn)練和驗(yàn)證。訓(xùn)練部分用于訓(xùn)練網(wǎng)絡(luò),驗(yàn)證部分用于在每 n 次訓(xùn)練迭代之后(例如,每個(gè) epoch 之后)檢查網(wǎng)絡(luò)的質(zhì)量。

測(cè)試樣品不能作為驗(yàn)證樣品。因此測(cè)試樣本存在過(guò)度擬合的風(fēng)險(xiǎn)。

驗(yàn)證樣本的主要功能:

  1. 在訓(xùn)練過(guò)程中監(jiān)控模型的質(zhì)量。這對(duì)于跟蹤訓(xùn)練模型時(shí)可能出現(xiàn)的問(wèn)題非常重要:過(guò)度擬合、梯度爆炸或衰減、模型參數(shù)的不良分布或“滾動(dòng)”到簡(jiǎn)單的答案。根據(jù)驗(yàn)證樣本的結(jié)果,通常會(huì)從訓(xùn)練期間保存的集合中選擇最終模型。需要注意的是,在大型神經(jīng)網(wǎng)絡(luò)的情況下,使用驗(yàn)證樣本時(shí)不能排除可能的隨機(jī)性因素:即使是訓(xùn)練不佳的模型有時(shí)也能在驗(yàn)證樣本上顯示出良好的結(jié)果。這類似于多重假設(shè)檢驗(yàn)的效果,需要進(jìn)行校正(如果我們測(cè)試同一模型的許多不同版本,即使是隨機(jī)的,在某個(gè)時(shí)候我們也會(huì)找到一個(gè)在驗(yàn)證集上提供高質(zhì)量的版本)。這種影響可以被視為驗(yàn)證樣本的一種過(guò)度訓(xùn)練。因此,驗(yàn)證樣本和測(cè)試樣本必須彼此不同。

  2. 一些超參數(shù)的選擇。對(duì)于訓(xùn)練許多模型來(lái)說(shuō),以最佳方式選擇超參數(shù)非常重要。但這無(wú)法在訓(xùn)練樣本上完成,因?yàn)闊o(wú)法排除模型的過(guò)度擬合(即,所選的超參數(shù)與優(yōu)化參數(shù)的組合本身是好的,而不是針對(duì)特定的訓(xùn)練樣本)。在測(cè)試樣本上執(zhí)行此操作也是不可能的,因?yàn)槲覀兛梢詫?duì)其進(jìn)行重新訓(xùn)練,并且它不再是測(cè)試樣本。為了這些目的,有必要使用驗(yàn)證樣本。

實(shí)踐

在本部分中,我們將使用 PyTorch 上的全連接神經(jīng)網(wǎng)絡(luò)解決將圖像分類為 10 個(gè)類的問(wèn)題。
在這里插入圖片描述

import numpy as np
from tqdm.notebook import tqdm
import matplotlib.pyplot as plt
%matplotlib inline# PyTorch 庫(kù)模塊
import torch
from torchvision import datasets, transforms

加載數(shù)據(jù)集

MNIST數(shù)據(jù)集是標(biāo)準(zhǔn)數(shù)據(jù)集之一,位于PyTorch框架的數(shù)據(jù)集模塊中。下載并加載到內(nèi)存中非常簡(jiǎn)單:

train_data = datasets.MNIST(root="./mnist_data", train=True, download=True, transform=transforms.ToTensor())
test_data = datasets.MNIST(root="./mnist_data", train=False, download=True, transform=transforms.ToTensor())

在這里插入圖片描述
這里:

  • root — 下載數(shù)據(jù)集的文件夾路徑;
  • train — 如果為 True,則下載樣本的訓(xùn)練部分;如果為 False — 則下載測(cè)試部分;
  • download — 如果數(shù)據(jù)集尚未在磁盤上,則為 True。如果已經(jīng)下載,可以設(shè)置download=False;
  • transform — 加載時(shí)對(duì)數(shù)據(jù)集元素應(yīng)用哪些轉(zhuǎn)換;
  • transforms.ToTensor() 將所有圖像轉(zhuǎn)換為“張量”類型。
train_data

在這里插入圖片描述
接下來(lái),您需要向數(shù)據(jù)集的兩個(gè)部分添加數(shù)據(jù)加載器。數(shù)據(jù)加載器是一種協(xié)調(diào)將數(shù)據(jù)集分成批次的結(jié)構(gòu)。我們將在網(wǎng)絡(luò)訓(xùn)練代碼中使用它。

train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64, shuffle=False)

這里:

  • batch_size — 批次大小;
  • shuffle — 如果您需要在每個(gè)時(shí)期之前將數(shù)據(jù)集分成批次之前進(jìn)行打亂,則為 True,否則為 False。對(duì)于訓(xùn)練集,shuffle=True 應(yīng)該始終為真!

網(wǎng)絡(luò)構(gòu)建

我們將建立一個(gè)完全連接的神經(jīng)網(wǎng)絡(luò)來(lái)解決將圖像分為 10 類的問(wèn)題。要做到這一點(diǎn),您需要了解如何將圖像輸入到神經(jīng)網(wǎng)絡(luò)的輸入。

事實(shí)上,這很容易做到。每張黑白圖片都是一個(gè)二維數(shù)字矩陣。在我們的數(shù)據(jù)集中,圖像的分辨率為 28x28,因此 MNIST 的每個(gè)圖像都表示為 28x28 的數(shù)字矩陣。

為了將圖像輸入神經(jīng)網(wǎng)絡(luò),我們將二維矩陣?yán)鞛橐痪S向量。我們將矩陣的所有行連接成一個(gè)大小為 28*28 = 784 的長(zhǎng)向量。結(jié)果是每張圖片將由一個(gè)大小為 784 的向量表示。該向量可以被視為圖片特征的向量。
在這里插入圖片描述
那么,在解決 MNIST 圖像分類問(wèn)題的神經(jīng)網(wǎng)絡(luò)中,輸入層應(yīng)該正好有 784 個(gè)神經(jīng)元。輸出為 - 10,因?yàn)槲覀兊膯?wèn)題中有 10 個(gè)類。中間層的數(shù)量以及每個(gè)中間層的神經(jīng)元的數(shù)量可以是任意的。
讓我們建立一個(gè)神經(jīng)網(wǎng)絡(luò):

# 定義神經(jīng)網(wǎng)絡(luò)層的模塊
import torch.nn as nn
# 定義神經(jīng)網(wǎng)絡(luò)層激活的模塊
import torch.nn.functional as F
class SimpleNet(nn.Module):def __init__(self):super().__init__()self.flatten = torch.nn.Flatten()self.fc_in = nn.Linear(28*28, 256)self.fc_out = nn.Linear(256, 10)def forward(self, x):# 前向傳遞網(wǎng)絡(luò)# 將輸入對(duì)象從圖像轉(zhuǎn)換為矢量x = self.flatten(x)# 乘以第 1 層的權(quán)重矩陣并應(yīng)用激活函數(shù)x = F.relu(self.fc_in(x))# 乘以第 2 層權(quán)重矩陣并應(yīng)用激活函數(shù)x = self.fc_out(x)return x
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device

輸出:device(type=‘cuda’)

model = SimpleNet().to(device)

訓(xùn)練神經(jīng)網(wǎng)絡(luò)

讓我們聲明損失函數(shù)和優(yōu)化器:

# 損失函數(shù)
loss_fn = torch.nn.CrossEntropyLoss()# 優(yōu)化器
learning_rate = 1e-3
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

最后,我們來(lái)編寫模型訓(xùn)練函數(shù):

def train(model, loss_fn, optimizer, n_epoch=6):model.train(True)# 網(wǎng)絡(luò)訓(xùn)練周期for epoch in tqdm(range(n_epoch)):for i, batch in enumerate(tqdm(train_loader)):# 這就是我們獲得當(dāng)前一批圖片和對(duì)它們的回應(yīng)的方式X_batch, y_batch = batch# 前向傳遞(接收一批圖像的網(wǎng)絡(luò)響應(yīng))logits = model(X_batch.to(device))# 根據(jù)網(wǎng)絡(luò)給出的答案和批次的正確答案計(jì)算損失loss = loss_fn(logits, y_batch.to(device))# 每 50 次迭代我們將顯示當(dāng)前批次的損失if i % 50 == 0:print(loss.item())optimizer.zero_grad() # 我們重置優(yōu)化器梯度的值loss.backward() # 反向傳播(梯度計(jì)算)optimizer.step() # 更新網(wǎng)絡(luò)權(quán)重return model

我們訓(xùn)練模型:

model = train(model, loss_fn, optimizer, n_epoch=2)

在這里插入圖片描述
太好了,模型已經(jīng)訓(xùn)練好了。讓我們?cè)跍y(cè)試樣本上測(cè)試一下它的質(zhì)量。為此,我們編寫了評(píng)估函數(shù):

from sklearn.metrics import accuracy_scoredef evaluate(model, dataloader, loss_fn):model.eval()y_pred_list = []y_true_list = []losses = []# 讓我們看一下數(shù)據(jù)加載器批次for i, batch in enumerate(tqdm(dataloader)):# 這就是我們得到當(dāng)前批次的方法X_batch, y_batch = batch# 關(guān)閉任何梯度的計(jì)算with torch.no_grad():# 我們收到該批次的網(wǎng)絡(luò)響應(yīng)logits = model(X_batch.to(device))# 我們計(jì)算批次上的損失函數(shù)值loss = loss_fn(logits, y_batch.to(device))loss = loss.item()# 將當(dāng)前批次的損失保存到數(shù)組中losses.append(loss)# 對(duì)于我們理解的批次中的每個(gè)元素,# 網(wǎng)絡(luò)將它分配到 0 到 9 中的哪個(gè)類別y_pred = torch.argmax(logits, dim=1)# 我們將當(dāng)前批次的正確答案保存到數(shù)組中# 以及對(duì)當(dāng)前批次的網(wǎng)絡(luò)響應(yīng)y_pred_list.extend(y_pred.cpu().numpy())y_true_list.extend(y_batch.numpy())# 我們計(jì)算網(wǎng)絡(luò)響應(yīng)和正確答案之間的準(zhǔn)確率accuracy = accuracy_score(y_pred_list, y_true_list)return accuracy, np.mean(losses)

讓我們檢查一下模型對(duì)訓(xùn)練和測(cè)試樣本的預(yù)測(cè)質(zhì)量:

evaluate(model, train_loader, loss_fn)
evaluate(model, test_loader, loss_fn)

在這里插入圖片描述

我們將訓(xùn)練數(shù)據(jù)分為 train 和 val:

# 我們將把 80% 的圖片納入訓(xùn)練樣本
train_size = int(len(train_data) * 0.8)
# 驗(yàn)證 - 剩余 20%
val_size = len(train_data) - train_sizetrain_data, val_data = torch.utils.data.random_split(train_data, [train_size, val_size])train_data, val_data, test_data

在這里插入圖片描述
讓我們?yōu)楦碌臄?shù)據(jù)集聲明數(shù)據(jù)加載器:

train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
val_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=False)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64, shuffle=False)

讓我們添加一些網(wǎng)絡(luò)訓(xùn)練代碼:在每個(gè)時(shí)期之后插入對(duì)訓(xùn)練和驗(yàn)證樣本的損失和準(zhǔn)確性的檢查:

def train(model, loss_fn, optimizer, n_epoch=6):model.train(True)data = {'acc_train': [],'loss_train': [],'acc_val': [],'loss_val': []}# 網(wǎng)絡(luò)訓(xùn)練周期for epoch in tqdm(range(n_epoch)):for i, batch in enumerate(tqdm(train_loader)):# 這就是我們獲得當(dāng)前一批圖片和對(duì)它們的回應(yīng)的方式X_batch, y_batch = batch# 前向傳遞(接收一批圖像的網(wǎng)絡(luò)響應(yīng))logits = model(X_batch.to(device))# 根據(jù)網(wǎng)絡(luò)給出的答案和批次的正確答案計(jì)算損失loss = loss_fn(logits, y_batch.to(device))optimizer.zero_grad() # 我們重置優(yōu)化器梯度的值loss.backward() # 反向傳播(梯度計(jì)算)optimizer.step() # 更新網(wǎng)絡(luò)權(quán)重# 時(shí)代終結(jié),模型驗(yàn)證print('On epoch end', epoch)acc_train_epoch, loss_train_epoch = evaluate(model, train_loader, loss_fn)print('Train acc:', acc_train_epoch, 'Train loss:', loss_train_epoch)acc_val_epoch, loss_val_epoch = evaluate(model, val_loader, loss_fn)print('Val acc:', acc_val_epoch, 'Val loss:', loss_val_epoch)data['acc_train'].append(acc_train_epoch)data['loss_train'].append(loss_train_epoch)data['acc_val'].append(acc_val_epoch)data['loss_val'].append(loss_val_epoch)return model, data

讓我們?cè)俅蝿?chuàng)建一個(gè)具有隨機(jī)權(quán)重的模型,為其聲明一個(gè)損失函數(shù)和一個(gè)優(yōu)化器:

model = SimpleNet().to(device)# 損失函數(shù)
loss_fn = torch.nn.CrossEntropyLoss()# 優(yōu)化器
learning_rate = 1e-3
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

我們訓(xùn)練模型:

model, data = train(model, loss_fn, optimizer, n_epoch=3)

在這里插入圖片描述
讓我們直觀地看一下各個(gè)時(shí)期損失和準(zhǔn)確度的變化圖:

_, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))ox = list(range(3))axes[0][0].plot(ox, data['acc_train'])
axes[0][0].title.set_text('acc_train')axes[0][1].plot(ox, data['acc_val'])
axes[0][1].title.set_text('acc_val')axes[1][0].plot(ox, data['loss_train'])
axes[1][0].title.set_text('loss_train')axes[1][1].plot(ox, data['loss_val'])
axes[1][1].title.set_text('loss_val')plt.show()

在這里插入圖片描述

http://aloenet.com.cn/news/32686.html

相關(guān)文章:

  • 運(yùn)濤網(wǎng)站建設(shè)南昌網(wǎng)站seo外包服務(wù)
  • 在什么網(wǎng)站做推廣最好鞍山seo公司
  • 哪個(gè)網(wǎng)站域名便宜seo報(bào)名在線咨詢
  • wordpress調(diào)用指定文章內(nèi)容seo優(yōu)化網(wǎng)站推廣全域營(yíng)銷獲客公司
  • 網(wǎng)站建設(shè)書(shū)本信息網(wǎng)站搜索引擎優(yōu)化的步驟
  • 北京網(wǎng)站設(shè)計(jì)方案優(yōu)化品牌seo關(guān)鍵詞
  • 服裝小訂單接單平臺(tái)seo網(wǎng)站優(yōu)化推廣費(fèi)用
  • 網(wǎng)站游戲制作開(kāi)發(fā)神秘網(wǎng)站
  • 建什么網(wǎng)站能百度收錄國(guó)際國(guó)內(nèi)新聞最新消息今天
  • 免費(fèi)php企業(yè)網(wǎng)站源碼關(guān)鍵詞優(yōu)化怎么做
  • 理財(cái)平臺(tái)網(wǎng)站建設(shè)交換鏈接營(yíng)銷成功案例
  • 互聯(lián)網(wǎng)行業(yè)信息網(wǎng)站免費(fèi)b2b網(wǎng)站推廣渠道
  • wordpress圖片燈箱效果修改百度seo營(yíng)銷推廣
  • 廣州做網(wǎng)站厲害的公司互聯(lián)網(wǎng)營(yíng)銷師證書(shū)騙局
  • 簡(jiǎn)單建設(shè)一個(gè)網(wǎng)站的過(guò)程長(zhǎng)春網(wǎng)站seo公司
  • 免費(fèi)信息網(wǎng)站建設(shè)7個(gè)湖北seo網(wǎng)站推廣策略
  • 陜西網(wǎng)站建設(shè)通報(bào)網(wǎng)址搜索
  • 做購(gòu)物網(wǎng)站 需要手續(xù)百度搜索廣告怎么投放
  • 020網(wǎng)站建設(shè)和維護(hù)費(fèi)用數(shù)據(jù)分析培訓(xùn)班
  • 做網(wǎng)站軟件html css百度灰色關(guān)鍵詞代做
  • 東莞做網(wǎng)站價(jià)格360網(wǎng)站推廣怎么做
  • 企業(yè)局域網(wǎng)游戲網(wǎng)站如何做限制自動(dòng)點(diǎn)擊器安卓
  • 哪里有學(xué)編程的培訓(xùn)班神馬seo教程
  • 寧晉網(wǎng)站建設(shè)代理價(jià)格深圳百度推廣優(yōu)化
  • 攝影網(wǎng)站建設(shè)廣東廣州疫情最新情況
  • 石家莊網(wǎng)站建設(shè)公司哪家好如何制作網(wǎng)頁(yè)鏈接
  • 小兔自助建站百度一下1688
  • 泉州網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣要求
  • 裝修網(wǎng)站怎么做seo 工具
  • 正保建設(shè)工程教育網(wǎng)站線上推廣方式有哪些