1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        你訓(xùn)練的神經(jīng)網(wǎng)絡(luò)不對(duì)頭的37個(gè)原因

        共 4811字,需瀏覽 10分鐘

         ·

        2022-05-16 08:15

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

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

        導(dǎo)讀

        大家都遇到過這種情況,訓(xùn)練的時(shí)候沒什么問題,測(cè)試的時(shí)候就不對(duì)勁了,想找問題,感覺無(wú)處入手,那么今天,給你37個(gè)建議,看看再說吧。

        這個(gè)網(wǎng)絡(luò)在過去12個(gè)小時(shí)中一直在進(jìn)行訓(xùn)練。一切看起來(lái)都很好:梯度在流動(dòng),損失在降低。但是接下來(lái)的預(yù)測(cè)結(jié)果是:所有都是0,所有都是背景,沒有檢測(cè)到任何東西?!拔易鲥e(cuò)了什么?”—我問我的電腦,電腦沒睬我。

        你從哪里開始檢查你的模型是否正在輸出垃圾(例如預(yù)測(cè)所有輸出的平均值,或者它的準(zhǔn)確性非常差)?

        由于一些原因,網(wǎng)絡(luò)可能不會(huì)進(jìn)行訓(xùn)練。在許多調(diào)試的過程中,我經(jīng)常發(fā)現(xiàn)自己在執(zhí)行相同的檢查。我把我的經(jīng)驗(yàn)和最好的想法整理在這個(gè)方便的列表里。我希望它們對(duì)你也有用。

        0. 如何使用這個(gè)指南?

        很多事情都可能出錯(cuò)。但其中一些更有可能出現(xiàn)問題。我通常以這張簡(jiǎn)短的清單作為緊急第一反應(yīng):

        1. 從一個(gè)已知對(duì)這類數(shù)據(jù)有效的簡(jiǎn)單模型開始(例如,圖像的VGG)。如果可能的話,使用標(biāo)準(zhǔn)的損失。

        1. 關(guān)閉所有花哨的功能,例如正則化和數(shù)據(jù)擴(kuò)充。

        1. 如果對(duì)模型進(jìn)行finetune,請(qǐng)仔細(xì)檢查預(yù)處理,因?yàn)轭A(yù)處理應(yīng)該與原始模型的訓(xùn)練相同。

        1. 驗(yàn)證輸入數(shù)據(jù)是否正確。

        1. 從一個(gè)很小的數(shù)據(jù)集(2-20個(gè)樣本)開始。對(duì)其進(jìn)行過擬合,并逐漸添加更多數(shù)據(jù)。

        1. 開始逐步添加所有遺漏的部分:增強(qiáng)/正則化,自定義損失函數(shù),嘗試更復(fù)雜的模型。

        如果上面的步驟沒有什么用,那么就從下面的列表開始,逐一驗(yàn)證。


        I. 數(shù)據(jù)集的問題

        1. 檢查你的輸入數(shù)據(jù)

        檢查你正在向網(wǎng)絡(luò)提供的輸入數(shù)據(jù)是否有意義。例如,我不止一次地搞混了圖像的寬度和高度。有時(shí),我會(huì)不小心把輸入全部搞成了0?;蛘呶視?huì)反復(fù)的使用相同batch。因此,打印/顯示兩個(gè)batch的輸入和目標(biāo)輸出,并確保它們是正確的。

        2. 嘗試隨機(jī)的輸入

        嘗試傳遞隨機(jī)數(shù)而不是實(shí)際數(shù)據(jù),看看錯(cuò)誤的現(xiàn)象是否相同。如果是的話,這是一個(gè)確定的信號(hào),表明你的網(wǎng)絡(luò)在某個(gè)時(shí)候正在把數(shù)據(jù)變成垃圾。試著一層一層地調(diào)試看看哪里出錯(cuò)了。

        3. 檢查你的數(shù)據(jù)加載

        你的數(shù)據(jù)可能沒有問題,但是將輸入傳遞到網(wǎng)絡(luò)的代碼可能會(huì)有問題。在任何操作之前打印第一層的輸入并檢查它。

        4. 確保輸入連接到了輸出

        檢查一些輸入樣本的標(biāo)簽是否正確。還要確保對(duì)輸入樣本的變換對(duì)輸出標(biāo)簽的作用是相同的。

        5. 輸入和輸出之間的關(guān)系是不是太隨機(jī)了?

        也許輸入和輸出之間關(guān)系的非隨機(jī)部分與隨機(jī)部分相比太小了(有人可能會(huì)說股票價(jià)格是這樣的)。也就是說,輸入與輸出的關(guān)系并不充分。由于這取決于數(shù)據(jù)的性質(zhì),因此沒有一種通用的方法來(lái)檢測(cè)這一點(diǎn)。

        6. 數(shù)據(jù)集中是否有太多的噪聲?

        有一次,當(dāng)我從一個(gè)食品網(wǎng)站上抓取圖像數(shù)據(jù)集時(shí),這種情況發(fā)生在我身上。有太多不好的標(biāo)簽,網(wǎng)絡(luò)無(wú)法學(xué)習(xí)。手動(dòng)檢查一些輸入樣本,看看標(biāo)簽是不是正確。

        噪聲的截止點(diǎn)有待討論,因?yàn)楸疚脑谑褂?0%損壞標(biāo)簽的MNIST上獲得了超過50%的準(zhǔn)確性。

        7. 打亂數(shù)據(jù)集

        如果你的數(shù)據(jù)集沒有被打亂,并且有一個(gè)特定的順序(按標(biāo)簽排序),這可能會(huì)對(duì)學(xué)習(xí)產(chǎn)生負(fù)面的影響。打亂你的數(shù)據(jù)集,以避免這種情況。確保你在進(jìn)行打亂的時(shí)候,是把輸入和標(biāo)簽一起打亂的。

        8. 減少類別的不均衡

        每一個(gè)類別B的圖像就有1000個(gè)類別A的圖像?你可能需要平衡損失函數(shù)或嘗試其他類別不平衡的方法。

        9. 你有足夠的訓(xùn)練樣本嗎?

        如果你正在從頭開始訓(xùn)練一個(gè)網(wǎng)絡(luò),你可能需要大量的數(shù)據(jù)。對(duì)于圖像分類,人們說每個(gè)類需要1000個(gè)或更多的圖像。

        10. 確保你的batch里不只包含同一個(gè)標(biāo)簽

        這可能發(fā)生在排過序的數(shù)據(jù)集中(即前10k個(gè)樣本包含相同的類)。通過打亂數(shù)據(jù)集很容易修復(fù)。

        11. 減少batch size

        這篇文章指出大的batch size會(huì)降低模型的泛化能力。

        附加1. 使用標(biāo)準(zhǔn)的數(shù)據(jù)集(如mnist, cifar10 )

        在測(cè)試新網(wǎng)絡(luò)架構(gòu)或編寫新代碼時(shí),首先使用標(biāo)準(zhǔn)數(shù)據(jù)集,而不是你自己的數(shù)據(jù)。這是因?yàn)檫@些數(shù)據(jù)集有很多參考結(jié)果,而且它們被證明是“可解的”。不會(huì)出現(xiàn)標(biāo)簽噪聲、訓(xùn)練/測(cè)試分布差異、數(shù)據(jù)集難度過大等問題。


        II. 數(shù)據(jù)歸一化/增強(qiáng)

        12. 特征標(biāo)準(zhǔn)化

        你是否標(biāo)準(zhǔn)化了你的輸入使其均值和單位方差為零?

        13. 你是不是用了太多的數(shù)據(jù)增強(qiáng)?

        增強(qiáng)具有規(guī)律性的效果。太多的這些與其他形式的正則化(權(quán)值的L2,dropout等等)結(jié)合在一起會(huì)導(dǎo)致網(wǎng)絡(luò)欠擬合。

        14. 檢查你的預(yù)訓(xùn)練模型的預(yù)處理

        如果你使用的是預(yù)訓(xùn)練模型,請(qǐng)確保你使用的歸一化和預(yù)處理與訓(xùn)練時(shí)的模型相同。例如,圖像像素應(yīng)該在[0,1]、[- 1,1]還是[0,255]范圍內(nèi)?

        15. 檢查訓(xùn)練/驗(yàn)證/測(cè)試集的預(yù)處理

        CS231n指出了一個(gè)常見的陷阱:

        “……任何預(yù)處理統(tǒng)計(jì)數(shù)據(jù)(例如數(shù)據(jù)平均值)必須僅對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行計(jì)算,然后應(yīng)用于驗(yàn)證/測(cè)試數(shù)據(jù)。”例如,計(jì)算平均值并從整個(gè)數(shù)據(jù)集中的每幅圖像中減去它,然后將數(shù)據(jù)分割為train/val/test分割是錯(cuò)誤的。"

        同時(shí),檢查每個(gè)樣本或batch的預(yù)處理的不同之處。


        III. 實(shí)現(xiàn)中的問題


        16.嘗試解決這個(gè)問題的更簡(jiǎn)單的版本的問題

        這將有助于找到問題所在。例如,如果目標(biāo)輸出是物體的類別和坐標(biāo),請(qǐng)嘗試只預(yù)測(cè)物體的類別。

        17.看看“隨機(jī)”時(shí)候的正確的損失

        再次來(lái)自優(yōu)秀的CS231n:使用小參數(shù)進(jìn)行初始化,沒有正則化。例如,如果我們有10個(gè)類,在隨機(jī)的情況下意味著我們將有10%的時(shí)候會(huì)得到正確的類,Softmax損失是正確類的概率的負(fù)對(duì)數(shù),因此:-ln(0.1) = 2.302.

        在此之后,試著增加正則化強(qiáng)度,這會(huì)增加損失。

        18. 檢查你的損失函數(shù)

        如果你實(shí)現(xiàn)了自己的loss函數(shù),那么檢查它的bug并添加單元測(cè)試。通常,我自己寫的損失可能是不正確的,并以一種微妙的方式損害了網(wǎng)絡(luò)的性能。

        19. 驗(yàn)證損失的輸入

        如果你使用的是框架提供的loss函數(shù),請(qǐng)確保你傳遞給它的是它所期望的。例如,在PyTorch中,我會(huì)混淆NLLLoss和CrossEntropyLoss,因?yàn)榍罢咝枰猻oftmax輸入,而后者不需要。

        20. 調(diào)整損失的權(quán)重

        如果你的損失由幾個(gè)較小的損失函數(shù)組成,請(qǐng)確保它們相對(duì)于每個(gè)損失函數(shù)的大小是正確的。這可能涉及測(cè)試不同的損失權(quán)重組合。

        21. 使用其他的度量方法進(jìn)行監(jiān)控

        有時(shí)候,損失并不能很好地預(yù)測(cè)你的網(wǎng)絡(luò)是否訓(xùn)練的好。如果可以,使用其他指標(biāo),如準(zhǔn)確性。

        22. 測(cè)試所有的自定義的層

        你自己實(shí)現(xiàn)了網(wǎng)絡(luò)中的一些層嗎?反復(fù)檢查以確保它們按照預(yù)期工作。

        23. 檢查“凍結(jié)”的層和變量

        檢查你是否無(wú)意中禁用了一些層/變量的梯度的更新。

        24. 增加網(wǎng)絡(luò)的大小

        也許你的網(wǎng)絡(luò)的表達(dá)能力不足以得到目標(biāo)函數(shù)。嘗試在全連接的層中添加更多的層或更多的隱藏單元。

        25. 檢查隱藏維度的錯(cuò)誤

        如果你的輸入看起來(lái)像(k, H, W) =(64, 64, 64)那么很容易忽略與錯(cuò)誤維度相關(guān)的錯(cuò)誤。對(duì)輸入維度使用奇怪的數(shù)字(例如,每個(gè)維度使用不同的素?cái)?shù)),并檢查它們?nèi)绾卧诰W(wǎng)絡(luò)中傳播。

        26. 梯度檢查

        如果你手動(dòng)實(shí)現(xiàn)梯度下降,檢查梯度,確保你的反向傳播工作正常。


        IV. 訓(xùn)練問題


        27. 處理小數(shù)據(jù)集

        過擬合數(shù)據(jù)的一個(gè)子集,并確保它能工作。例如,用一兩個(gè)樣本來(lái)訓(xùn)練,看看你的網(wǎng)絡(luò)是否能學(xué)會(huì)區(qū)分它們。再繼續(xù)使用每個(gè)類的更多樣本。

        28. 檢查權(quán)值初始化

        如果不確定的話,使用Xavier或He初始化。另外,初始化可能會(huì)導(dǎo)致錯(cuò)誤的局部最小值,所以嘗試不同的初始化,看看是否有幫助。

        29. 改變你的超參數(shù)

        也許你使用了一組特別糟糕的超參數(shù)。如果可行,嘗試網(wǎng)格搜索。

        30. 減少正則化

        過多的正則化會(huì)導(dǎo)致網(wǎng)絡(luò)嚴(yán)重欠擬合。減少正規(guī)化,如dropout、、權(quán)重/偏置L2正規(guī)化等。在優(yōu)秀的“Practical Deep Learning for coders”課程中,Jeremy Howard建議首先擺脫欠擬合。這意味著你需要對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行充分的過擬合,然后再解決過擬合問題。

        31. 多給點(diǎn)時(shí)間

        也許你的網(wǎng)絡(luò)需要更多的時(shí)間來(lái)訓(xùn)練,才能開始做出有意義的預(yù)測(cè)。如果你的損失在穩(wěn)步減少,那就讓它繼續(xù)訓(xùn)練吧。

        32. 從訓(xùn)練模式切換到測(cè)試模式

        有些框架具有Batch Norm、drop等層,在訓(xùn)練和測(cè)試期間的行為有所不同。切換到適當(dāng)?shù)哪J娇赡苡兄谀愕木W(wǎng)絡(luò)進(jìn)行正確的預(yù)測(cè)。

        33. 訓(xùn)練可視化

        • 監(jiān)控每一層的激活值、權(quán)重和更新。確保它們大小匹配。例如,參數(shù)更新的大小(權(quán)重和偏差)應(yīng)該是1-e3。

        • 考慮一個(gè)可視化庫(kù),比如Tensorboard和Crayon。必要時(shí),你還可以打印權(quán)重/偏置/激活值。

        • 尋找平均值比0大得多的層激活。嘗試 Batch Norm或ELUs。

        • Deeplearning4j指出在權(quán)重和偏差直方圖中應(yīng)該能看到:

        對(duì)于權(quán)值,這些直方圖在一段時(shí)間后應(yīng)該有一個(gè)近似的高斯分布。對(duì)于偏置,這些直方圖通常從0開始,通常以近似高斯分布結(jié)束(LSTM是一個(gè)例外)。注意那些發(fā)散到+/-∞的參數(shù)。留意那些變得很大的偏置。如果類的分布非常不平衡,這種情況有時(shí)會(huì)發(fā)生在分類的輸出層。

        • 檢查層的更新,他們應(yīng)該是一個(gè)高斯分布。

        34. 嘗試不同的優(yōu)化器

        你選擇的優(yōu)化器不應(yīng)該會(huì)導(dǎo)致你的網(wǎng)絡(luò)不訓(xùn)練,除非你選擇了特別糟糕的超參數(shù)。然而,對(duì)于一個(gè)任務(wù),適當(dāng)?shù)膬?yōu)化器可以幫助在最短的時(shí)間內(nèi)獲得最多的訓(xùn)練。你正在使用的算法的論文中應(yīng)該會(huì)指定優(yōu)化器。如果不是,我傾向于使用Adam或使用動(dòng)量的SGD。

        查看Sebastian Ruder的excellent post了解更多關(guān)于梯度下降優(yōu)化器的信息。

        35. 梯度爆炸/消失

        • 檢查層的更新,因?yàn)楹艽蟮闹悼梢詫?dǎo)致梯度爆炸。梯度剪裁可能會(huì)有所幫助。

        • 檢查層的激活。來(lái)自Deeplearning4j的是一條很好的指導(dǎo)方針:“一個(gè)好的激活值的標(biāo)準(zhǔn)差在0.5到2.0之間。顯著地超出這個(gè)范圍可能意味著激活值的消失或爆炸”

        36. 增大/降低學(xué)習(xí)率

        較低的學(xué)習(xí)率會(huì)導(dǎo)致模型非常緩慢地收斂。

        高學(xué)習(xí)率將在開始時(shí)迅速減少損失,但可能很難找到一個(gè)好的解決方案。

        把你當(dāng)前的學(xué)習(xí)速度乘以0.1或10。

        37. 克服NaNs

        在訓(xùn)練RNN時(shí),獲得NaN (Non-a-Number)是一個(gè)更大的問題。一些解決方法:

        • 降低學(xué)習(xí)速率,特別是在前100次迭代中獲得NaNs時(shí)。

        • NaNs可以由除以0或ln(0)或負(fù)數(shù)得到。

        • Russell Stewart有很多關(guān)于如何處理NaNs的建議(http://russellsstewart.com/notes/0.html)。

        • 嘗試逐層評(píng)估你的網(wǎng)絡(luò),并查看NaNs出現(xiàn)在哪里。

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

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

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號(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、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~




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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲AV成人片无码www网站 | 伸进内衣揉捏她的乳尖 | 日皮视频在线 | 潘金莲1一5集三级 | 欧美激情2 | 亚洲色图一区二区三区 | 特黄60分钟免费看片 | 中国美女操逼的视频 | 亚洲视频成人 | 初次粉嫩蹂躏哭喊求饶小说 |