『壹』 用caffe訓練cnn怎麼調參
這個問題,其實我也是初學,水平有限,說說自己的感覺吧。在潛意識里,我始終覺得神經網路的東西和中醫看病有種隱隱的聯系,經驗(自己的和別謹大人的)、感覺這些談不上有什麼標准化的東西確是挺重要的東西。基於此,調試一個神經網路,就需要首先熟悉網路的每個層、每個參數的作用是什麼,為什麼要有這樣的設置,通常researcher們都基於什麼樣的原則來悔晌悄設置碧渣?其次,多自己動手設置一下,找找感覺,看看不同的參數設置會產生什麼樣的效果,為什麼會產生這樣的效果(定量分析會比較困難,也可以憑著感覺想想為什麼這樣的設置會產生這樣的效果,也可以直接把每層的output解刨出來看看)?最後,熟能生巧吧。。。
相關材料有很多,個人推薦兩個大家熟知的可以常翻來看看:
Neural Network: Trick of the Trade Neural Networks: Tricks of the Trade
Practical Recommendations for Gradient-based Training of Deep Architectures http://arxiv.org/abs/1206.5533
『貳』 神經網路weight參數怎麼初始化
不一定,也含型可設置為[-1,1]之間。事實上,必須要有權值為負數,不然只有激活神經元,沒有抑制的也不行。至於為什麼在[-1,1]之間就足夠了,這是因為歸一化和Sigmoid函數輸出區間限制這兩個原因。一般在編程時,設置一個矩陣為bounds=ones(S,1)*[-1,1]; %權值上下界。
在MATLAB中,可以直接使用net = init(net);來初始化。我們可以通過設定網路參數net.initFcn和net.layer{i}.initFcn這一技巧來初始化一個給定的網路。net.initFcn用來決定整個網路的初始化函數。前饋網路的預設值為initlay,它允許每一層用單獨的初始化函數。設定了net.initFcn ,那麼參數net.layer{i}.initFcn 也要設定用來決定每一層的初始化函數。對前饋網路來說,有兩種不同的初始化方式經常被用到:initwb和initnw。initwb函數根據每一層自己的初始化參數(net.inputWeights{i,j}.initFcn)初始化權重矩陣和偏置。前饋網路的初始化權重通常設為rands,它使權重在-1到1之間隨機取值。這種方式經常用在轉換函數是線性函數時。initnw通渣老舉常用於轉換函數是曲線函數。它根據Nguyen和Widrow[NgWi90]為層產生初始權重和偏置值,使得每層神經元的活動區域能大致平坦的分布在輸入空間。如碧
『叄』 【閱讀筆記】改進卷積神經網路的14個小技巧
原文: https://mp.weixin.qq.com/s/Lh_lJNvV9BGhc6no2ln-_g
原題目誤導性太大
1)架構要遵循應用
你也許會被 Google Brain 或者 DeepMind 這些奇特的實驗室所發明的那些耀眼的新模型所吸引,但是其中許多在你的用例或者業務環境中要麼是不可能實現,要麼是實現起來非常不現實。你應該使用對你的特定應用最有意義的模型,這種模型或許比較簡單,但是仍然很強大,例如 VGG。
2)網路路徑的激增
每年的 ImageNet Challenge 的冠軍都會使用比上一屆冠軍更加深層的網路。從 AlexNet 到 Inception,再到 ResNet,Smith 注意到了「網路中路徑數量倍增」的趨勢,並且「ResNet 可以是不同長度的網路的指數集合」。
3)爭取簡單
然而,更大的並不一定是更好的。在名為「Bigger is not necessarily better」的論文中,Springenberg 等人演示了如何用更少的單元實現最先進的結果。參考:https://arxiv.org/pdf/1412.6806.pdf
4)增加對稱性
無論是在建築上,還是在生物上,對稱性被認為是質量和工藝的標志。Smith 將 FractalNet 的優雅歸功於網路的對稱性。
5)金字塔式的形狀
你也許經常在表徵能力和減少冗餘或者無用信息之間權衡。卷積神經網路通常會降低激活函數的采樣,並會增加從輸入層到最終層之間的連接通道。
6)過度訓練
另一個權衡是訓練准確度和泛化能力。用類似 drop-out 或者 drop-path 的方法進行正則化可以提高泛化能力,這是神經網路的重要優勢。請在比你的實際用例更加苛刻的問題下訓練你的網路,以提高泛化性能。
7)全面覆蓋問題空間
為了擴展你的訓練數據和提升泛化能力,請使用雜訊和數據增強,例如隨機旋轉、裁剪和一些圖像操作。
8)遞增的特徵構造
隨著網路結構越來越成功,它們進一部簡化了每一層的「工作」。在非常深層的神經網路中,每一層僅僅會遞增的修改輸入。在 ResNets 中,每一層的輸出和它的輸入時很相似的,這意味著將兩層加起來就是遞增。實踐中,請在 ResNet 中使用較短的跳變長度。
9)標准化層的輸入
標准化是另一個可以使計算層的工作變得更加容易的方法,在實踐中被證明可以提升訓練和准確率。批量標准化(batch normalization)的發明者認為原因在於處理內部的協變數,但是 Smith 認為,「標准化把所有層的輸入樣本放在了一個平等的基礎上(類似於一種單位轉換),這允許反向傳播可以更有效地訓練」。
10)輸入變換
研究表明,在 Wide ResNets 中,性能會隨著連接通道的增加而增強,但是你需要權衡訓練代價與准確度。AlexNet、VGG、Inception 和 ResNets 都在第一層使用了輸入變換以讓輸入數據能夠以多種方式被檢查。
11)可用的資源決指引著層的寬度
然而,可供選擇的輸出數量並不是顯而易見的,這依賴於你的硬體能力以及期望的准確度。
12)Summation Joining
Summation 是一種常用的合並分支的方式。在 ResNets 中,使用總和作為連接的機制可以讓每一個分支都能計算殘差和整體近似。如果輸入跳躍連接一直存在,那麼 summation 會讓每一層學到正確地東西(例如與輸入的差別)。在任何分支都可以被丟棄的網路(例如 FractalNet)中,你應該使用這種方式類保持輸出的平滑。
13)下采樣變換
在池化的時候,利用級聯連接(concatenation joining)來增加輸出的數量。當使用大於 1 的步長時,這會同時處理連接並增加連接通道的數量。
14)用於競爭的 Maxout
Maxout 被用在你只需要選擇一個激活函數的局部競爭網路中。使用求和以及平均值會包含所有的激活函數,所以不同之處在於 maxout 只選擇一個「勝出者」。Maxout 的一個明顯的用例是每個分支具有不同大小的內核,而 Maxout 可以包含尺度不變性。
1)使用調優過的預訓練網路
「如果你的視覺數據和 ImageNet 相似,那麼使用預訓練網路會幫助你學習得更快」,機器學習公司 Diffbot 的 CEO Mike Tung 解釋說。低水平的卷積神經網路通常可以被重復使用,因為它們大多能夠檢測到像線條以及邊緣這些模式。將分類層用你自己的層替換,並且用你特定的數據去訓練最後的幾個層。
2)使用 freeze-drop-path
Drop-path 會在訓練的迭代過程中隨機地刪除一些分支。Smith 測試了一種相反的方法,它被稱為 freeze-path,就是一些路徑的權重是固定的、不可訓練的,而不是整體刪除。因為下一個分支比以前的分支包含更多的層,並且正確的內容更加容易近似得到,所以網路應該會得到更好的准確度。
3)使用循環的學習率
關於學習率的實驗會消耗大量的時間,並且會讓你遇到錯誤。自適應學習率在計算上可能是非常昂貴的,但是循環學習率不會這樣。使用循環學習率(CLR)時,你可以設置一組最大最小邊界,在邊界范圍內改變學習率。Smith 甚至還在論文《Cyclical Learning Rates for Training Neural Networks》中提供了計算學習率的最大值和最小值的方法。參考:https://arxiv.org/pdf/1506.01186.pdf
4)在有雜訊的標簽中使用 bootstrapping
在現實中,很多數據都是混亂的,標簽都是主觀性的或者是缺失的,而且預測的對象可能是訓練的時候未曾遇到過的。Reed 等人在文章《TRAINING DEEP NEURAL NETWORKS ON NOISY LABELS WITH BOOTSTRAPPING》中描述了一種給網路預測目標注入一致性的方法。直觀地講,這可以奏效,通過使網路利用對環境的已知表示(隱含在參數中)來過濾可能具有不一致的訓練標簽的輸入數據,並在訓練時清理該數據。參考:https://arxiv.org/pdf/1412.6596
5)採用有 Maxout 的 ELU,而不是 ReLU
ELU 是 ReLU 的一個相對平滑的版本,它能加速收斂並提高准確度。與 ReLU 不同,ELU 擁有負值,允許它們以更低的計算復雜度將平均單位激活推向更加接近 0 的值,就像批量標准化一樣參考論文《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》,https://arxiv.org/pdf/1511.07289.pdf。如果您使用具有全連接層的 Maxout,它們是特別有效的。
『肆』 你有哪些煉丹神器深度學習(rnn、cnn)調參的經驗
對於 rnn 和 cnn 這種深度學習模型,常掘局明用的煉丹神器可能包括:
調節學習率:學習率較小可以保證模型在訓練時穩定,但是訓練速度臘輪較慢;學習率較大可能會使模型在訓練時快速收斂,但是有可能導致過擬合。
調節隱藏單元數量:隱藏單元較多可以增加模型的表示能力,但是有可能導致過擬合。
調節激活函數:激活函數的選擇會影響模型的表示能力和泛化能力。
調節正則化系數:正則化系數較大可以降低模型的復雜度,但是有可能導致模型表示能力降低。
調節批量大小:批量大判告小較小可以使模型更穩定,但是訓練速度較慢;批量大小較大可以提升訓練速度,但是有可能導致模型的泛化能力下降。
常用的調參方法包括網格搜索、隨機搜索和貝葉斯優化等。
『伍』 神經網路調參技巧-From Andrej Kapathy
Andrej Kapathy 是計算機視覺和深度帶早學習領域的專家之一,畢業於斯坦福人工智慧實驗室,博士師從李飛飛教授,在谷歌大腦、DeepMind 實過習,與吳恩達橋辯一起共事。Karpathy樂於而且善於分享自己的經驗和見解,在推特和博客上非常活躍,有 AI 「網紅」 之稱。近日,Karpathy將他訓練神經網路的經驗傾囊相授,獲得大量好評: 《A Recipe for Training Neural Networks》
另外,還有一蠢消雀些常見經驗:
『陸』 調參(網路超參數自動化搜索)
我們都知道神經網路訓練是由許多超參數決定的,例如網路深度,學習率,卷積核大小等等。
而我們有四種主要的策略可用於搜索最佳配置。
照看法被稱為試錯法或在學術領域稱為研究生下降法。這種方法 100% 手動,是研究員、學生和業余愛好者最廣泛採用的方法。
該端到端的工作流程非常簡單:學生設計一個新實驗,遵循學習過程的所有步驟(從數據收集到特徵圖可視化),然後她按順序迭代超參數,直到她耗盡時間(通常是到截止日期)或動機。
取自命令式指令「Just try everything!」的網格搜索——一種簡單嘗試每種可能配置的樸素方法。
工作流如下:
網格搜索和隨機搜索之間唯一真正的區別在於策略周期的第 1 步 - 隨機搜索從配置空間中隨機選取點。
圖像通過在兩個超參數空間上搜索最佳配置來比較兩種方法。它還假設一個參數比另一個參數更重要。這是一個安全的假設,因為開頭提到的深度學習模型確實充滿了超參數,並且研究員/科學家/學生一般都知道哪些超參數對訓練影響最大。
從每個圖像布局頂部的曲線圖可以看出,我們使用隨機搜索可以更廣泛地探索超參數空間(特別是對於更重要的變數)。這將有助於我們在更少的迭代中找到最佳配置。
總結:如果搜索空間包含 3 到 4 個以上的維度,請不要使用網格搜索。相反,使用隨機搜索,它為每個搜索任務提供了非常好的基準。
貝葉斯優化在不知道目標函數(黑箱函數)長什麼樣子的情況下,通過猜測黑箱函數長什麼樣,來求一個可接受的最大值。和網格搜索相比,優點是迭代次數慶手少(節省時間),粒度可以到很小,缺點是不容易找到全局最優解。
此搜索策略構建一個代理模型,該模型試圖從超參數配置中預測我們關注的指標。
在每次新的迭代中,代理人將越來越自信哪些新的猜測可以帶來改進。就像其他搜索策略一樣,它也有相同的終止條件。
我們訓練的模型越多,代理人對下一個有希望采樣的點就越有信心。以下是模型經過 8 次訓練後的圖表:
貝葉斯優化的目的是找到當x等於某個值的時候y得到最大. 我們隨機選取的10個點x=1..10里很可能沒有包含那個值(對y=x*x來說就是0),那麼我們需要找下一個點x, 獲得其對應的采樣點y. 這「下一個x」,是基於我們對前面10個點的多變數高斯分布的假設以及最大化AF而得到的,現目前為止我們認為的y的最大值最可能出現的位置
比如現在我們找到x=0.8為「下一個x」, 那麼現在我們就有11個采樣點,x=0.8,1,2...10 和他們對應的y值。這時候這11個點服從多變數高斯分布,我們再次最大化AF(每一次最大化AF,都需要多變數高斯分布的信息),得到"下一個x",如x=0.5,經過一定數量的迭代,我們可能可以得到y最大點在x=0.1之類。
常見的採集函數有下面三種,UCB,PI,EI,先介紹最李數好理解的UCB。
,k為調節參數,直觀地理解譽擾嫌為上置信邊界。
超參數 用於調節exploitation與exploitation, 更傾向於收斂到 附近, 表示正態累計分布函數, 表示現有的最大值。
其原理就是找到未知點的函數值比 大的概率,取這些點中概率最大的點,具體比 大多少不考慮,這里通過Z-scores標准化法,讓每個未知點函數值大於 的概率可以進行比較。
Z-scores標准化法, ,x為觀察點, 為所有觀察點的均值, 為所有觀察點標准差, 的概率密度函數符合標准正態分布。
為正態累計分布函數, 為正態概率密度函數, 表示現有的最大值。EI函數解決了PI未考慮未知點,比已知最大點大多少的問題,EI函數求的是未知點函數值比 大的期望
target:黑箱函數
x:自變數取值范圍
Y:可以接受的黑箱函數因變數取值
x:貝葉斯優化器猜測的最大值的x值
target(xnew):貝葉斯優化器猜測的最大值的函數值
但是,跟所有工具一樣,它們也有缺點:
提前終止不僅是一項著名的正則化技術,而且在訓練錯誤時,它還是一種能夠防止資源浪費的機制。
前三個標准顯而易見,所以我們把注意力集中在最後一個標准上。
通常情況下,研究人員會根據實驗類別來限定訓練時間。這樣可以優化團隊內部的資源。通過這種方式,我們能夠將更多資源分配給最有希望的實驗。
『柒』 深度學習調參有哪些技巧
深度學習調參有哪些技巧?
下面就分享一些自己的深度學習模式調試技巧(主要是CNN)。
最後,讓我談談我的感受。 卷積神經網路自從2012年在ImageNet競賽中作為AlexNet模型出現以來,已經成為圖像識別領域的標准。 即使是文字和音頻領域也開始使用卷積神經網路進行建模。 然而,以卷積神經網路為代表的深度神經網路被批評為「黑盒子」,給行業DL模型的應用和推廣帶來一些障礙。
『捌』 深層神經網路的超參數調試、正則化及優化
訓練集 ( Training set )
作用是用來擬合模型,通過設置分類器的參數,訓練分類模型。後續結合驗證集作用時,會選出同一參數的不同取值,擬合出多個分類器。
驗證集 ( Dev set )
作用是當通過訓練集訓練出多個模型後,為了能找出效果最佳的模型,使用各個模型對驗證集數據進行預測,並記錄模型准確率。選出效果最佳的模型所對應的參數,即用來調整模型參數。如svm中的參數c和核函數等。
測試集 ( Test set )
通過訓練集和驗證集得出最優模型後,使用測試集進行模型預測。用來衡量該最優模型的性能和分類能力。即可以把測試集當做從來不存在的數據集,當已經確定模型參數後,使用測試集進行模型性能評價。
一個有助於理解的形象比喻:
訓練集 —— 課本,學生根據課本里的內容來掌握知識。
驗證集 —— 作業,通過作業可以知道 不同學生學習情況、進步的速度快慢。
測試集 —— 考試,考的題是平常都沒有見過,考察學生舉一反三的能力。
訓練集 直接參與了模型調參的過程,顯然不能用來反映模型真實的能力(防止課本死記硬背的學生擁有最好的成績,即防止 過擬合 ) 。
驗證集 參與了人工調參(超參數)的過程,也不能用來最終評判一個模型(刷題庫的學生不代表其學習能力強)。
所以要通過最終的考試 (測試集) 來考察一個學生(模型)真正的能力。
如何將只有一個包含m個樣例的數據集D,產生出訓練集S和測試集T(驗證集可以省略)?主要有以下三種方法:
自助法 ( bootstrapping )
給定m個樣本的數據集D,我們對它進行采樣產生數據集D',每次隨機從D中挑選一個樣本,將其拷貝入D',然後再將樣本放回原始數據集D。顯然,該樣本在下次采樣時任然有可能被採到。這個過程重復m次後,我們就得到了含有m個樣本的數據集D',這就是自助采樣的結果。 樣本有重復采樣,也有一次也沒有被採到的。從未採到的結果是 ,取極限得到
因此,使用自助法約有1/3的數據集沒有被選中過,它們用於測試,這種方式叫「外包估計」。
自助法在數據集小,難以劃分訓練集、測試集的時候有很大的效果,如果數據集足夠大的時候,留出法和交叉驗證是更好的選擇。
留出法 ( hold-out )
將整個數據集D劃分為兩個互斥的集合,其中一個作為訓練集S,另一個作為測試集T。即,D=S∪T,S∩T=∅。在S上訓練出模型,T作為測試集,來評估模型效果。
當樣本數據量較小(10000條左右及以下)時,通常取其中70%作為訓練集,30%作為測試集;或60%作為訓練集,驗證集和測試集各20%。
交叉驗證法 ( cross validation )
如圖所示,交叉驗證法的實現流程大致如下:
(1) 將整個數據集分成k個大小相似的子集,即D=D1∪D2∪...∪Dk,Di∩Dj=∅(故又稱k折交叉驗證法,通常取k=10 )。
(2) 對於每一個模型Mi,演算法執行k次,每次選擇一個Sj(1≤j≤k)作為測試集,其它作為訓練集來訓練模型Mi,把訓練得到的模型在Sj上進行測試,這樣一來,每次都會得到一個誤差E,最後對k次得到的誤差求平均,就可以得到模型Mi的泛化誤差。
(3) 演算法選擇具有最小泛化誤差的模型作為最終模型,並且在整個訓練集上再次訓練該模型,從而得到最終的模型。
交叉驗證的主要的目的是 為了選擇不同的模型類型(比如一次線性模型、非線性模型) ,而 不是為了選擇具體模型的具體參數 。比如在BP神經網路中,其目的主要為了選擇模型的層數、神經元的激活函數、每層模型的神經元個數(即所謂的超參數),每一層網路神經元連接的最終權重是在模型選擇(即K折交叉驗證)之後,由全部的訓練數據重新訓練。
假設這就是數據集,顯然用簡單分類器(如邏輯回歸)並不能很好地擬合上述數據。這種情況稱為 欠擬合 。
相反地,如果採用一個非常復雜的分類器(如深度神經網路或含有隱藏單元的神經網路),擬合效果會非常好。但與此同時,模型的復雜度也會過高,這種稱為 過擬合 。
在兩者之間,可能會存在一些復雜程度適中、數據擬合適度的分類器,擬合結果較為合理,稱為 適度擬合 。
如上圖所示,訓練集誤差和驗證集誤差均較高時為 高偏差(欠擬合) 情況;訓練集誤差較高,驗證集誤差較高低時為 高方差(過擬合) 情況。
(1) 如何減小偏差(防止欠擬合)
① 增大神經網路規模。
(2) 如何減小方差(防止過擬合)
① 增加數據集樣本數量;
② 正則化。
參數 是指神經網路中由數據驅動並進行調整的變數,如𝑊和𝑏。
超參數 是指無需數據驅動,而是在訓練前或者訓練中人為進行調整的變數。例如演算法中的learning rate 𝑎(學習率)、iterations(梯度下降法循環的數量)、𝐿(隱藏層數目)、𝑛[𝑙](隱藏層單元數目)、choice of activation function(激活函數的選擇)等都需要人為設置,這些數字實際上控制了最後的參數𝑊和𝑏的值,所以它們被稱作超參數。
神經網路中的超參數主要分為三類:網路參數、優化參數、正則化參數。
網路參數
可指網路層與層之間的交互方式(相加、相乘或者串接等)、卷積核數量和卷積核尺寸、網路層數(也稱深度)和激活函數等。
優化參數
一般指學習率(learning rate)、批樣本數量(batch size)、不同優化器的參數以及部分損失函數的可調參數等。
正則化參數
權重衰減系數,隨機失活比率(dropout)等。
正則化有利於減小訓練集和驗證集准確率的方差,防止過擬合。在無法增加樣本數量或增加樣本數量的成本過高時,正則化是一種行之有效的方法。
一般將任意 維向量 的 - 范數定義為
根據定義:
當 時, 的 范數為 ,表示向量 中非0元素的個數。
當 時, 的 范數為 ,等於向量 中所有元素的絕對值之和。
當 時, 的 范數為 ,等於向量 中所有元素的平方和開根號。
正則化(Regularization) 的主要目的是控制模型復雜度,減小過擬合。最基本的正則化方法是在原目標(代價)函數 中添加懲罰項,對復雜度高的模型進行「懲罰」。
對於神經網路模型, 正則化即在其代價函數中添加 正則項:
其中, 。之後再求解優化問題 即可。
假設某三層神經網路存在過擬合問題,採用dropout正則化會遍歷網路的每一層,並設置消除該層中每一個節點的概率(比如0.5),最後得到一個節點更少、規模更小的網路,然後再用反向傳播方法進行訓練,就能有效防止過擬合。
最常用的方法是 inverted dropout(反向隨機失活) 。對於一個三層神經網路( ),以第三層為例,實施dropout的步驟如下:
① 定義一個三層dropout矩陣d3:
d3=numpy.random.rand(a3.shape[0],a3.shape[1])
其中,a3表示神經網路第三層的激活函數矩陣。
② 設置 ( )的大小。 表示保留某個隱藏單元的概率。將第①步產生的隨機矩陣d3的每個元素與 進行比較,小於置1,大於置0,得到新的d3矩陣(1表示保留該節點,0表示刪除該節點)。
③ 將a3與新的d3矩陣相乘(矩陣對應元素相乘),得到新的激活函數矩陣:
a3 =np.multiply(a3,d3)
④ 將新的a3矩陣除以keep-prob:
a3 /= keep_prob
目的是保證a3的期望值(均值)不變,從而保證第三層的輸出不變。
① 使用dropout可以使得部分節點失活,可以起到簡化神經網路結構的作用,從而起到正則化的作用。
② 因為dropout是使得神經網路的節點隨機失活,這樣會讓神經網路在訓練的時候不會使得某一個節點權重過大。因為該節點輸入的特徵可能會被清除,所以神經網路的節點不能依賴任何輸入的特徵。dropout最終會產生收縮權重的平方范數的效果,來壓縮權重,達到類似於 正則化的效果。
① dropout在測試階段不需要使用,因為如果在測試階段使用dropout可能會導致預測值產生隨機變化(因為dropout使節點隨機失活)。而且,在訓練階段已經將權重參數除以keep-prob來保證輸出的期望值不變,所以在測試階段沒必要再使用dropout。
② 神經網路的不同層在使用dropout的時候,keep-prob可以不同。因為可能有的層參數比較多,比較復雜,keep-prob可以小一些,而對於結構比較簡單的層,keep-prob的值可以大一些甚至為1,keep-prob等於1表示不使用dropout,即該層的所有節點都保留。
加快訓練速度。
對於一個神經網路模型,考慮其代價函數:
如果未歸一化輸入,其代價函數的形狀會較為細長狹窄。在這樣的代價函數的限制下,為避免陷入局部最優解,梯度下降法的學習率必須設置得非常小。
如果歸一化輸入,代價函數便呈現球形輪廓。這種情況下,不論從哪個位置開始梯度下降法,都能使用較大的學習率,從而更快速、直接地找到全局最優解。
對於包含n個特徵的m個樣本的數據集,其輸入歸一化的過程主要分為兩步:
① 零均值化
② 歸一化方差
其中, 代表第 個樣本的特徵矩陣。
訓練集、驗證集、測試集特徵矩陣的平均值 和標准差 要保持一致,確保它們歸一化後符合同一分布。
『玖』 如何訓練神經網路
1、先別著急寫代碼
訓練神經網路前,別管代碼,先從預處理數據集開始。我們先花幾個小時的時間,了解數據的分布並找出其中的規律。
Andrej有一次在整理數據時發現了重復的樣本,還有一次發現了圖像和標簽中的錯誤。所以先看一眼數據能避免我們走很多彎路。
由於神經網路實際上是數據集的壓縮版本,因此您將能夠查看網路(錯誤)預測並了解它們的來源。如果你的網路給你的預測看起來與你在數據中看到的內容不一致,那麼就會有所收獲。
一旦從數據中發現規律,可以編寫一些代碼對他們進行搜索、過濾、排序。把數據可視化能幫助我們發現異常值,而異常值總能揭示數據的質量或預處理中的一些錯誤。
2、設置端到端的訓練評估框架
處理完數據集,接下來就能開始訓練模型了嗎?並不能!下一步是建立一個完整的訓練+評估框架。
在這個階段,我們選擇一個簡單又不至於搞砸的模型,比如線性分類器、CNN,可視化損失。獲得准確度等衡量模型的標准,用模型進行預測。
這個階段的技巧有:
· 固定隨機種子
使用固定的隨機種子,來保證運行代碼兩次都獲得相同的結果,消除差異因素。
· 簡單化
在此階段不要有任何幻想,不要擴增數據。擴增數據後面會用到,但是在這里不要使用,現在引入只會導致錯誤。
· 在評估中添加有效數字
在繪制測試集損失時,對整個測試集進行評估,不要只繪制批次測試損失圖像,然後用Tensorboard對它們進行平滑處理。
· 在初始階段驗證損失函數
驗證函數是否從正確的損失值開始。例如,如果正確初始化最後一層,則應在softmax初始化時測量-log(1/n_classes)。
· 初始化
正確初始化最後一層的權重。如果回歸一些平均值為50的值,則將最終偏差初始化為50。如果有一個比例為1:10的不平衡數據集,請設置對數的偏差,使網路預測概率在初始化時為0.1。正確設置這些可以加速模型的收斂。
· 人類基線
監控除人為可解釋和可檢查的損失之外的指標。盡可能評估人的准確性並與之進行比較。或者對測試數據進行兩次注釋,並且對於每個示例,將一個注釋視為預測,將第二個注釋視為事實。
· 設置一個獨立於輸入的基線
最簡單的方法是將所有輸入設置為零,看看模型是否學會從輸入中提取任何信息。
· 過擬合一個batch
增加了模型的容量並驗證我們可以達到的最低損失。
· 驗證減少訓練損失
嘗試稍微增加數據容量。