主頁 >  其他 > 神經網路開發食譜

神經網路開發食譜

2022-01-03 07:24:56 其他

新年新氣象:鴿了漫長時間的公眾號終于重新開張了,這次公眾號的寫作主題將圍繞深度學習,參考了Andrej教授和一些大佬的開發經驗,首先對神經網路的整體架構進行理論和技術探討,本節將描述神經網路模型構建的開發體系進行學習,

1.閱讀指南

? 訓練神經網路時會出現很多漏洞,并非我們認知上簡單的調包,調參即可使用,很多情況,盡管構建了錯誤的網路模型(訓練影像忘記檢測反轉影像,自回歸模型將它預測的資料作為輸入,或者權重,正則化等等配置);大多數情況它仍在訓練,我們無法檢測出它出現了什么問題,所以,成功開發神經網路最需要的就是有一套完整的體系,耐心,以及對細節的關注,

your_data = #匯入你的資料集
model = SuperCrossValidator(SuoerDuper.fit, your_data, ResNet50, SGDOptimizer) #設定你的網路

開始訓練神經網路我們會覺得很容易,因為許多庫和框架可以讓我們在短短二三十行的代碼來解決我們的資料問題,這會造成一種錯誤的印象,很多東西是即插即用的,事實上神經網路并非如此,當我們偏離訓練ImageNet 分類器時,它并非現成的技術,如果不了解該技術的作業原理,將會出現很多意想不到的失敗,,,

2.無聲無息失敗的神經網路訓練

? 當我們錯誤配置代碼時,通常會遇到某些例外,**You plugged in an integer where something expected a string. The function only expected 3 arguments. This import failed. That key does not exist. The number of elements in the two lists isn’t equal.**之類的問題,這只是訓練神經網路的開始,一些代碼可能在語法上正確,但是在整個網路中并不正確,這些問題很難發現,例如反向傳播是一種有漏洞的抽象,試圖忽略它的作業原理將無法應對它帶來的問題,構建和除錯的神經網路模型效果也會低得多,

例如:

  • Sigmoid上的梯度消失,非線性可能會飽和完全停止學習造成訓練損失是平坦的拒絕向下,可能因為你的權重初始化太大,造成矩陣乘法輸出有一個很大的范圍,此時z*(1-z)sigmoid 非線性的區域梯度,從而使xw的梯度都為0

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KNFcwEBO-1641042576116)(https://github.com/Shirakaw/writting/blob/master/1_gkXI7LYwyGPLU5dn6Jb6Bg.png?raw=true)]

  • ReLU:非線性ReLU它將神經元閾值設定為0,使用ReLU的全連接層的前向和后向傳遞的核心包括:

    z = np.maximum(0, np.dot(W, x)) #前向傳遞
    dW = np.outer(z > 0, x) #后向傳遞:W 的區域梯度
    

    如果觀察它的一個神經元在前向傳遞中被設定為0(即z = 0 ,它將不會觸發),那么它的權重將為零梯度,這就是所謂的Dying ReLUs問題,如果一個ReLU神經元不幸被初始化他將永遠不會出發,或者一個神經元的權重在訓練到這個機制的程序中將被一個大的更新淘汰,這個神經元將“永久性死亡“,這就像一個永久性,不可恢復的腦損傷,這些神經元在我們的整個訓練集中永遠不會為任何實體打開,并且將永遠保持死亡狀態,

  • RNN中的梯度爆炸:參考CS231n中的一個例子如下圖所示:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jHCVsf2h-1641042576118)(https://github.com/Shirakaw/writting/blob/master/1_dqlX0ixpk1O3225bZ1LGnA.png?raw=true)]

    這個RNN展開了T個時間布,當我們觀察反向傳播的作用時,我們會看到通過所有隱藏狀態和反向傳播的梯度信號總時乘以相同矩陣(遞回Whh)并穿插非線性反向傳播,當我們取一個屬a開始乘以另一個數b(i.e. a * b * b * b * b * b * b…),如果**|b|** < 1,那么這個序列要么變成0,或者**|b|** > 1時爆炸到無窮大,同樣的事情發生在RNN的反向傳播中(除了b是一個矩陣而不是一個數字以外),

一切在語法上可能正確的,構建的神經網路效果卻很差,這種問題非常苦惱,也許時因為在資料增強部分左右翻轉影像時忘記翻轉標簽,此時我們搭建的網路仍然可以很好的作業,因為我們的網路可以在內部學習檢測翻轉的影像,然后它將預測值左右翻轉,或者在自回歸模型中將預測的事物作為輸入,或者,當我們嘗試剪裁梯度,卻剪裁了損失導致訓練期間忽略例外值等等問題,如果我們構建的模型報錯了,反而是很幸運的,因為大部分時候它會訓練,只不過效果很糟糕而已,,,

3.開發食譜

? 鑒于以上發生的問題,如果我們想使用神經網路應用到一個新的問題時,我們應該構建一個流程體系,重視它的規則,從簡單到復雜構建,在外面對將要發生的事情做出具體假設,通過實驗驗證他們或者可視化展示,知道我們發現了一些問題,如果我們直接一股腦的對未經驗證的模型進行檢測,勢必需要很久才能找到問題所在,多說無益,開始描述整個開發程序,

3.1 資料脫敏

? 訓練神經網路的第一步時,無需接觸任何神經網路代碼,而是從徹底檢查資料開始,這一步是非常關鍵的一步,往往我們在資料處理的某一個步驟會一定程度上的影響實驗結果,檢查資料重復性問題,損壞的影像標簽,資料的不平衡性問題,考慮如何定義分類程序,需要了解樣本的區域特征還是全域特征,是否可以預處理,平均化,影像的噪聲問題,當我們對資料有了一定的掌握,可以通過一些方法搜索/過濾/排序我們需要的資料(標簽型別)并可視化他們的分布觀察各軸的例外值,他們會影響資料的質量或預處理中的一些錯誤,

3.2 構建完整的訓練—評估框架

? 當處理好資料后,下一階段是構建完整的訓練—評估框架,通過一系列實驗驗證它的可靠性,我們可以先使用一些簡單模型,或非常小的網路(不容易出錯的模型)訓練,可視化損失,正確率,模型預測,并在此程序使用明確假設進行消融實驗,

? 此階段的提示和技巧:

  • fix random seed:使用固定的隨機種子,保證我們運行兩次代碼時,將獲得同樣的結果,
  • simplify:此階段不需要資料增強程序,它是正則化策略無需此時出現
  • 繪制評估曲線無需在意訓練時間:在繪制測驗損失時,在整個資料集上評估不要批次繪制測驗損失
  • verify loss 驗證我們的損失例如,如果你正確地初始化你的最后一層,你應該-log(1/n_classes)在初始化時測量softmax,可以為 L2 回歸、Huber 損失等匯出相同的默認值,
  • init well:正確初始化最終層權重,正確設定這些將加速收斂并消除**“hockey stick”**損失曲線,在最初的幾次迭代中,構建的網路基本上只是學習偏差,
  • human baseline:除了監控損失值等可解釋和可檢查指標以外,盡可能與自評估準確性進行比較,或者對測驗資料進行兩次注釋,對于每個例子,將一個注釋作為預測,第二個注釋作為真實值,
  • input-indepent baseline:訓練與輸入無關的baseline,觀察我們的模型是否學會了從輸入中提取資訊,
  • overfit one batch:過擬合幾個batch,增加模型的容量驗證我們可以達到的可實作的最小損失,
  • verify decreasing training loss:驗證減少訓練損失,如果資料集上欠擬合,可以適當增加容量,或者使用一些方法來處理,
  • visualize just before the net:在y_hat = model(x)(或sess.run在tf之前)將資料和標簽tensor解碼可視化,
  • visualize prediction dynamics:在訓練程序中對固定測驗批次的模型預測進行可視化,這些預測將動態的為我們提供整個訓練程序,如果網路以某種方式擺動,則可能會感覺到網路無法適應資料集,從而顯示出不穩定性,學習率的過高或過低也容易造成抖動問題,
  • use backprop to chart dependencies:使用反向傳播來繪制依賴關系,避免造成矢量化,廣播等操作的計算錯誤(該型別錯誤很難發現,網路仍會正常訓練),除錯方法是將損失設定很小,如實體i的所有輸出總和,輸入到反向傳播計算,確保第i個輸入得到一個非零梯度,同樣的策略可以用來確保你的自回歸模型在時間t只取決于1…t-1,更廣泛地說,梯度給你提供了關于網路中什么取決于什么的資訊,
  • generalize a special case:將模型撰寫成函式形式,先寫出完整的訓練版本然后加入回圈等矢量化指令將其轉化為完整的模型代碼
3.3 過擬合

? 在這個階段,我們已經充分的掌握了整個資料集,并且有了完整的訓練+評估模型,對于任何給定的模型,我們可以重復地訓練,在充分認識該問題的基礎上,可以很好的將結果與預測結果進行比對,此時我們可以準備更新下一個模型了,尋找一個好的模型通常有兩階段:首先得到一個足夠大的模型,它可以過擬合(專注于訓練損失),然后對其進行適當的正則化(放棄訓練損失用以改善驗證損失),

? 此階段的提示和技巧:

  • picking the model:挑選合適的模型有一個很關鍵的道理們就是模型越簡單它的效果往往越好,在搭建模型時盡量避免一些奇妙的搭建思路,最好的方法就是參考最相關的論文,并復制粘貼他們獲得的良好性能的最簡單架構,并在此基礎上加以訓練,所謂站在巨人的肩膀上即使如此,
  • adam is safe:在設定超引數時,建議使用3e-4Adam,因為Adam通常對超參的容忍度更高,對于ConvNets來說,調整好的SGD總是比Adam略勝一籌,但是最佳的學習率范圍卻十分小,多是針對具體問題的,通常在初始階段(RNN和相關的序列模型)使用Adam是明智之選,
  • complexify only one at a time:如果想優化模型,建議一個一個嘗試確保,每次優化都能獲得預期性能提升,
  • do not trust learning rate decay defaults:最好禁用學習率衰減,手動除錯避免學習率過早的自動衰減為0,
3.4 正則化

? 到了這一階段,需要通過放棄一些訓練集的準確性進行正則化,獲得一些驗證準確性,

? 此階段的提示和技巧:

  • get more data:在任何環境下對模型正則化的最佳和首選方法就是添加更多真實的訓練集,花費大量時間從小型資料集中”榨汁“是不明智的,增加更多資料是能無限提高神經網路模型性能的唯一確保方法,
  • data augment:資料增強為正則化的第二好方法,
  • creative augmentation:創意性的變形資料也是擴展資料集創造性的方法:例如,域隨機化,使用模擬將資料插入場景中,CV中的影像翻轉等一系列手段,
  • pretrain:對網路進行預訓練,
  • stick with supervised learning:堅持監督學習而不是無監督學習(至少現在是),
  • smaller input dimensionality:如果資料集很小,任何添加的虛假輸入都會造成過擬合問題,
  • smaller model size:約束模型尺寸,消除大量引數,
  • decrease the batch size:減少batch大小,較小的batch在某種程度上對應更強的正則化,因為批次經驗均值/標準差是完整均值/標準差的更近似版本,
  • drop:添加dropout(不適用于批量標準化),
  • weight decay:增加權重衰減懲罰,
  • early stopping:停止根據測量的驗證損失進行訓練,從而在模型即將過擬合時得到最佳引數配比,
  • try a larger model:嘗試更大的模型,往往訓練效果比小訓練樣本要好,

? 最后,為了確保我們的模型是有效的,可以將網路的第一層權重可視化,確保模型獲得有意義的良好邊緣,如果第一層看起來像噪音,那么可能有問題,同樣,隱藏層出現噪音問題也可能存在問題,

3.5 調參

? 此步驟處于網路訓練回圈中,為了我們的模型實作低驗證損失,

? 此階段的提示和技巧:

  • random over grid search:為了同時調整多個超參,使用網格搜索可以確保覆寫所有引數,最好使用隨即搜索,因為神經網路通常對某些引數更敏感,如果引數a很重要但更更改b無影響,此時我們寧可對a進行更徹底的采樣,而不是在幾個固定點多次采樣,
  • hyper-parameter optimization:使用一些貝葉斯超引數優化工具箱
3.6 最終結果

? 當我們找到了最佳引數和最好的模型架構,仍然可以通過一些方法來提高正確率

? 此階段的提示和技巧:

  • ensembles:模型集成可以提高準確率
  • leave it training:當網路的準確率保持一定穩定時,可以嘗試使用長時間保持訓練,

4. 結論

? 參考了Andrej教授和一些大佬的調參經驗,總結了搭建神經網路的所有成功要素,相信這對于我們進一步探索復雜模型,模型改進,論文復現有很大幫助,掌握好整個理論體系,有助于我們進一步的發展,在"搭積木"的道路上越走越遠哈.

推薦閱讀

  • 微分算子法
  • 使用PyTorch構建神經網路模型進行手寫識別
  • 使用PyTorch構建神經網路模型以及反向傳播計算
  • 如何優化模型引數,集成模型
  • TORCHVISION目標檢測微調教程

型](https://mp.weixin.qq.com/s/kBUuY12T6Sse4coYYMzlQA)

  • TORCHVISION目標檢測微調教程

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4b6txySS-1641042576119)(https://github.com/Shirakaw/writting/blob/master/1628081548426-51138395-7cc1-4579-a0f0-dc4195c4ea0b.png?raw=true)]

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401503.html

標籤:其他

上一篇:OpenCV C++案例實戰十二《影像全景拼接》

下一篇:bids格式資料中config檔案的撰寫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more