1. 程式人生 > >###好好好好########深度模型優化效能 調參

###好好好好########深度模型優化效能 調參

注意

    調參看驗證集。trainset loss通常能夠一直降低,但validation set loss在經過一段降低期後會開始逐漸上升,此時模型開始在訓練集上過擬合。
    著重關注val loss變化,val acc可能會突變,但loss衡量的整體目標,但是你的測試集是驗證集的話還是看評判標準為佳。
    優先調參學習率。
    通過對模型預測結果,可以判斷模型的學習程度,如果softmax輸出在0或1邊緣說明還不錯,如果在0.5邊緣說明模型有待提高。
    調參只是為了尋找合適的引數。一般在小資料集上合適的引數,在大資料集上效果也不會太差。因此可以嘗試取樣部分資料集,以提高速度,在有限的時間內可以嘗試更多引數。
    使用深度框架程式設計時,儘量使用框架提供的API,如tensor index索引,不要用for迴圈啥的。速度不是一個級別的。

學習率(重要)

這裡寫圖片描述

畫圖分析是種不錯調參學習率的方式:學習率過大,loss曲線可能會上升,或者不能一直下降,出現震盪情況,由於學習率較大,導致引數在最優點附近徘徊,loss大小一下大一下小,就是卻無法到達最優點,容易擬合在區域性最小值。學習率太小loss曲線可能下降速度過於緩慢。好的學習率loss呈平滑的下降曲線。
學習率代表了引數的更新步長,你走的距離越短當然不會錯過每個最低點,但是耗時間。而且步長越小,越容易得到區域性最優化(到了比較大的山谷,就出不去了),而太大了可能會直接越過全域性最優點。

    lr:學習率太大,容易梯度爆炸,loss變nan。取1 0.1 0.01 .0001 … 10e-6(取對數變化)。常取0.1。通過對驗證集的預測,可以選擇一個較好的lr。如果當前的學習率不能在驗證集上繼續提高,可以將學習率除以2或者5試試。
    decay:訓練集的損失下降到一定的程度後就不再下降了,而且train loss在某個範圍內來回震盪,不能進一步下降(也就是loss一下跳到最低點左側,一下跳到最低點右側,由於學習率過高就是不能繼續下降)。可採用衰減學習率,學習率隨著訓練的進行逐漸衰減。取0.5。比如當val loss滿足 no-improvement規則時,本來應該採取early stopping,但是可以不stop,而是讓learning rate減半繼續跑。如此反覆。衰減方法有:衰減到固定最低學習率的線性衰減,指數衰減,或每次val loss停滯時衰減2-10倍。
    fine-tuning的時候,可以把新加層的學習率調高,重用層的學習率可以設定的相對較低。
    這裡寫圖片描述

CLR- 中文
引數初始化

    破壞不同單元間對稱性,如果兩個單元相同,接受相同的輸入,必須使其具有不同的初始化引數,否則模型將一直以相同方式更新這兩個單元。更大的初始化權重會更容易破壞對稱性,且避免在梯度前向和反向傳播過程中丟失訊號,但如果權重初始化太大,很容易產生爆炸值(梯度爆炸可以使用梯度截斷緩解);而在CNN中會導致模型對輸入高度敏感,導致確定性的前向傳播過程表現的隨機;而且容易導致啟用函式產生飽和的梯度,導致梯度丟失。
    不可取:
    初始化為0,模型無法更新,而且模型權重的相同,導致模型的高度對稱性。
    初始化為 very small random numbers(接近0,但不是0),模型效果不好,會導致梯度資訊在傳播中消失。
    推薦:
    一般bias全初始化為0,但在RNN中有可能取1(LSTM)。
    random_uniform
    random_normal
    glorot_normal
    glorot_uniform(無腦xavier,為了使得網路中資訊更好的流動,每一層輸出的方差儘量相等。)
    推薦:使用方差縮放初始化。在 TensorFlow 中,該方法寫作 tf.contrib.layers.variance_scaling_initializer()。根據我們的實驗,這種初始化方法比常規高斯分佈初始化、截斷高斯分佈初始化及 Xavier 初始化的泛化/縮放效能更好。粗略地說,方差縮放初始化根據每一層輸入或輸出的數量(在 TensorFlow 中預設為輸入的數量)來調整初始隨機權重的方差,從而幫助訊號在不需要其他技巧(如梯度裁剪或批歸一化)的情況下在網路中更深入地傳播。Xavier 和方差縮放初始化類似,只不過 Xavier 中每一層的方差幾乎是相同的;但是如果網路的各層之間規模差別很大(常見於卷積神經網路),則這些網路可能並不能很好地處理每一層中相同的方差。
    這裡寫圖片描述

啟用函式

    ReLu:通用啟用函式,防止梯度彌散問題。最後一層慎用ReLu做啟用。
    Sigmoid的可微分的性質是傳統神經網路的最佳選擇,但在深層網路中會引入梯度消失和非零點中心問題。除了gate之類的地方,需要把輸出限制成0-1之外,儘量不要用sigmoid,。sigmoid函式在-4到4的區間裡,才有較大的梯度。之外的區間,梯度接近0,很容易造成梯度消失問題。輸入0均值,sigmoid函式的輸出不是0均值的。
    tanh範圍在-1到1之間,且zero-center,但比sigmoid要好,但仍有飽和時梯度消失問題。
    relu比sigmoid和tanh好,導數易計算收斂速度快,不會飽和。唯一問題就是x小於0時梯度為0,可能會導致許多神經元死亡。使用時尤其注意lr的設定
    Leaky_ReLu及ReLu變種,maxout可以試試。
    通常使用ReLu,及其變種,PReLU and RReLU 效果挺好。tanh可以試試,但不要使用sigmoid。
    原版rnn 只有tauh不會爆炸,所以有了lstm 在最後drop以及改進的GRU 靠閾值砍梯度。所以lstm/gru 無論用什麼啟用函式都不會爆。標準rnn 哪怕梯度是1,一路×下來不是消失就是爆炸;於是就有了irnn https://arxiv.org/abs/1504.00941就是把 權矩陣初始為單位陣;當然還有去年的ind rnn 不但解決了梯度爆炸的問題,順便還解決了可解釋性

maxout增加大量引數,計算圖如下:
這裡寫圖片描述
普通網路:
z=WX+b
out=f(z)
這裡寫圖片描述
maxout層,其中z個數自定
z1=w1x+b1
z2=w2x+b2
z3=w3x+b3
z4=w4x+b4
z5=w5x+b5
out=max(z1,z2,z3,z4,z5)
模型

    如果輸入向量固定大小,可考慮使用全連線前饋網路,如果輸入為影象等二維結構,可考慮卷積網路,如果輸入為序列,可考慮迴圈神經網路。
    BN:提高效能,加速訓練,有時可省去dropout。注意BN在batch size過小時效能不是很好。刪掉批歸一化層。再將批處理大小減小為 1 時,這樣做會暴露是否有梯度消失和梯度爆炸等問題。我們曾經遇到過一個好幾個星期都沒有收斂的網路,當我們刪除了批歸一化層(BN 層)之後,我們才意識到第二次迭代的輸出都是 NaN。在這裡使用批量歸一化層,相當於在需要止血帶的傷口上貼上了創可貼。批歸一化有它能夠發揮效果的地方,但前提是你確定自己的網路沒有 bug。
    儘量選擇更多的隱層單元,小filter,利用非線性,而過擬合通過正則化的方法避免。
    一開始需要驗證模型是否有問題,可採取小量資料集、很深模型快速看模型是否能夠對訓練集很好的過擬合,而測試集準確率很低。
    batch_size:常取2的n次方。 取 32 64 128 256 … 。batch越大,一般模型加速效果明顯。不考慮時間成本的情況下,batch size=1可作為一個regularizer。將批處理大小減小到 1 可以向你提供與權重更新相關的更細粒度的反饋,你應該將該過程在 TensorBoard(或者其他的除錯/視覺化工具)中展示出來。儘管batch size越大,模型執行越快,但並不是越大,效果越好。batch size增大,模型訓練越穩定,學習率可以些許調大,但是有時候小的batch size帶來的噪聲影響可能會使模型獲得更好的泛化能力,更容易越過損失函式中的鞍點(損失函式在某個點的某個方向呈現已到達最小值的假象,其實在另一個方向是萬丈深淵,這是小batch提供的隨機效能夠幫助模型跳過鞍點。),當然小batch size存在訓練穩定性差的缺點。
    不同尺寸的feature maps的concat,利用不同尺度的資訊。
    resnet的shortcut有作用,shortcut的支路一定要是identity。
    可以利用Inception方法來提取不同抽象程度的高階特徵。
    梯度歸一化:計算出來梯度之後,除以Minibatch的數量。
    利用pre-trained model和fine-tune可以實現很好的效能。
    為每一層新增一個偏置項。偏置項將一個平面轉換到最佳擬合位置。在 y=mx+b 式中,b 是偏置項,使直線能夠向上或向下移動到最佳的擬合位置。

這裡寫圖片描述
優化函式

    Adam:收斂速度快。可以無腦用。在 TensorFlow 環境下使用 ADAM 時,請注意:如果你想要儲存和恢復模型權重,請記住在設定完 AdamOptimizer 後設置 Saver,這是因為 ADAM 也有需要恢復的狀態(即對應於每個權重的學習率)。在隨機梯度下降(SGD)中,降低學習率是很常見的,但是 ADAM 天然地就考慮到了這個問題。可以不使用學習率衰減。
    SGD+Momentum:效果比Adam可能好,但速度稍慢。m取值0.5 0.95 0.9 0.99
    梯度截斷: 限制最大梯度 或者設定閥值,讓梯度強制等於5,10,20等。

卷積步幅,池化

    strides:取小值,常取1,2,
    filter數量翻倍(數量2^n,第一層不宜太少,n為層數)。反捲積相反。
    kernel size:流行使用小size(3*3),注意對於大目標,感受野太小可能影響效能。尤其對於FCN,FC全連線畢竟具有全域性視野。
    pooling:常取2*2

資料集、輸入預處理和輸出

如何判斷是否應該收集更多資料:
首先判斷當前模型是否在該訓練集上效能良好,如果在當前訓練集上效能就很差,此時應該注重提高模型,增加網路層或隱藏單元等。如果使用更大模型後還是效果不佳,此時應考慮是否是資料集質量不佳(包含太多噪聲等),或模型存在根本錯誤。
然後如果模型在訓練集上效能可以接受,但在測試集上很差,此時可以考慮收集更多資料。但此時需要考慮收集資料的可行性和代價。如果代價太高,一個可行辦法是降低模型大小,改進正則化,調參等。通常在對數尺度上收集資料。

    儘可能獲得更多的資料(百萬級以上),移除不良資料(噪音、假資料或空值等,資料中出現nan值時會導致模型loss變成nan)。
    資料不足時做好Data Augment。對於影象可以水平翻轉,隨機裁剪crop,旋轉,扭曲,縮放,拉伸,改變色調,飽和度(HSV)等,還可以同時隨機組合。需注意改變後的圖片(垂直翻轉)是否符合實際,是否丟失重要特徵等問題。AlexNet對256的圖片進行224的隨機crop取樣,對每一張圖片,產生2048種不同的樣本,使用映象後,資料集翻了2048*2=4096倍。雖然大量的重取樣會導致資料的相關性,但避免了過擬合。至少比多個epoch輸入相同影象要好。AlexNet中還有一種Fancy PCA取樣方法。
    輸入訓練集一定要shuffle。注意keras中自帶的shuflle針對的是batch內部的打亂。
    輸入特徵歸一化,zero-center和normalize。PCA whitening一般不需要。還有處理到-11之間或01之間。當網路的權重在各個方向上延伸和擴充套件的程度越小,你的網路就能更快、更容易地學習。保持資料輸入以均值為中心且方差不變有助於實現這一點。
    預測目標(label)都做好歸一化。比如迴歸問題中,label相差過大(0.1和1000),做好normalization能統一量綱
    資料集類別不平衡問題:上取樣、下采樣。或者使用data augment方式對較少類別資料進行取樣。對類別不平衡進行loss,權重調整。或者將資料集按類別拆分,優先訓練數量多的類別資料,再訓練數量少的類別資料。
    不僅訓練集做好增強,測試集也最好做增強。保持二者分佈的一致性。
    label smoothing針對解決過擬合,不一定work。new_labels = (1.0 - label_smoothing) * one_hot_labels + label_smoothing / num_classes
    資料過少問題:資料增廣;半監督學習;遷移學習;領域自適應;主動學習。
    NLP中的資料增強:隨機刪除詞,同義詞替換,詞語順序打亂,randomly change one letter in a word, randomly delete one letter in a word,randomise tokens position, subsample number of tokens,enrich tokens with synonyms

# zero-center normalize
X -= np.mean(X, axis = 0)
X /= np.std(X, axis = 0)

    1
    2
    3

目標函式

    多工情況下, 各loss儘量限制在一個量級上, 初期可以著重一個任務的loss。
    focal loss可能有點作用

正則化

這裡寫圖片描述
如何判斷是否過擬合或者欠擬合:若訓練集準確率一直大幅度高於驗證集,說明模型過擬合,可以增大正則化強度,如增大L2正則懲罰,增加dropout的隨機失活率等。如果訓練集一直小幅度低於驗證集,說明稍微過擬合,而如果訓練集和驗證集的準確率不相上下,說明此時模型有點欠擬合,沒有很好地學習到特徵,可以調整模型寬度、深度等。
在訓練過程中L2範數使得權重分量儘可能均衡,即非0分量個數儘量稠密,而L1範數和L0範數儘可能使權重分量稀疏,即非0分量個數儘量少。
稀疏效能實現特徵的自動選擇。在我們事先假定的特徵中,有很多特徵對輸出的影響較小,可以看作是不重要的特徵。而正則化項會自動對特徵的係數引數進行懲罰,令某些特徵的權重係數為0或接近於0,自動選擇主要自變數或特徵。
如果當神經元的輸出接近於1的時候我們認為它被啟用,而輸出接近於0的時候認為它被抑制,那麼使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。
建議開始將正則項懲罰係數λ設定為0,待確定比較好的learning rate後,固定該learning rate。給λ一個值(比如1.0),然後根據validation accuracy,將λ增大或者減小10倍進行粗調,然後進行細調。

    注意除非資料集比較多(千萬級),否則一開始最好採用溫和一點的正則化。
    Dropout:相當簡單有效的一種方式,防止過擬合,取0.3 0.5(推薦,0.5時生成的組合網路最多) 0.7
    L2正則:較為常用的正則方式。在目標函式中新增關於權重的部分這裡寫圖片描述。
    L1正則:較為常用的正則方式。在目標函式中新增關於權重的部分這裡寫圖片描述。可以與L2連用這裡寫圖片描述。
    Max norm Constraints:由於它限制了權重大小,使用這個約束後,網路一般不會出現“爆炸”問題。

Esemble

    同樣的引數,不同的初始化方式。使用cross-validation找出最佳超參,然後使用不同引數初始化方式訓練多個模型。
    不同的引數,通過cross-validation,選取最好的幾組或效能較好的top-K組。
    同樣的引數,模型訓練的不同階段,即不同迭代次數的模型。
    不同的模型,進行線性融合. 例如RNN和傳統模型。
    不同訓練集訓練的模型提取不同特徵進行融合。

簡單點:投票法、平均法、加權平均法
stacking法:
這裡寫圖片描述
這裡寫圖片描述
第一層你有模型M1和M3,首先對M1使用5-fold訓練,得到5個模型,然後分別預測訓練集(5折中某1折)合併後生成第二層的訓練集F1,然後使用M1的5個子模型對測試集預測取均值T1,得到第二層的測試集。第一層模型M3同樣採用此方法生成F3和T3。這樣你的第二層模型M2就有訓練集(F1,F2),測試集(T1,T2),使用第二層模型進行訓練預測。
Blending法:
將資料劃分成train,test,然後將train劃分成不相交的兩部分train_1,train_2。
使用不同的模型對train_1訓練,對train_2和test預測,生成兩個1維向量,有多少模型就生成多少維向量。
第二層使用前面模型對train_2生成的向量和label作為新的訓練集,使用LR或者其他模型訓練一個新的模型來預測test生成的向量。
影象視覺化調參

    視覺化啟用層、引數層
    視覺化分析1 視覺化分析2
    視覺化輸出錯誤:通過判斷模型輸出錯誤的樣本,分析原因。
    視覺化啟用函式值和梯度的直方圖:隱藏單元的啟用值可以告訴我們單元飽和程度;梯度的快速增長和消失不利於模型優化;在一次小批量引數更新過程中梯度引數的更新最好在原引數的1%左右,而不是50%或0.001%。注意如果資料是稀疏的(如自然語言),那麼有些引數可能很少更新。
    tensorboard

其他

    早停
    label smothing,在ground truth和predication之間加上一個隨機值
    batchsize和lr存在一定關係,更大batch,梯度更穩定。在大的lr導致loss nan時可以試試。
    learning_rate/batch_size: see https://github.com/pjreddie/darknet/blob/master/src/convolutional_layer.c#L530
    decay * batch_size: see https://github.com/pjreddie/darknet/blob/master/src/convolutional_layer.c#L529
    檢查你矩陣的重構「reshape」。大幅度的矩陣重構(比如改變影象的 X、Y 維度)會破壞空間區域性性,使網路更不容易學習,因為這時網路也必須學習重構。使用多個影象/通道進行重構時要特別小心;可以使用 numpy.stack() 進行適當的對齊操作。

樣本不平衡問題

    過取樣:隨機取樣、SMOTE、RAMO、Random Balance;Cluster-based oversampling;DataBoost-IM;class-aware sampling
    欠取樣:隨機剔除、EasyEnsemble,one-sided selection;data decontamination
    閾值移動:
    代價敏感學習:
    focalloss,OHEM等

自動調參

    Random Search
    Gird Search
    Bayesian Optimization

減小記憶體

    使用更大步態
    使用1*1線性卷積核降維
    使用池化降維
    減小mini-batch大小
    將資料型別由32為改成為16位
    使用小的卷積核

Must Know Tips/Tricks in Deep Neural Networks
模型調參:超參調節tips總結
構建深度神經網路,我有20條「不成熟」的小建議
---------------------  
作者:青盞  
來源:CSDN  
原文:https://blog.csdn.net/qq_16234613/article/details/79596609  
版權宣告:本文為博主原創文章,轉載請附上博文連結!

 

問題背景(程式碼借鑑#########)

最近做深度學習實驗的時候遇到了一個很棘手的問題,那就是大名鼎鼎的“過擬合”,直觀地表現在圖中是長這個樣子的,分析來講就是說深度網路在擬合訓練集的時候是可以很好地實現,Loss很小,Accuracy很大(我這兒能達到99.99%),但是呢,測試集的Loss很大,Accuracy在一個比較低的範圍內波動(我這兒是70%-80%),並沒有像論文中說的那樣,測試集的Loss隨著迭代的增加而減小,Accuracy隨著迭代的增加而增大。

 

如果你沒有看出來上圖有什麼毛病的話,我就放一張理想狀態的結果圖做對比(如下圖粗粗的線),畫的比較挫,但是大概的意思在那兒,隨著迭代的增加,訓練集和測試集的精確度應該上升,我們可以容忍測試集的精確度沒有訓練集那麼高,畢竟有擬合的誤差,但是像上圖我做出來的結果那樣,一定是“過擬合”啦。

用白話來說“過擬合”就是:老師給你的題你都會做了,考試給你換個花樣你就懵逼了。好,老師給你的題就相當於我們的訓練資料,考試的題相當於測試資料,“過擬合”就是深度網路把訓練的資料擬合的特別好,但是有點好過頭了,對訓練資料當然是100%好用,但是一來測試資料就瘋了,那這樣的網路訓練出來其實是沒有用的,訓練集已經是監督學習了,擬合的再好也沒用。

體現在函式上就是下圖


正常是測試資料是一個線性或者二次多項式的分佈,如果過擬合了,深度網路很有可以弄出一個特別複雜的擬合曲線函式,把上面所有的黑點點都穿過,當然訓練資料的誤差超級小,但是測試資料一來整個的誤差就比較高了。


網路結構介紹

我實驗中用到的深度網路結構原型是Fully Convolutional Networks,參考的論文中也叫它U-Net,總之就是一個用來做影象分割的深度網路。示意圖如下:  
 用Keras的實現程式碼是:
大概的問題背景和網路結構介紹完畢,更多實驗Details請參考PET/CT images segmentation via U-Net, using keras.

問題分析

當年LeNet-5在手寫字的識別上出盡了風頭,但是當LeNet-5應用到其他資料集中的時候卻出現了很多問題,從此,學者們開始了瘋狂的理論、實踐探索。“過擬合”問題算是深度學習中一個特別重要的問題,老生常談了,也有不少解決的方法供我選擇。

舉例來講(感謝“知乎深度學習Keras”——QQ群中大神們的幫助):

1. 加入Dropout層

2. 檢查資料集是否過小(Data Augmentation)

3. 用一用遷移學習的思想

4. 調參小tricks.

    調小學習速率(Learning Rate)
    調小每次反向傳播的訓練樣本數(batch_size)

5. 試一試別的優化器(optimizer)

6. Keras的回撥函式EarlyStopping()

評價:我認為第一個是比較可行,因為“教科書”上的確有說dropout是專門用來對付“過擬合”問題的。

關於資料集的大小,這也是導致過擬合的原因,如果太小,很容易過擬合。那麼多大的資料集夠了呢?反正我的肯定夠了,我的深度網路輸入影象是369,468幅,68*80畫素的,二通道輸入,總共的大小是19.5GB。這個資料量可以說是十分可觀了,所以對我來說,第二條可能不適用。那麼如果想要擴充資料集,需要用到Data Augmentation,這個是在醫學影像中十分常用的手段,包括平移,旋轉,拉伸,扭曲等等變換造出新的資料,來增加資料量。

第三條是深度學習中比較有效的方法了,英文名叫fine-tuning,就是用已有的訓練完的網路引數作為初始化,在這個基礎上繼續訓練。原來的網路引數往往會在很多論文和github裡頭能找到,這是在很大的影象資料集中訓練完的網路,根據圖形影象的“語義”相似性(我也不知道該怎麼描述,就是認為世界上的圖片都有某種相似性,就像人類,每個人都長得不一樣,但是你不會把人和其他動物混在一起,這就是一個巨集觀的,抽象的相似性),把這個網路“遷移”到一個新的影象資料集中是有一定的道理的。由於時間原因,我暫時還沒有采用這個。

第四條就是比較說不清道不明的調參了,這幾乎是機器學習的主要話題,人說“有多少人工,就有多少智慧”,這個調參真的需要“經驗”啊哈哈哈。

不好意思,第五條又是試湊法。。。可供選擇的Optimizers有很多,都試一下,看看用哪兒效果好,聽上去有點喪心病狂了。

第六條方法是一個小函式,叫做EarlyStopping,程式碼如下

early_stopping = EarlyStopping(monitor = 'val_loss', patience = 5)

作用是監視每次迭代的指標,比如說這兒監視的是val_loss(測試集的Loss),隨著迭代的增加,當val_loss不再發生大的變化的時候可以終止訓練,在過擬合之前阻斷。這種策略也稱為“No-improvement-in-n”,n就是Epoch的次數。

不幸的是,以上六個方案,我測試了以後都沒有很好地解決“過擬合”問題。

 
 正則化方法

正則化方法是指在進行目標函式或代價函式優化時,在目標函式或代價函式後面加上一個正則項,一般有L1正則與L2正則等。這個很理論了,會涉及到一些公式。

 

這部分內容我在學習的時候就當它純理論來記,當時根本沒有想過會去真正用它,看來現在是必須要try一下了。

要在Keras中修改這部分代價函式(Objectives)的程式碼,可以參考這部分內容,裡面包括了若干個代價函式,如果想要自己編寫代價函式也可以的。根據這個部落格:基於Theano的深度學習(Deep Learning)框架Keras學習隨筆-08-規則化(規格化),有效解決過擬合的方法就是加入規則項。具體的規則化可以參見深度學習(DL)與卷積神經網路(CNN)學習筆記隨筆-04-基於Python的LeNet之MLP中對於規則化的介紹。博主Tig_Free是真神啊,膜拜一下!


問題解決

最終,過擬合的現象基本上被控制住了,總的來說,L1/L2規範化的確是很牛逼,在學術論文中也有所體現:

網路調整如下:

model = Sequential()
    
    model.add(Convolution2D(64, 4, 4, border_mode='valid', input_shape=data.shape[-3:]))
    model.add(Convolution2D(64, 3, 3, border_mode='valid'))
    model.add(Activation('relu'))
    model.add(Dropout(0.3))    
    #model.add(BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Convolution2D(64, 4, 4, border_mode='valid'))
    model.add(Convolution2D(64, 3, 3, border_mode='valid'))    
    model.add(Activation('relu'))
    model.add(Dropout(0.3))    
    #model.add(BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
        
    model.add(Convolution2D(128, 4, 4, border_mode='valid'))
    model.add(Activation('relu'))
    model.add(Dropout(0.3))    
    #model.add(BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one'))
        
    model.add(Convolution2D(128, 3, 3, border_mode='valid'))
    model.add(Activation('relu'))    
    model.add(Dropout(0.3))    
    #model.add(BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one'))    
    
    model.add(Convolution2D(128, 3, 3, border_mode='valid'))
    model.add(Activation('relu'))
    model.add(Dropout(0.3))
    #model.add(BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one'))
    model.add(MaxPooling2D(pool_size=(2, 2)))        
    
    model.add(Flatten())
    model.add(Dense(512, init='normal',W_regularizer=l2(0.02), activity_regularizer=activity_l2(0.01)))
    model.add(Activation('relu'))
    model.add(Dropout(0.3))
            
    model.add(Dense(512, init='normal',W_regularizer=l2(0.02), activity_regularizer=activity_l2(0.01)))
    model.add(Activation('relu'))
    model.add(Dropout(0.3))
            
    model.add(Dense(LABELTYPE, init='normal'))
    model.add(Activation('softmax'))


配置:)

    dropout層(0.3)
    全連線層的L2規範化
    優化器(adadelta)
    學習速率(1e-9)

達到的效果比較令人滿意,不僅訓練集的Loss在降低,Acc在上升,測試集的Loss也同樣降低,測試集的Acc在上升,整體的網路學習效能也變得比以前好了。

至此,深度網路的過擬合問題暫時告一段落。


關於過擬合的參考材料

機器學習中使用「正則化來防止過擬合」到底是一個什麼原理?為什麼正則化項就可以防止過擬合?

機器學習中防止過擬合的處理方法

用簡單易懂的語言描述「過擬合 overfitting」?

Reducing Overfitting in Deep Networks by Decorrelating Representations. Michael Cogswell, Faruk Ahmed, Ross Girshick, Larry Zitnick, Dhruv Batra (2015)

Dropout: A Simple Way to Prevent Neural Networks from Overfitting. N Srivastava, G Hinton, A Krizhevsky, I Sutskever, R Salakhutdinov (2014)

Overfitting & Regularization (牆)

Regularization in Statistics. PJ Bickel, B Li (2006)

Overfitting, Regularization, and Hyperparameters (牆)

Overfitting. by Hal Daume III (牆)

Data Science 101: Preventing Overfitting in Neural Networks. by Nikhil Buduma (牆)
---------------------  
作者:MrGiovanni  
來源:CSDN  
原文:https://blog.csdn.net/mrgiovanni/article/details/52167016  
版權宣告:本文為博主原創文章,轉載請附上博文連結!