成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度學習架構的超級英雄——BatchNorm2d 原創

發布于 2024-4-9 09:47
瀏覽
0收藏

本文旨在探索2D批處理規范化在深度學習架構中的關鍵作用,并通過簡單的例子來解釋該技術的內部工作原理。

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

由作者本人創建的圖像

深度學習(DL)已經改變了卷積神經網絡(CNN)和生成式人工智能(Gen AI)發展的游戲規則。這種深度學習模型可以從多維空間數據(如圖像)中提取復雜的模式和特征,并進行預測。輸入數據中的模式越復雜,模型架構就越復雜。

盡管存在很多方法可以加速模型訓練收斂并提高模型推理性能;但是,批量歸一化2D(BN2D)已成為這方面的超級英雄。這篇文章旨在展示如何將BN2D集成到DL架構中,從而實現更快的收斂和更好的推理。

了解一下BN2D

BN2D是一種批量應用于多維空間輸入(如圖像)的歸一化技術,以歸一化它們的維度(通道)值,從而使這些批次的維度具有0的平均值和1的方差。

合并BN2D組件的主要目的是防止來自網絡內先前層的輸入數據中跨維度或通道的內部協變量偏移。當維度數據的分布由于在訓練周期(epoch)對網絡參數進行的更新而改變時,會發生跨維度的內部協變量偏移。例如,卷積層中的N個過濾器產生N維激活作為輸出。該層維護其過濾器的權重和偏差參數,這些參數隨著每個訓練周期而逐漸更新。

作為這些更新的結果,來自一個過濾器的激活可以具有與來自相同卷積層的另一過濾器的激活明顯不同的分布。這種分布上的差異表明,來自一個過濾器的激活與來自另一過濾器的激活在很大程度上不同。當將這種尺度大不相同的維度數據輸入到網絡中的下一層時,該層的可學習性受到阻礙,因為與尺度較小的維度相比,尺度較大的維度的權重在梯度下降期間需要更大的更新。

另一個可能的后果是,尺度較小的權重梯度可能消失,而尺度較大的權重梯度則可能爆炸式增長。當網絡遇到這種學習障礙時,梯度下降將在更大的尺度上振蕩,嚴重阻礙學習收斂和訓練穩定性。BN2D通過將維度數據標準化為平均值為0、標準偏差為1的標準尺度,有效地緩解了這一現象,并促進了訓練過程中更快的收斂,減少了實現最佳性能所需的訓練周期(epoch)數量。因此,通過簡化網絡的訓練階段,該技術確保網絡可以專注于學習更復雜和抽象的特征,從而從輸入數據中提取更豐富的表示。

在標準實際應用中,BN2D實例插入卷積層后面,但插入到激活層(如ReLU)前,如圖1中的示例DL網絡所示:

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖1:一個深度CNN的示例(圖片由作者本人創建)

BN2D內部工作原理

圖2中顯示了一批簡單的多維空間數據的示例(如僅使用了3個通道的圖像),以說明BN2D技術的內部工作原理。

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖2:BN2D的內部工作原理(作者本人創建的圖像)

如圖2所示,BN2D的功能是在每個維度或通道處理一個批次。如果輸入批次具有N個維度或通道,則BN2D實例將具有N個BN2D層。在示例情況下,紅色、綠色和藍色通道的單獨處理意味著對應的BN2D實例具有3個BN2D層。

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖3:BN2D使用的公式(作者本人創建的圖像)

在訓練過程中,BN2D計算每個批次維度的平均值和方差,并使用圖3所示的訓練時間公式對值進行歸一化,如圖2所示。預設的ε是分母中的一個常數,以避免出現被零除的錯誤。BN2D實例維護每個維度或BN2D層的可學習參數——比例(γ)和偏移(β),這些參數在訓練優化期間更新。BN2D實例還維護每個BN2D層的移動平均值和方差,如圖2所示,它們在訓練過程中使用圖3所示的公式進行更新。預設動量(α)用作指數平均因子。

在推理過程中,使用如圖3所示的推理時間公式,BN2D實例使用特定維度的移動平均值、移動方差以及學習的比例(γ)和偏移(β)參數對每個維度的值進行歸一化。圖2中顯示了批量輸入中每個維度的訓練時間批量歸一化計算示例。圖2中的示例還說明了BN2D實例的輸出,該實例包含跨維度或通道獨立規范化的整個批次。用于完成圖2所示示例的PyTorch Jupyter筆記本文件可在以下GitHub存儲庫中找到:?https://github.com/kbmurali/hindi_hw_digits/blob/main/how_batch_norm2d_works.ipynb?。

使用BN2D

為了檢查在DL網絡架構中結合BN2D實例的預期性能改進,我們使用一個簡單的(類似玩具的)圖像數據集來構建具有和不具有BN2D的相對比較簡單的DL網絡,來實現所屬類別的預測。以下是使用BN2D預期帶來的幾個關鍵DL模型性能改進方面:

1. 改進的泛化:BN2D引入的歸一化有望提高DL模型的泛化能力。在該示例中,當在網絡中引入BN2D層時,預計會提高推理時間分類精度。

2. 更快的收斂:引入BN2D層有望促進訓練過程中更快的收斂,減少實現最佳性能所需的訓練周期數量。在該示例中,在引入BN2D層之后的早期訓練周期開始,預計訓練損失會降低。

3. 更平滑的梯度下降:由于BN2D將維度數據標準化為標準尺度,平均值為0,標準偏差為1,因此有望將梯度下降在較大規模維度上振蕩的可能性降至最低,梯度下降有望順利進行。

示例數據集

Kaggle在地址?https://www.kaggle.com/datasets/suvooo/hindi-character-recognition/data?處發布的印地語手寫數字(0-9)數據(GNU許可證)用于訓練和測試包含和不包含BN2D的卷積DL模型。讀者可參考本文頂部的橫幅圖片,了解印地語數字是如何書寫的。DL模型網絡是使用PyTorch DL模塊構建而成的。選擇手寫的印地語數字而不是英語數字是基于與后者相比的復雜性。印地語數字的邊緣檢測比英語更具挑戰性,因為印地語數字中的曲線多于直線。此外,根據一個人的寫作風格,同一個數字可能會有更多的變化。

而且,我還開發了一個實用的Python函數,以便對數字數據的訪問更符合PyTorch數據集/數據加載器的操作,如下面的代碼片段所示。訓練數據集有17000個樣本,而測試數據集有3000個。請注意,在將圖像加載為PyTorch張量時應用了PyTorch灰度轉換器。另外,我還專門開發了一個名為“ml_utils.py”的實用程序模塊,用于打包使用基于PyTorch張量的操作運行控制訓練周期、訓練和測試深度學習模型的函數。其中,訓練和測試函數還能夠捕獲模型度量指標,以幫助評估模型的性能。Python筆記本文件和實用程序模塊均可以在作者的公共GitHub存儲庫中訪問,其鏈接如下:

https://github.com/kbmurali/hindi_hw_digits?。

import torch
import torch.nn as nn
from torch.utils.data import *
import torchvision
from torchvision import transforms
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns

from ml_utils import *
from hindi.datasets import Digits

set_seed( 5842 )

batch_size = 32

img_transformer = transforms.Compose([
transforms.Grayscale(),
transforms.ToTensor()
])

train_dataset = Digits( "./data", train=True, transform=img_transformer, download=True )

test_dataset = Digits( "./data", train=False, transform=img_transformer, download=True )

train_loader = DataLoader( train_dataset, batch_size=batch_size, shuffle=True )

test_loader = DataLoader( test_dataset, batch_size=batch_size )

DL模型示例

第一個DL模型將包括具有16個過濾器的三個卷積層,每個過濾器的核大小為3,填充為1,以便產生“相同”的卷積。每個卷積的激活函數是修正線性單元(ReLU)。池大小為2的最大池化層被放置在完全連接層之前,導致產生一個輸出10個類別的softmax層。該模型的網絡架構如圖4所示。下面的代碼片段顯示了相應的PyTorch模型定義。

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖4:沒有BN2D的卷積網絡(圖片由作者本人創建)

device = torch.device( 'cuda' if torch.cuda.is_available() else 'cpu' )
loss_func = nn.CrossEntropyLoss()
input_channels = 1
classes = 10
filters = 16
kernel_size = 3
padding = kernel_size//2
pool_size = 2
original_pixels_per_channel = 32*32

three_convs_model = nn.Sequential(
nn.Conv2d( input_channels, filters, kernel_size, padding=padding ), # 1x32x32 => 16x32x32
nn.ReLU(inplace=True), #16x32x32 => 16x32x32
nn.Conv2d(filters, filters, kernel_size, padding=padding ), # 16x32x32 => 16x32x32
nn.ReLU(inplace=True), #16x32x32 => 16x32x32
nn.Conv2d(filters, filters, kernel_size, padding=padding ), # 16x32x32 => 16x32x32
nn.ReLU(inplace=True), #16x32x32 => 16x32x32
nn.MaxPool2d(pool_size), # 16x32x32 => 16x16x16

nn.Flatten(), # 16x16x16 => 4096
nn.Linear( 4096, classes) # 1024 => 10
)

第二個DL模型與第一個DL模型共享相似的結構,但在卷積之后和激活之前引入了BN2D實例。該模型的網絡架構如圖5所示。下面的代碼片段顯示了相應的PyTorch模型定義。

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖5:帶BN2D的卷積網絡(圖片由作者本人創建)

three_convs_wth_bn_model = nn.Sequential(
nn.Conv2d( input_channels, filters, kernel_size, padding=padding ), # 1x32x32 => 16x32x32
nn.BatchNorm2d( filters ), #16x32x32 => 16x32x32
nn.ReLU(inplace=True), #16x32x32 => 16x32x32
nn.Conv2d(filters, filters, kernel_size, padding=padding ), # 16x32x32 => 16x32x32
nn.BatchNorm2d( filters ), #16x32x32 => 16x32x32
nn.ReLU(inplace=True), #16x32x32 => 16x32x32
nn.Conv2d(filters, filters, kernel_size, padding=padding ), # 16x32x32 => 16x32x32
nn.BatchNorm2d( filters ), #16x32x32 => 16x32x32
nn.ReLU(inplace=True), #16x32x32 => 16x32x32
nn.MaxPool2d(pool_size), # 16x32x32 => 16x16x16

nn.Flatten(), # 16x16x16 => 4096
nn.Linear( 4096, classes) # 4096 => 10
)

我們使用以下代碼片段中所示的實用函數,以便在示例印地語數字數據集上訓練兩個DL模型。注意,代碼中捕獲了來自最后卷積層中過濾器的兩個維度/通道的兩個樣本權重,以便可視化展示訓練損失的梯度下降信息。

three_convs_model_results_df = train_model( 
three_convs_model,
loss_func, 
train_loader, 
test_loader=test_loader, 
score_funcs={'accuracy': accuracy_score}, 
device=device, 
epochs=30,
capture_conv_sample_weights=True, 
conv_index=4, 
wx_flt_index=3, 
wx_ch_index=4, 
wx_ro_index=1, 
wx_index=0,
wy_flt_index=3,
wy_ch_index=8, 
wy_ro_index=1, 
wy_index=0
)

three_convs_wth_bn_model_results_df = train_model( 
three_convs_wth_bn_model,
loss_func, 
train_loader, 
test_loader=test_loader, 
score_funcs={'accuracy': accuracy_score}, 
device=device, 
epochs=30,
capture_conv_sample_weights=True, 
conv_index=6, 
wx_flt_index=3, 
wx_ch_index=4, 
wx_ro_index=1, 
wx_index=0,
wy_flt_index=3,
wy_ch_index=8, 
wy_ro_index=1, 
wy_index=0
)

發現之1:提高了測試精度

通過引入BN2D實例,DL模型的測試精度更好,如圖6所示。對于具有BN2D的模型,測試精度隨著訓練時期的增加而逐漸提高,而對于沒有BN2D的模式,測試精度則隨著訓練周期而振蕩。在第30個訓練周期結束時,具有BN2D的模型的測試精度為99.1%,而不具有BN2D模型的測試準確率為92.4%。這些結果表明,引入BN2D實例對模型的性能產生了積極影響,顯著提高了測試精度。

sns.lineplot( x='epoch', y='test accuracy', data=three_convs_model_results_df, label="Three Convs Without BN2D Model" )
sns.lineplot( x='epoch', y='test accuracy', data=three_convs_wth_bn_model_results_df, label="Three Convs Wth BN2D Model" )

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖6:訓練周期的測試準確性(圖片由作者本人創建)

發現之2:更快的收斂

引入BN2D實例時,DL模型的訓練損失要低得多,如圖7所示。大約訓練到第3個周期時,具有BN2D的模型表現出比沒有BN2D的模型更低的訓練損失。較低的訓練損失表明,BN2D有助于在訓練過程中更快地收斂,可能會減少合理收斂的訓練周期數量。

sns.lineplot( x='epoch', y='train loss', data=three_convs_model_results_df, label="Three Convs Without BN2D Model" )
sns.lineplot( x='epoch', y='train loss', data=three_convs_wth_bn_model_results_df, label="Three Convs Wth BN2D Model" )

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖7:在各個訓練周期過程對應的訓練損失(圖片由作者本人創建)

發現之3:更平滑的梯度下降

如圖8所示,從帶有BN2D的模型的最后一次卷積中獲得的兩個樣本權重的損失函數顯示出比沒有BN2D的模型更平滑的梯度下降。沒有BN2D的模型的損失函數遵循相當明顯的“之”字形的梯度下降。BN2D的更平滑的梯度下降表明,將維度數據標準化為平均值為0、標準偏差為1的標準規模,使得不同維度的權重可能趨于相似的規模,從而減少梯度下降的可能振蕩。

fig1 = draw_loss_descent( three_convs_model_results_df, title='Three Convs Model Without BN2D Training Loss' )
fig2 = draw_loss_descent( three_convs_wth_bn_model_results_df, title='Three Convs With BN2D Model Training Loss' )

深度學習架構的超級英雄——BatchNorm2d-AI.x社區

圖8:樣本權重上的損失函數梯度下降(圖片由作者本人創建)

實際注意事項

雖然BN2D的好處是顯而易見的,但要真正使用它還需要仔細考量。權重的適當初始化、適當的學習率以及在DL網絡中放置BN2D層是最大化其有效性的關鍵因素。雖然BN2D通常可以防止過度擬合,但在某些情況下,它甚至可能導致過度擬合。例如,如果將BN2D與另一種稱為Dropout的技術一起使用,則根據具體配置和數據集,組合可能會對過度擬合產生不同的影響。同樣,在小批量的情況下,批量平均值和方差可能不能很好地代表整個數據集的統計數據,這可能會導致有噪聲的歸一化,這在防止過度擬合方面可能沒有那么有效。

結論

本文旨在展示在深度學習網絡中使用BN2D的背后邏輯。文中使用類玩具圖像數據的示例卷積模型僅用于展示在DL網絡架構中結合BN2D實例情況下的預期結果的性能改進。最后的結論是,跨空間和通道維度的BN2D歸一化帶來了訓練穩定性、更快的收斂性和增強的泛化能力,最終有助于深度學習模型的成功。希望這篇文章有助于您很好地理解BN2D的工作原理及其背后的實現邏輯。在開發更復雜的DL模型時,我相信這種理解和直覺感受會助您一臂之力。

參考資料

1. 印地語字符識別”,解決分類梵文的問題。地址:?https://www.kaggle.com/datasets/suvooo/hindi-character-recognition/data?source=post_page-----b4eb869e8b60--------------------------------?。

2. BatchNorm2d-PyTorch 2.1文檔”,讀者可加入PyTorch開發者社區,貢獻、學習并回答您的問題。地址:?https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm2d.html?source=post_page-----b4eb869e8b60--------------------------------?。

3. “為什么在特征中使用2D批量歸一化在分類器中使用1D?討論BatchNorm2d和BatchNorm1d之間有什么區別?為什么在特征中使用BatchNorm2d而BatchNorm1d是……地址:?https://discuss.pytorch.org/t/why-2d-batch-normalisation-is-used-in-features-and-1d-in-classifiers/88360/3?source=post_page-----b4eb869e8b60--------------------------------?。

4. “Keras文檔:BatchNormalization層”,Keras文檔有關內容地址:?https://keras.io/api/layers/normalization_layers/batch_normalization/?source=post_page-----b4eb869e8b60--------------------------------?。

譯者介紹

朱先忠,51CTO社區編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。

原文標題:Exploring the Superhero Role of 2D Batch Normalization in Deep Learning Architectures,作者:Murali Kashaboina

鏈接:??https://towardsdatascience.com/exploring-the-superhero-role-of-2d-batch-normalization-in-deep-learning-architectures-b4eb869e8b60?。

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
主站蜘蛛池模板: 成人亚洲精品久久久久软件 | 九九热免费视频在线观看 | 中文字幕视频一区二区 | 久久精品久久久久久 | 一区二区三区日本 | 一级全黄视频 | 免费国产视频 | 91精品国产91久久久久久吃药 | 国产精品成人在线观看 | 国产精品高清在线 | 国产亚洲精品久久午夜玫瑰园 | 国产一级久久久久 | 亚洲一区二区久久 | 欧美日韩在线一区二区 | 国产精品久久久久一区二区 | 色又黄又爽网站www久久 | 天天射网站 | 91.com在线观看 | 日韩在线播放中文字幕 | 久久久久久久久久久久久久国产 | 日韩av免费在线电影 | 最新av在线网址 | 日韩成人在线免费视频 | 国产视频福利一区 | 福利视频日韩 | 久久久毛片 | 国产成人精品一区二区三区视频 | 精品日韩在线 | 亚洲欧美自拍偷拍视频 | 激情欧美日韩一区二区 | 久久不卡 | 一区影院 | 日韩欧美视频 | 久草新在线 | 国产黄色网 | 久草免费视 | 亚洲成人国产精品 | 性高湖久久久久久久久3小时 | 中文字幕视频一区 | 亚洲毛片在线观看 | 精品国产一区三区 |