91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

最常見的4個神經(jīng)網(wǎng)絡(luò)錯誤是什么?

深度學(xué)習(xí)自然語言處理 ? 來源:AI公園 ? 作者:Yuval Greenfield ? 2020-11-27 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最常見的神經(jīng)網(wǎng)絡(luò)錯誤:

1)你沒有首先嘗試過擬合單個batch。

2)你忘了為網(wǎng)絡(luò)設(shè)置train/eval模式。

3)在.backward()之前忘記了.zero_grad()(在pytorch中)。

4)將softmaxed輸出傳遞給了期望原始logits的損失,還有其他嗎?

這篇文章將逐點分析這些錯誤是如何在PyTorch代碼示例中體現(xiàn)出來的。

代碼:https://github.com/missinglinkai/common-nn-mistakes

常見錯誤 #1 你沒有首先嘗試過擬合單個batch

Andrej說我們應(yīng)該過擬合單個batch。為什么?好吧,當(dāng)你過擬合了單個batch —— 你實際上是在確保模型在工作。我不想在一個巨大的數(shù)據(jù)集上浪費了幾個小時的訓(xùn)練時間,只是為了發(fā)現(xiàn)因為一個小錯誤,它只有50%的準(zhǔn)確性。當(dāng)你的模型完全記住輸入時,你會得到的結(jié)果是對其最佳表現(xiàn)的很好的預(yù)測。

可能最佳表現(xiàn)為零,因為在執(zhí)行過程中拋出了一個異常。但這沒關(guān)系,因為我們很快就能發(fā)現(xiàn)問題并解決它。總結(jié)一下,為什么你應(yīng)該從數(shù)據(jù)集的一個小子集開始過擬合:

發(fā)現(xiàn)bug

估計最佳的可能損失和準(zhǔn)確率

快速迭代

在PyTorch數(shù)據(jù)集中,你通常在dataloader上迭代。你的第一個嘗試可能是索引train_loader。

#TypeError:'DataLoader'objectdoesnotsupportindexing first_batch=train_loader[0]

你會立即看到一個錯誤,因為DataLoaders希望支持網(wǎng)絡(luò)流和其他不需要索引的場景。所以沒有__getitem__方法,這導(dǎo)致了[0]操作失敗,然后你會嘗試將其轉(zhuǎn)換為list,這樣就可以支持索引。

#slow,wasteful first_batch=list(train_loader)[0]

但這意味著你要評估整個數(shù)據(jù)集這會消耗你的時間和內(nèi)存。那么我們還能嘗試什么呢?

Python for循環(huán)中,當(dāng)你輸入如下:

foriteminiterable: do_stuff(item)

你有效地得到了這個:

iterator=iter(iterable) try: whileTrue: item=next(iterator) do_stuff(item) exceptStopIteration: pass

調(diào)用“iter”函數(shù)來創(chuàng)建迭代器,然后在循環(huán)中多次調(diào)用該函數(shù)的“next”來獲取下一個條目。直到我們完成時,StopIteration被觸發(fā)。在這個循環(huán)中,我們只需要調(diào)用next, next, next… 。為了模擬這種行為但只獲取第一項,我們可以使用這個:

first=next(iter(iterable))

我們調(diào)用“iter”來獲得迭代器,但我們只調(diào)用“next”函數(shù)一次。注意,為了清楚起見,我將下一個結(jié)果分配到一個名為“first”的變量中。我把這叫做“next-iter” trick。在下面的代碼中,你可以看到完整的train data loader的例子:

forbatch_idx,(data,target)inenumerate(train_loader): #trainingcodehere

下面是如何修改這個循環(huán)來使用 first-iter trick :

first_batch=next(iter(train_loader)) forbatch_idx,(data,target)inenumerate([first_batch]*50): #trainingcodehere

你可以看到我將“first_batch”乘以了50次,以確保我會過擬合。

常見錯誤 #2: 忘記為網(wǎng)絡(luò)設(shè)置 train/eval 模式

為什么PyTorch關(guān)注我們是訓(xùn)練還是評估模型?最大的原因是dropout。這項技術(shù)在訓(xùn)練中隨機去除神經(jīng)元。

想象一下,如果右邊的紅色神經(jīng)元是唯一促成正確結(jié)果的神經(jīng)元。一旦我們移除紅色神經(jīng)元,它就迫使其他神經(jīng)元訓(xùn)練和學(xué)習(xí)如何在沒有紅色的情況下保持準(zhǔn)確。這種drop-out提高了最終測試的性能 —— 但它對訓(xùn)練期間的性能產(chǎn)生了負(fù)面影響,因為網(wǎng)絡(luò)是不全的。在運行腳本并查看MissingLink dashobard的準(zhǔn)確性時,請記住這一點。

在這個特定的例子中,似乎每50次迭代就會降低準(zhǔn)確度。

如果我們檢查一下代碼 —— 我們看到確實在train函數(shù)中設(shè)置了訓(xùn)練模式。

deftrain(model,optimizer,epoch,train_loader,validation_loader): model.train()#???????????? forbatch_idx,(data,target)inexperiment.batch_loop(iterable=train_loader): data,target=Variable(data),Variable(target) #Inference output=model(data) loss_t=F.nll_loss(output,target) #Theiconicgrad-back-steptrio optimizer.zero_grad() loss_t.backward() optimizer.step() ifbatch_idx%args.log_interval==0: train_loss=loss_t.item() train_accuracy=get_correct_count(output,target)*100.0/len(target) experiment.add_metric(LOSS_METRIC,train_loss) experiment.add_metric(ACC_METRIC,train_accuracy) print('TrainEpoch:{}[{}/{}({:.0f}%)] Loss:{:.6f}'.format( epoch,batch_idx,len(train_loader), 100.*batch_idx/len(train_loader),train_loss)) withexperiment.validation(): val_loss,val_accuracy=test(model,validation_loader)#???????????? experiment.add_metric(LOSS_METRIC,val_loss) experiment.add_metric(ACC_METRIC,val_accuracy)

這個問題不太容易注意到,在循環(huán)中我們調(diào)用了test函數(shù)。

deftest(model,test_loader): model.eval() #...

在test函數(shù)內(nèi)部,我們將模式設(shè)置為eval!這意味著,如果我們在訓(xùn)練過程中調(diào)用了test函數(shù),我們就會進(jìn)eval模式,直到下一次train函數(shù)被調(diào)用。這就導(dǎo)致了每一個epoch中只有一個batch使用了drop-out ,這就導(dǎo)致了我們看到的性能下降。

修復(fù)很簡單 —— 我們將model.train()向下移動一行,讓如訓(xùn)練循環(huán)中。理想的模式設(shè)置是盡可能接近推理步驟,以避免忘記設(shè)置它。修正后,我們的訓(xùn)練過程看起來更合理,沒有中間的峰值出現(xiàn)。請注意,由于使用了drop-out ,訓(xùn)練準(zhǔn)確性會低于驗證準(zhǔn)確性。

常用的錯誤 #3: 忘記在.backward()之前進(jìn)行.zero_grad()

當(dāng)在 “l(fā)oss”張量上調(diào)用 “backward” 時,你是在告訴PyTorch從loss往回走,并計算每個權(quán)重對損失的影響有多少,也就是這是計算圖中每個節(jié)點的梯度。使用這個梯度,我們可以最優(yōu)地更新權(quán)值。

這是它在PyTorch代碼中的樣子。最后的“step”方法將根據(jù)“backward”步驟的結(jié)果更新權(quán)重。從這段代碼中可能不明顯的是,如果我們一直在很多個batch上這么做,梯度會爆炸,我們使用的step將不斷變大。

output=model(input)#forward-pass loss_fn.backward()#backward-pass optimizer.step()#updateweightsbyanevergrowinggradient????????????

為了避免step變得太大,我們使用zero_grad方法。

output=model(input)#forward-pass optimizer.zero_grad()#resetgradient???? loss_fn.backward()#backward-pass optimizer.step()#updateweightsusingareasonablysizedgradient????

這可能感覺有點過于明顯,但它確實賦予了對梯度的精確控制。有一種方法可以確保你沒有搞混,那就是把這三個函數(shù)放在一起:

zero_grad

backward

step

在我們的代碼例子中,在完全不使用zero_grad的情況下。神經(jīng)網(wǎng)絡(luò)開始變得更好,因為它在改進(jìn),但梯度最終會爆炸,所有的更新變得越來越垃圾,直到網(wǎng)絡(luò)最終變得無用。

調(diào)用backward之后再做zero_grad。什么也沒有發(fā)生,因為我們擦掉了梯度,所以權(quán)重沒有更新。剩下的唯一有變化的是dropout。

我認(rèn)為在每次step方法被調(diào)用時自動重置梯度是有意義的。

在backward的時候不使用zero_grad的一個原因是,如果你每次調(diào)用step()時都要多次調(diào)用backward,例如,如果你每個batch只能將一個樣本放入內(nèi)存中,那么一個梯度會噪聲太大,你想要在每個step中聚合幾個batch的梯度。另一個原因可能是在計算圖的不同部分調(diào)用backward—— 但在這種情況下,你也可以把損失加起來,然后在總和上調(diào)用backward。

常見錯誤 #4: 你把做完softmax的結(jié)果送到了需要原始logits的損失函數(shù)中

logits是最后一個全連接層的激活值。softmax也是同樣的激活值,但是經(jīng)過了標(biāo)準(zhǔn)化。logits值,你可以看到有些是正的,一些是負(fù)的。而log_softmax之后的值,全是負(fù)值。如果看柱狀圖的話,可以看到分布式一樣的,唯一的差別就是尺度,但就是這個細(xì)微的差別,導(dǎo)致最后的數(shù)學(xué)計算完全不一樣了。但是為什么這是一個常見的錯誤呢?在PyTorch的官方MNIST例子中,查看forward方法,在最后你可以看到最后一個全連接層self.fc2,然后就是log_softmax。

但是當(dāng)你查看官方的PyTorch resnet或者AlexNet模型的時候,你會發(fā)現(xiàn)這些模型在最后并沒有softmax層,最后得到就是全連接的輸出,就是logits。

這兩個的差別在文檔中沒有說的很清楚。如果你查看nll_loss函數(shù),并沒有提得輸入是logits還是softmax,你的唯一希望是在示例代碼中發(fā)現(xiàn)nll_loss使用了log_softmax作為輸入。

原文標(biāo)題:收藏 | 使用PyTorch時,最常見的4個錯誤

文章出處:【微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4838

    瀏覽量

    107753
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    813

    瀏覽量

    14850

原文標(biāo)題:收藏 | 使用PyTorch時,最常見的4個錯誤

文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    神經(jīng)網(wǎng)絡(luò)的初步認(rèn)識

    日常生活中的智能應(yīng)用都離不開深度學(xué)習(xí),而深度學(xué)習(xí)則依賴于神經(jīng)網(wǎng)絡(luò)的實現(xiàn)。什么是神經(jīng)網(wǎng)絡(luò)?神經(jīng)網(wǎng)絡(luò)的核心思想是模仿生物神經(jīng)系統(tǒng)的結(jié)構(gòu),特別是大腦中神經(jīng)
    的頭像 發(fā)表于 12-17 15:05 ?323次閱讀
    <b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的初步認(rèn)識

    自動駕駛中常提的卷積神經(jīng)網(wǎng)絡(luò)啥?

    在自動駕駛領(lǐng)域,經(jīng)常會聽到卷積神經(jīng)網(wǎng)絡(luò)技術(shù)。卷積神經(jīng)網(wǎng)絡(luò),簡稱為CNN,是一種專門用來處理網(wǎng)格狀數(shù)據(jù)(比如圖像)的深度學(xué)習(xí)模型。CNN在圖像處理中尤其常見,因為圖像本身就可以看作是由像素排列成的二維網(wǎng)格。
    的頭像 發(fā)表于 11-19 18:15 ?2072次閱讀
    自動駕駛中常提的卷積<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>是<b class='flag-5'>個</b>啥?

    NMSIS神經(jīng)網(wǎng)絡(luò)庫使用介紹

    (q7_t) 和 16 位整數(shù) (q15_t)。 卷積神經(jīng)網(wǎng)絡(luò)示例: 本示例中使用的 CNN 基于來自 Caffe 的 CIFAR-10 示例。神經(jīng)網(wǎng)絡(luò)由 3 卷積層組成,中間散布著 ReLU
    發(fā)表于 10-29 06:08

    構(gòu)建CNN網(wǎng)絡(luò)模型并優(yōu)化的一般化建議

    通過實踐,本文總結(jié)了構(gòu)建CNN網(wǎng)絡(luò)模型并優(yōu)化的一般化建議,這些建議將會在構(gòu)建高準(zhǔn)確率輕量級CNN神經(jīng)網(wǎng)絡(luò)模型方面提供幫助。 1)避免單層神經(jīng)網(wǎng)絡(luò):我們清楚神經(jīng)網(wǎng)絡(luò)本身是需要不斷抽象出
    發(fā)表于 10-28 08:02

    在Ubuntu20.04系統(tǒng)中訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的一些經(jīng)驗

    本帖欲分享在Ubuntu20.04系統(tǒng)中訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的一些經(jīng)驗。我們采用jupyter notebook作為開發(fā)IDE,以TensorFlow2為訓(xùn)練框架,目標(biāo)是訓(xùn)練一手寫數(shù)字識別的神經(jīng)網(wǎng)絡(luò)
    發(fā)表于 10-22 07:03

    CICC2033神經(jīng)網(wǎng)絡(luò)部署相關(guān)操作

    在完成神經(jīng)網(wǎng)絡(luò)量化后,需要將神經(jīng)網(wǎng)絡(luò)部署到硬件加速器上。首先需要將所有權(quán)重數(shù)據(jù)以及輸入數(shù)據(jù)導(dǎo)入到存儲器內(nèi)。 在仿真環(huán)境下,可將其存于一文件,并在 Verilog 代碼中通過 readmemh 函數(shù)
    發(fā)表于 10-20 08:00

    液態(tài)神經(jīng)網(wǎng)絡(luò)(LNN):時間連續(xù)性與動態(tài)適應(yīng)性的神經(jīng)網(wǎng)絡(luò)

    1.算法簡介液態(tài)神經(jīng)網(wǎng)絡(luò)(LiquidNeuralNetworks,LNN)是一種新型的神經(jīng)網(wǎng)絡(luò)架構(gòu),其設(shè)計理念借鑒自生物神經(jīng)系統(tǒng),特別是秀麗隱桿線蟲的神經(jīng)結(jié)構(gòu),盡管這種微生物的
    的頭像 發(fā)表于 09-28 10:03 ?1198次閱讀
    液態(tài)<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>(LNN):時間連續(xù)性與動態(tài)適應(yīng)性的<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>

    神經(jīng)網(wǎng)絡(luò)的并行計算與加速技術(shù)

    隨著人工智能技術(shù)的飛速發(fā)展,神經(jīng)網(wǎng)絡(luò)在眾多領(lǐng)域展現(xiàn)出了巨大的潛力和廣泛的應(yīng)用前景。然而,神經(jīng)網(wǎng)絡(luò)模型的復(fù)雜度和規(guī)模也在不斷增加,這使得傳統(tǒng)的串行計算方式面臨著巨大的挑戰(zhàn),如計算速度慢、訓(xùn)練時間長等
    的頭像 發(fā)表于 09-17 13:31 ?1124次閱讀
    <b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的并行計算與加速技術(shù)

    基于神經(jīng)網(wǎng)絡(luò)的數(shù)字預(yù)失真模型解決方案

    在基于神經(jīng)網(wǎng)絡(luò)的數(shù)字預(yù)失真(DPD)模型中,使用不同的激活函數(shù)對整個系統(tǒng)性能和能效有何影響?
    的頭像 發(fā)表于 08-29 14:01 ?3471次閱讀

    無刷電機小波神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)子位置檢測方法的研究

    摘要:論文通過對無刷電機數(shù)學(xué)模型的推導(dǎo),得出轉(zhuǎn)角:與三相相電壓之間存在映射關(guān)系,因此構(gòu)建了一以三相相電壓為輸人,轉(zhuǎn)角為輸出的小波神經(jīng)網(wǎng)絡(luò)來實現(xiàn)轉(zhuǎn)角預(yù)測,并采用改進(jìn)遺傳算法來訓(xùn)練網(wǎng)絡(luò)結(jié)構(gòu)與參數(shù),借助
    發(fā)表于 06-25 13:06

    神經(jīng)網(wǎng)絡(luò)專家系統(tǒng)在電機故障診斷中的應(yīng)用

    摘要:針對傳統(tǒng)專家系統(tǒng)不能進(jìn)行自學(xué)習(xí)、自適應(yīng)的問題,本文提出了基于種經(jīng)網(wǎng)絡(luò)專家系統(tǒng)的并步電機故障診斷方法。本文將小波神經(jīng)網(wǎng)絡(luò)和專家系統(tǒng)相結(jié)合,充分發(fā)揮了二者故障診斷的優(yōu)點,很大程度上降低了對電機
    發(fā)表于 06-16 22:09

    神經(jīng)網(wǎng)絡(luò)RAS在異步電機轉(zhuǎn)速估計中的仿真研究

    眾多方法中,由于其結(jié)構(gòu)簡單,穩(wěn)定性好廣泛受到人們的重視,且已被用于產(chǎn)品開發(fā)。但是MRAS仍存在在低速區(qū)速度估計精度下降和對電動機參數(shù)變化非常敏感的問題。本文利用神經(jīng)網(wǎng)絡(luò)的特點,使估計更為簡單、快速
    發(fā)表于 06-16 21:54

    基于FPGA搭建神經(jīng)網(wǎng)絡(luò)的步驟解析

    本文的目的是在一神經(jīng)網(wǎng)絡(luò)已經(jīng)通過python或者M(jìn)ATLAB訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型,將訓(xùn)練好的模型的權(quán)重和偏置文件以TXT文件格式導(dǎo)出,然后通過python程序?qū)xt文件轉(zhuǎn)化為coe文件,(coe
    的頭像 發(fā)表于 06-03 15:51 ?1194次閱讀
    基于FPGA搭建<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的步驟解析

    NVIDIA實現(xiàn)神經(jīng)網(wǎng)絡(luò)渲染技術(shù)的突破性增強功能

    近日,NVIDIA 宣布了 NVIDIA RTX 神經(jīng)網(wǎng)絡(luò)渲染技術(shù)的突破性增強功能。NVIDIA 與微軟合作,將在 4 月的 Microsoft DirectX 預(yù)覽版中增加神經(jīng)網(wǎng)絡(luò)著色技術(shù),讓開
    的頭像 發(fā)表于 04-07 11:33 ?1163次閱讀

    神經(jīng)網(wǎng)絡(luò)壓縮框架 (NNCF) 中的過濾器修剪統(tǒng)計數(shù)據(jù)怎么查看?

    無法觀察神經(jīng)網(wǎng)絡(luò)壓縮框架 (NNCF) 中的過濾器修剪統(tǒng)計數(shù)據(jù)
    發(fā)表于 03-06 07:10