<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          PyTorch 進(jìn)階之路:在 GPU 上訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)

          共 5497字,需瀏覽 11分鐘

           ·

          2022-08-01 02:07


          點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          選自 | Medium

          作者 | Aakash N S

          參與| Panda

          本文是該系列的第四篇,將介紹如何在 GPU 上使用 PyTorch 訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)。

          在之前的教程中,我們基于 MNIST 數(shù)據(jù)集訓(xùn)練了一個(gè)識(shí)別手寫數(shù)字的 logistic 回歸模型,并且達(dá)到了約 86% 的準(zhǔn)確度。



          但是,我們也注意到,由于模型能力有限,很難再進(jìn)一步將準(zhǔn)確度提升到 87% 以上。在本文中,我們將嘗試使用前向神經(jīng)網(wǎng)絡(luò)來(lái)提升準(zhǔn)確度。本教程的大部分內(nèi)容受到了 Jeremy Howard 的 FastAI 開發(fā)筆記的啟發(fā):https://github.com/fastai/fastai_old/tree/master/dev_nb


          系統(tǒng)設(shè)置


          如果你想一邊閱讀一邊運(yùn)行代碼,你可以通過(guò)下面的鏈接找到本教程的 Jupyter Notebook:


          https://jvn.io/aakashns/fdaae0bf32cf4917a931ac415a5c31b0


          你可以克隆這個(gè)筆記,使用 conda 安裝必要的依賴包,然后通過(guò)在終端運(yùn)行以下命令來(lái)啟動(dòng) Jupyter:


          pip install jovian --upgrade    # Install the jovian library 
          jovian clone fdaae0bf32cf4917a931ac415a5c31b0  # Download notebook
          cd 04-feedforward-nn            # Enter the created directory 
          jovian install                  # Install the dependencies
          conda activate 04-feedfoward-nn # Activate virtual env
          jupyter notebook                # Start Jupyter


          如果你的 conda 版本更舊一些,你也許需要運(yùn)行 source activate 04-feedforward-nn 來(lái)激活虛擬環(huán)境。對(duì)以上步驟的更詳細(xì)解釋可參閱本教程的本系列教程第一篇文章。


          準(zhǔn)備數(shù)據(jù)


          這里的數(shù)據(jù)準(zhǔn)備流程和前一篇教程完全一樣。我們首先導(dǎo)入所需的模塊和類。



          我們使用 torchvision.datasets 的 MNIST 類下載數(shù)據(jù)并創(chuàng)建一個(gè) PyTorch 數(shù)據(jù)集。



          接下來(lái),我們定義并使用一個(gè)函數(shù) split_indices 來(lái)隨機(jī)選取 20% 圖像作為驗(yàn)證集。



          現(xiàn)在,我們可以使用 SubsetRandomSampler 為每個(gè)子集創(chuàng)建 PyTorch 數(shù)據(jù)加載器,它可從一個(gè)給定的索引列表中隨機(jī)地采樣元素,同時(shí)創(chuàng)建分批數(shù)據(jù)。



          模型


          要在 logistic 回歸的基礎(chǔ)上實(shí)現(xiàn)進(jìn)一步提升,我們將創(chuàng)建一個(gè)帶有一個(gè)隱藏層(hidden layer)的神經(jīng)網(wǎng)絡(luò)。這是我們的做法:


          • 我們不再使用單個(gè) nn.Linear 對(duì)象將輸入批(像素強(qiáng)度)轉(zhuǎn)換成輸出批(類別概率),而是將使用兩個(gè) nn.Linear 對(duì)象。其中每一個(gè)對(duì)象都被稱為一層,而該模型本身則被稱為一個(gè)網(wǎng)絡(luò)。

          • 第一層(也被稱為隱藏層)可將大小為 batch_size x 784 的輸入矩陣轉(zhuǎn)換成大小為 batch_size x hidden_size 的中間輸出矩陣,其中 hidden_size 是一個(gè)預(yù)配置的參數(shù)(比如 32 或 64)。

          • 然后,這個(gè)中間輸出會(huì)被傳遞給一個(gè)非線性激活函數(shù),它操作的是這個(gè)輸出矩陣的各個(gè)元素。

          • 這個(gè)激活函數(shù)的結(jié)果的大小也為 batch_size x hidden_size,其會(huì)被傳遞給第二層(也被稱為輸出層)。該層可將隱藏層的結(jié)果轉(zhuǎn)換成一個(gè)大小為 batch_size x 10 的矩陣,這與 logistic 回歸模型的輸出一樣。


          引入隱藏層和激活函數(shù)讓模型學(xué)習(xí)輸入與目標(biāo)之間更復(fù)雜的、多層的和非線性的關(guān)系??雌饋?lái)像是這樣(藍(lán)框表示單張輸入圖像的層輸出):



          我們這里將使用的激活函數(shù)是整流線性單元(ReLU),它的公式很簡(jiǎn)單:relu(x) = max(0,x),即如果一個(gè)元素為負(fù),則將其替換成 0,否則保持不變。


          為了定義模型,我們對(duì) nn.Module 類進(jìn)行擴(kuò)展,就像我們使用 logistic 回歸時(shí)那樣。



          我們將創(chuàng)建一個(gè)帶有 32 個(gè)激活的隱藏層的模型。



          我們看看模型的參數(shù)??梢灶A(yù)見每一層都有一個(gè)權(quán)重和偏置矩陣。



          我們?cè)囋囉梦覀兊哪P蜕梢恍┹敵?。我們從我們的?shù)據(jù)集取第一批 100 張圖像,并將其傳入我們的模型。



          使用 GPU


          隨著我們的模型和數(shù)據(jù)集規(guī)模增大,為了在合理的時(shí)間內(nèi)完成模型訓(xùn)練,我們需要使用 GPU(圖形處理器,也被稱為顯卡)來(lái)訓(xùn)練我們的模型。GPU 包含數(shù)百個(gè)核,這些核針對(duì)成本高昂的浮點(diǎn)數(shù)矩陣運(yùn)算進(jìn)行了優(yōu)化,讓我們可以在較短時(shí)間內(nèi)完成這些計(jì)算;這也因此使得 GPU 非常適合用于訓(xùn)練具有很多層的深度神經(jīng)網(wǎng)絡(luò)。你可以在 Kaggle kernels 或 Google Colab 上免費(fèi)使用 GPU,也可以租用 Google Cloud Platform、Amazon Web Services 或 Paperspace 等 GPU 使用服務(wù)。你可以使用 torch.cuda.is_available 檢查 GPU 是否可用以及是否已經(jīng)安裝了所需的英偉達(dá)驅(qū)動(dòng)和 CUDA 庫(kù)。



          我們定義一個(gè)輔助函數(shù),以便在有 GPU 時(shí)選擇 GPU 為目標(biāo)設(shè)備,否則就默認(rèn)選擇 CPU。



          接下來(lái),我們定義一個(gè)可將數(shù)據(jù)移動(dòng)到所選設(shè)備的函數(shù)。



          最后,我們定義一個(gè) DeviceDataLoader 類(受 FastAI 的啟發(fā))來(lái)封裝我們已有的數(shù)據(jù)加載器并在讀取數(shù)據(jù)批時(shí)將數(shù)據(jù)移動(dòng)到所選設(shè)備。有意思的是,我們不需要擴(kuò)展已有的類來(lái)創(chuàng)建 PyTorch 數(shù)據(jù)加載器。我們只需要用 __iter__ 方法來(lái)檢索數(shù)據(jù)批并使用 __len__ 方法來(lái)獲取批數(shù)量即可。



          我們現(xiàn)在可以使用 DeviceDataLoader 來(lái)封裝我們的數(shù)據(jù)加載器了。



          已被移動(dòng)到 GPU 的 RAM 的張量有一個(gè) device 屬性,其中包含 cuda 這個(gè)詞。我們通過(guò)查看 valid_dl 的一批數(shù)據(jù)來(lái)驗(yàn)證這一點(diǎn)。



          訓(xùn)練模型

           

          和 logistic 回歸一樣,我們可以使用交叉熵作為損失函數(shù),使用準(zhǔn)確度作為模型的評(píng)估指標(biāo)。訓(xùn)練循環(huán)也是一樣的,所以我們可以復(fù)用前一個(gè)教程的 loss_batch、evaluate 和 fit 函數(shù)。


          loss_batch 函數(shù)計(jì)算的是一批數(shù)據(jù)的損失和指標(biāo)值,并且如果提供了優(yōu)化器就可選擇執(zhí)行梯度下降。



          evaluate 函數(shù)是為驗(yàn)證集計(jì)算整體損失(如果有,還計(jì)算一個(gè)指標(biāo))。



          和之前教程中定義的一樣,fit 函數(shù)包含實(shí)際的訓(xùn)練循環(huán)。我們將對(duì) fit 函數(shù)進(jìn)行一些改進(jìn):


          • 我們沒(méi)有人工地定義優(yōu)化器,而是將傳入學(xué)習(xí)率并在該函數(shù)中創(chuàng)建一個(gè)優(yōu)化器。這讓我們?cè)谟行枰獣r(shí)能以不同的學(xué)習(xí)率訓(xùn)練模型。

          • 我們將記錄每 epoch 結(jié)束時(shí)的驗(yàn)證損失和準(zhǔn)確度,并返回這個(gè)歷史作為 fit 函數(shù)的輸出。



          我們還要定義一個(gè) accuracy 函數(shù),其計(jì)算的是模型在整批輸出上的整體準(zhǔn)確度,所以我們可將其用作 fit 中的指標(biāo)。



          在我們訓(xùn)練模型之前,我們需要確保數(shù)據(jù)和模型參數(shù)(權(quán)重和偏置)都在同一設(shè)備上(CPU 或 GPU)。我們可以復(fù)用 to_device 函數(shù)來(lái)將模型參數(shù)移至正確的設(shè)備。



          我們看看使用初始權(quán)重和偏置時(shí),模型在驗(yàn)證集上的表現(xiàn)。



          初始準(zhǔn)確度大約是 10%,這符合我們對(duì)隨機(jī)初始化模型的預(yù)期(其有十分之一的可能性得到正確標(biāo)簽)。


          現(xiàn)在可以開始訓(xùn)練模型了。我們先訓(xùn)練 5 epoch 看看結(jié)果。我們可以使用相對(duì)較高的學(xué)習(xí)率 0.5。



          95% 非常好了!我們?cè)僖愿偷膶W(xué)習(xí)率 0.1 訓(xùn)練 5 epoch,以進(jìn)一步提升準(zhǔn)確度。



          現(xiàn)在我們可以繪制準(zhǔn)確度圖表,看看模型隨時(shí)間的提升情況。



          我們當(dāng)前的模型極大地優(yōu)于 logistic 模型(僅能達(dá)到約 86% 的準(zhǔn)確度)!它很快就達(dá)到了 96% 的準(zhǔn)確度,但沒(méi)能實(shí)現(xiàn)進(jìn)一步提升。如果要進(jìn)一步提升準(zhǔn)確度,我們需要讓模型更加強(qiáng)大。你可能也已經(jīng)猜到了,通過(guò)增大隱藏層的規(guī)模或添加更多隱藏層可以實(shí)現(xiàn)這一目標(biāo)。

           

          提交和上傳筆記


          最后,我們可以使用 jovian 庫(kù)保存和提交我們的成果。



          jovian 會(huì)將筆記上傳到 https://jvn.io,并會(huì)獲取其 Python 環(huán)境并為該筆記創(chuàng)建一個(gè)可分享的鏈接。你可以使用該鏈接共享你的成果,讓任何人都能使用 jovian 克隆命令輕松復(fù)現(xiàn)它。jovian 還有一個(gè)強(qiáng)大的評(píng)論接口,讓你和其他人都能討論和點(diǎn)評(píng)你的筆記的各個(gè)部分。


          總結(jié)與進(jìn)階閱讀


          本教程涵蓋的主題總結(jié)如下:


          • 我們創(chuàng)建了一個(gè)帶有一個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò),以在前一個(gè)教程的 logistic 回歸模型基礎(chǔ)上實(shí)現(xiàn)進(jìn)一步提升。

          • 我們使用了 ReLU 激活函數(shù)來(lái)引入非線性,讓模型可以學(xué)習(xí)輸入和輸出之間的更復(fù)雜的關(guān)系。

          • 我們定義了 get_default_device、to_device 和 DeviceDataLoader 等一些實(shí)用程序,以便在可使用 GPU 時(shí)利用它,并將輸入數(shù)據(jù)和模型參數(shù)移動(dòng)到合適的設(shè)備。

          • 我們可以使用我們之前定義的同樣的訓(xùn)練循環(huán):fit 函數(shù),來(lái)訓(xùn)練我們的模型以及在驗(yàn)證數(shù)據(jù)集上評(píng)估它。


          其中有很多可以實(shí)驗(yàn)的地方,我建議你使用 Jupyter 的交互性質(zhì)試試各種不同的參數(shù)。這里有一些想法:


          • 試試修改隱藏層的大小或添加更多隱藏層,看你能否實(shí)現(xiàn)更高的準(zhǔn)確度。

          • 試試修改批大小和學(xué)習(xí)率,看你能否用更少的 epoch 實(shí)現(xiàn)同樣的準(zhǔn)確度。

          • 比較在 CPU 和 GPU 上的訓(xùn)練時(shí)間。你看到存在顯著差異嗎?數(shù)據(jù)集的大小和模型的大?。?quán)重和參數(shù)的數(shù)量)對(duì)其有何影響?

          • 試試為不同的數(shù)據(jù)集構(gòu)建模型,比如 CIFAR10 或 CIFAR100 數(shù)據(jù)集。


          最后,分享一些適合進(jìn)一步學(xué)習(xí)的好資源:


          • 神經(jīng)網(wǎng)絡(luò)可以計(jì)算任何函數(shù)的視覺(jué)式證明,也被稱為通用近似定理:http://neuralnetworksanddeeplearning.com/chap4.html

          • 神經(jīng)網(wǎng)絡(luò)究竟是什么?——通過(guò)視覺(jué)和直觀的介紹解釋了神經(jīng)網(wǎng)絡(luò)以及中間層所表示的內(nèi)容:https://www.youtube.com/watch?v=aircAruvnKk

          • 斯坦福大學(xué) CS229 關(guān)于反向傳播的講義——更數(shù)學(xué)地解釋了多層神經(jīng)網(wǎng)絡(luò)計(jì)算梯度和更新權(quán)重的方式:http://cs229.stanford.edu/notes/cs229-notes-backprop.pdf

          • 吳恩達(dá)的 Coursera 課程:關(guān)于激活函數(shù)的視頻課程:https://www.coursera.org/lecture/neural-networks-deep-learning/activation-functions-4dDC1

          好消息!

          小白學(xué)視覺(jué)知識(shí)星球

          開始面向外開放啦??????




          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~



          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费人妻视频 | 欧美精品成人HD | 欧美特黄一级视频 | 操比视频在线观看 | 人人摸人人操人人操看 |