歡迎您光臨本站 註冊首頁

keras做CNN的訓練誤差loss的下降操作

←手機掃碼閱讀     retouched @ 2020-06-23 , reply:0

採用二值判斷如果確認是噪聲,用該點上面一個灰度進行替換。

噪聲點處理:對原點周圍的八個點進行掃描,比較。當該點像素值與周圍8個點的值小於N時,此點為噪點 。

處理後的文件大小隻有原文件小的三分之一,前後的圖片內容肉眼幾乎無法察覺。

但是這樣處理後圖片放入CNN中在其他條件不變的情況下,模型loss無法下降,二分類圖片,loss一直在8-9之間。準確率維持在0.5,同時,測試集的訓練誤差持續下降,但是準確率也在0.5徘徊。大概真是需要誤差,讓優化方法從局部最優跳出來。

使用的activation function是relu,full connection layer是softmax分類函數,優化方法為RMsprop

難到是需要加入噪音更好,CNN中加入高斯噪音不是讓模型更穩健的嗎?還有讓模型跳出局部最優的好處,方便訓練。

原意:降噪的目的是因為這批數據是樣本較少,用複印機 掃面出來的圖片,想著放入更乾淨的數據,模型更容易學習到本質特徵。

結果事與願違,但是在keras中是可以加入noise的,比如加入高斯噪音

form keras.layers.noise import GaussianNoise

我在全連接層中加入

model.add(GaussianNoise(0.125))

後來查看了BatchNormalization的作用,發現在這個大殺器之後,好像很少有人用到初始化和其他的tricks,就可以讓模型表現的很好。

在第一層的Maxpooling後面加上,model.add(BatchNormalization()),效果非常顯著,第一次epoch的loss值只有0.63,acc也迅速上升,不會出現之前的卡在8.354一直不動,哪怕更換 leraning rate和使用Adagrad,都是一樣的,如果前面的5個epoch完,還是沒有太大的變化,後面幾乎不會收斂。

1,leraning rate的設置

  #導入模塊,以rmsprop為例  from keras.optimizers import rmsprop  rmsprop=rmsprop(lr=0.1)#只是更改了學習率,其他的參數沒有更改,默認學習率是0.001

 

2.BatchNormalization()的設置

  from keras.layers.normalization import BatchNormalization    #網上不少人說,批規範化 加在輸入層的激活函數(層)的前面    model.add(BatchNormalization())

 

也有看到每一個隱藏層的激活函數前面全部加上BN的,但是我這個實驗中,效果很差。

3.在輸入數據的時候,依然加上train_x = data/255.0,對像素矩陣的取值放小到0-1之間,否則訓練將很艱難。

其實在我自己的實驗中,後來調整成:

train_x-= np.mean(train_x, axis = 0)

發現效果更好

4.如果第一次的epoch的loss在個位數,則很可能需要返回去重新構建模型,加入更多的trick,如果最後的loss值依然沒有達到小數,則也可能是難於訓練,也需要加入其他的技巧。或者模型搭建的有問題,需要慎重檢查。

5. 建議使用網格搜索,從最重要的參數開始,搭建一個簡單的模型,然後取合理的超參數,逐一進行。

6 .也可以在卷積層中加正則化,比如:

C1 = Convolution2D(8 3, 3, border_mode='valid', init='he_uniform', activation='relu',W_regularizer=l2(regularizer_params))

7.有看到在kaggle中使用集成cnn的,分類錯誤率確實有下降。

8 使用ReduceLROnPlateau 對學習率進行衰減,當下降很慢時,學習率自動調整,可以起到一部分作用,

我在模型中使用的是RMSprop ,RMSprop本身帶有學習率的自動調整,但是,我加上ReduceLROnPlateau ,依然可以看到學習率變化很慢時,設置的這個ReduceLROnPlateau 有調整。

9 用數據增強的時候,也需要小心,圖片調整的幅度等均會對模型的正確率有影響。

10,對3個顏色的圖像轉換為gray以後,分類準確率穩定在 0.5左右,幾乎就是廢掉了,說明圖像的像素對於模型的影響巨大,後來瞭解到有“圖像超分辨率重建Super-Resolution”其實是可以對圖像做像素的分辨率更高。當然也是可以手工用PS進行插值等修圖。查了下,像mnist這樣的數據集都是經過處理後才放入模型中的,所以,不能完全指望著CNN卷積池化就把所有的問題都解決掉,儘管圖像分類和識別正在像CNN轉移。

keras遇到的坑(可能是水平的問題,總之有困惑)

(1) 多次運行會在上一次運行過的數據上起作用,比如,

train_x , val_x , train_y, val_y = train_test_split(train_x, train_y, test_size=0.1, random_state=random_seed)

如果多次運行,則1000個數據,900個訓練集的,下一次變成,900*0.9=810個數據,同時,還發現,

train_y = to_categorical(label, num_classes =2),這裡也可能出現問題,比如,二分類,在第一次運行後是,2行

第二次運行就變成4行

(2) 在做交叉驗證時

新版本epoch的寫法是epochs=

estimator = KerasClassifier(build_fn=baseline_model, epochs=20, batch_size=32, verbose=2)

如果用成下面老版本,則n_epoch無法讀取,運行的時候,默認的是1所以我定義的 n_epoch=20是失效。

estimator = KerasClassifier(build_fn=baseline_model, n_epoch=20, batch_size=32, verbose=2)

補充知識:keras中loss與val_loss的關係

loss是訓練集的損失值,val_loss是測試集的損失值

以下是loss與val_loss的變化反映出訓練走向的規律總結:

train loss 不斷下降,test loss不斷下降,說明網絡仍在學習;(最好的)

train loss 不斷下降,test loss趨於不變,說明網絡過擬合;(max pool或者正則化)

train loss 趨於不變,test loss不斷下降,說明數據集100%有問題;(檢查dataset)

train loss 趨於不變,test loss趨於不變,說明學習遇到瓶頸,需要減小學習率或批量數目;(減少學習率)

train loss 不斷上升,test loss不斷上升,說明網絡結構設計不當,訓練超參數設置不當,數據集經過清洗等問題。(最不好的情況)         


[retouched ] keras做CNN的訓練誤差loss的下降操作已經有296次圍觀

http://coctec.com/docs/python/shhow-post-239475.html