色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

最常見的4個神經網絡錯誤是什么?

深度學習自然語言處理 ? 來源:AI公園 ? 作者:Yuval Greenfield ? 2020-11-27 10:49 ? 次閱讀

最常見的神經網絡錯誤:

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

2)你忘了為網絡設置train/eval模式。

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

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

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

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

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

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

可能最佳表現為零,因為在執行過程中拋出了一個異常。但這沒關系,因為我們很快就能發現問題并解決它。總結一下,為什么你應該從數據集的一個小子集開始過擬合:

發現bug

估計最佳的可能損失和準確率

快速迭代

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

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

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

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

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

Python for循環中,當你輸入如下:

foriteminiterable: do_stuff(item)

你有效地得到了這個:

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

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

first=next(iter(iterable))

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

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

下面是如何修改這個循環來使用 first-iter trick :

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

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

常見錯誤 #2: 忘記為網絡設置 train/eval 模式

為什么PyTorch關注我們是訓練還是評估模型?最大的原因是dropout。這項技術在訓練中隨機去除神經元。

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

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

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

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)

這個問題不太容易注意到,在循環中我們調用了test函數。

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

在test函數內部,我們將模式設置為eval!這意味著,如果我們在訓練過程中調用了test函數,我們就會進eval模式,直到下一次train函數被調用。這就導致了每一個epoch中只有一個batch使用了drop-out ,這就導致了我們看到的性能下降。

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

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

當在 “loss”張量上調用 “backward” 時,你是在告訴PyTorch從loss往回走,并計算每個權重對損失的影響有多少,也就是這是計算圖中每個節點的梯度。使用這個梯度,我們可以最優地更新權值。

這是它在PyTorch代碼中的樣子。最后的“step”方法將根據“backward”步驟的結果更新權重。從這段代碼中可能不明顯的是,如果我們一直在很多個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????

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

zero_grad

backward

step

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

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

我認為在每次step方法被調用時自動重置梯度是有意義的。

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

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

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

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

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

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

文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4771

    瀏覽量

    100720
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13202

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

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    卷積神經網絡與傳統神經網絡的比較

    在深度學習領域,神經網絡模型被廣泛應用于各種任務,如圖像識別、自然語言處理和游戲智能等。其中,卷積神經網絡(CNNs)和傳統神經網絡是兩種常見的模型。 1. 結構差異 1.1 傳統
    的頭像 發表于 11-15 14:53 ?387次閱讀

    RNN模型與傳統神經網絡的區別

    神經網絡是機器學習領域中的一種強大工具,它們能夠模擬人腦處理信息的方式。隨著技術的發展,神經網絡的類型也在不斷增加,其中循環神經網絡(RNN)和傳統神經網絡(如前饋
    的頭像 發表于 11-15 09:42 ?308次閱讀

    如何編寫一BP神經網絡

    傳播過程,即誤差從輸出層反向傳播回輸入層,并據此調整網絡參數。本文將詳細闡述如何編寫一BP神經網絡,包括網絡結構設計、前向傳播、損失函數計算、反向傳播和參數更新等關鍵步驟。
    的頭像 發表于 07-11 16:44 ?545次閱讀

    BP神經網絡和卷積神經網絡的關系

    BP神經網絡(Backpropagation Neural Network)和卷積神經網絡(Convolutional Neural Network,簡稱CNN)是兩種在人工智能和機器學習領域
    的頭像 發表于 07-10 15:24 ?1446次閱讀

    BP神經網絡和人工神經網絡的區別

    BP神經網絡和人工神經網絡(Artificial Neural Networks,簡稱ANNs)之間的關系與區別,是神經網絡領域中一基礎且重要的話題。本文將從定義、結構、算法、應用及
    的頭像 發表于 07-10 15:20 ?1027次閱讀

    rnn是遞歸神經網絡還是循環神經網絡

    RNN(Recurrent Neural Network)是循環神經網絡,而非遞歸神經網絡。循環神經網絡是一種具有時間序列特性的神經網絡,能夠處理序列數據,具有記憶功能。以下是關于循環
    的頭像 發表于 07-05 09:52 ?560次閱讀

    遞歸神經網絡是循環神經網絡

    遞歸神經網絡(Recurrent Neural Network,簡稱RNN)和循環神經網絡(Recurrent Neural Network,簡稱RNN)實際上是同一概念,只是不同的翻譯方式
    的頭像 發表于 07-04 14:54 ?739次閱讀

    循環神經網絡和卷積神經網絡的區別

    結構。它們在處理不同類型的數據和解決不同問題時具有各自的優勢和特點。本文將從多個方面比較循環神經網絡和卷積神經網絡的區別。 基本概念 循環神經網絡是一種具有循環連接的神經網絡結構,它可
    的頭像 發表于 07-04 14:24 ?1271次閱讀

    循環神經網絡和遞歸神經網絡的區別

    處理序列數據方面具有顯著的優勢,但它們在結構和工作原理上存在一些關鍵的區別。 循環神經網絡(RNN) 1.1 RNN的結構 循環神經網絡是一種具有循環連接的神經網絡,其核心思想是將前一
    的頭像 發表于 07-04 14:19 ?892次閱讀

    深度神經網絡與基本神經網絡的區別

    在探討深度神經網絡(Deep Neural Networks, DNNs)與基本神經網絡(通常指傳統神經網絡或前向神經網絡)的區別時,我們需要從多個維度進行深入分析。這些維度包括
    的頭像 發表于 07-04 13:20 ?843次閱讀

    反向傳播神經網絡和bp神經網絡的區別

    反向傳播神經網絡(Backpropagation Neural Network,簡稱BP神經網絡)是一種多層前饋神經網絡,它通過反向傳播算法來調整網絡中的權重和偏置,以達到最小化誤差的
    的頭像 發表于 07-03 11:00 ?791次閱讀

    bp神經網絡是深度神經網絡

    BP神經網絡(Backpropagation Neural Network)是一種常見的前饋神經網絡,它使用反向傳播算法來訓練網絡。雖然BP神經網絡
    的頭像 發表于 07-03 10:14 ?830次閱讀

    bp神經網絡和卷積神經網絡區別是什么

    BP神經網絡(Backpropagation Neural Network)和卷積神經網絡(Convolutional Neural Network,簡稱CNN)是兩種不同類型的人工神經網絡,它們在
    的頭像 發表于 07-03 10:12 ?1164次閱讀

    卷積神經網絡和bp神經網絡的區別

    卷積神經網絡(Convolutional Neural Networks,簡稱CNN)和BP神經網絡(Backpropagation Neural Networks,簡稱BPNN)是兩種
    的頭像 發表于 07-02 14:24 ?3687次閱讀

    深度神經網絡模型有哪些

    深度神經網絡(Deep Neural Networks,DNNs)是一類具有多個隱藏層的神經網絡,它們在許多領域取得了顯著的成功,如計算機視覺、自然語言處理、語音識別等。以下是一些常見的深度
    的頭像 發表于 07-02 10:00 ?1339次閱讀
    主站蜘蛛池模板: 快播av网址| 国产精品九九久久| 一本之道高清视频在线观看| 视频一区国产第一页| 日本午夜精品理论片A级APP发布| 男污女XO猛烈的动态图| 久久一区精品| 久久资源365| 老师真棒无遮瑕版漫画免费| 久久免费国产视频| 久久re热在线视频精99| 久久re热线视频精品99| 久久久96| 美女乱草鲍高清照片| 美女伊人网| 欧美18videosex| 欧美性受xxxx狂喷水| 青娱乐极品视觉盛宴国产视频| 欧美成 人 网 站 免费| 欧洲-级毛片内射八十老太婆| 琪琪电影午夜理论片77网| 千禧金瓶梅 快播| 色美妞论坛| 乡村教师电影版| 亚洲欧洲日产国产 最新| 一级毛片美国| 97色伦图片7778久久| jk白丝袜美女被男人桶| 囯产精品一品二区三区| 国产系列视频二区| 久久99热成人精品国产| 麻豆成人啪啪色婷婷久久| 欧美派对xxxhdparty| 手机看片国产免费| 亚洲成 人a影院青久在线观看| 一本色道久久综合亚洲精品加 | 果冻传媒色AV国产播放| 久久yy99re66| 免费毛片观看| 十八禁啪啦啪漫画| 亚洲天堂999|