keras做CNN的訓(xùn)練誤差loss的下降操作
采用二值判斷如果確認(rèn)是噪聲,用該點上面一個灰度進(jìn)行替換。
噪聲點處理:對原點周圍的八個點進(jìn)行掃描,比較。當(dāng)該點像素值與周圍8個點的值小于N時,此點為噪點 。
處理后的文件大小只有原文件小的三分之一,前后的圖片內(nèi)容肉眼幾乎無法察覺。
但是這樣處理后圖片放入CNN中在其他條件不變的情況下,模型loss無法下降,二分類圖片,loss一直在8-9之間。準(zhǔn)確率維持在0.5,同時,測試集的訓(xùn)練誤差持續(xù)下降,但是準(zhǔn)確率也在0.5徘徊。大概真是需要誤差,讓優(yōu)化方法從局部最優(yōu)跳出來。
使用的activation function是relu,full connection layer是softmax分類函數(shù),優(yōu)化方法為RMsprop
難到是需要加入噪音更好,CNN中加入高斯噪音不是讓模型更穩(wěn)健的嗎?還有讓模型跳出局部最優(yōu)的好處,方便訓(xùn)練。
原意:降噪的目的是因為這批數(shù)據(jù)是樣本較少,用復(fù)印機(jī) 掃面出來的圖片,想著放入更干凈的數(shù)據(jù),模型更容易學(xué)習(xí)到本質(zhì)特征。
結(jié)果事與愿違,但是在keras中是可以加入noise的,比如加入高斯噪音
form keras.layers.noise import GaussianNoise
我在全連接層中加入
model.add(GaussianNoise(0.125))
后來查看了BatchNormalization的作用,發(fā)現(xiàn)在這個大殺器之后,好像很少有人用到初始化和其他的tricks,就可以讓模型表現(xiàn)的很好。
在第一層的Maxpooling后面加上,model.add(BatchNormalization()),效果非常顯著,第一次epoch的loss值只有0.63,acc也迅速上升,不會出現(xiàn)之前的卡在8.354一直不動,哪怕更換 leraning rate和使用Adagrad,都是一樣的,如果前面的5個epoch完,還是沒有太大的變化,后面幾乎不會收斂。
1,leraning rate的設(shè)置
#導(dǎo)入模塊,以rmsprop為例 from keras.optimizers import rmsprop rmsprop=rmsprop(lr=0.1)#只是更改了學(xué)習(xí)率,其他的參數(shù)沒有更改,默認(rèn)學(xué)習(xí)率是0.001
2.BatchNormalization()的設(shè)置
from keras.layers.normalization import BatchNormalization #網(wǎng)上不少人說,批規(guī)范化 加在輸入層的激活函數(shù)(層)的前面 model.add(BatchNormalization())
也有看到每一個隱藏層的激活函數(shù)前面全部加上BN的,但是我這個實驗中,效果很差。
3.在輸入數(shù)據(jù)的時候,依然加上train_x = data/255.0,對像素矩陣的取值放小到0-1之間,否則訓(xùn)練將很艱難。
其實在我自己的實驗中,后來調(diào)整成:
train_x-= np.mean(train_x, axis = 0)
發(fā)現(xiàn)效果更好
4.如果第一次的epoch的loss在個位數(shù),則很可能需要返回去重新構(gòu)建模型,加入更多的trick,如果最后的loss值依然沒有達(dá)到小數(shù),則也可能是難于訓(xùn)練,也需要加入其他的技巧?;蛘吣P痛罱ǖ挠袉栴},需要慎重檢查。
5. 建議使用網(wǎng)格搜索,從最重要的參數(shù)開始,搭建一個簡單的模型,然后取合理的超參數(shù),逐一進(jìn)行。
6 .也可以在卷積層中加正則化,比如:
C1 = Convolution2D(8 3, 3, border_mode='valid', init='he_uniform', activation='relu',W_regularizer=l2(regularizer_params))
7.有看到在kaggle中使用集成cnn的,分類錯誤率確實有下降。
8 使用ReduceLROnPlateau 對學(xué)習(xí)率進(jìn)行衰減,當(dāng)下降很慢時,學(xué)習(xí)率自動調(diào)整,可以起到一部分作用,
我在模型中使用的是RMSprop ,RMSprop本身帶有學(xué)習(xí)率的自動調(diào)整,但是,我加上ReduceLROnPlateau ,依然可以看到學(xué)習(xí)率變化很慢時,設(shè)置的這個ReduceLROnPlateau 有調(diào)整。
9 用數(shù)據(jù)增強(qiáng)的時候,也需要小心,圖片調(diào)整的幅度等均會對模型的正確率有影響。
10,對3個顏色的圖像轉(zhuǎn)換為gray以后,分類準(zhǔn)確率穩(wěn)定在 0.5左右,幾乎就是廢掉了,說明圖像的像素對于模型的影響巨大,后來了解到有“圖像超分辨率重建Super-Resolution”其實是可以對圖像做像素的分辨率更高。當(dāng)然也是可以手工用PS進(jìn)行插值等修圖。查了下,像mnist這樣的數(shù)據(jù)集都是經(jīng)過處理后才放入模型中的,所以,不能完全指望著CNN卷積池化就把所有的問題都解決掉,盡管圖像分類和識別正在像CNN轉(zhuǎn)移。
keras遇到的坑(可能是水平的問題,總之有困惑)
(1) 多次運行會在上一次運行過的數(shù)據(jù)上起作用,比如,
train_x , val_x , train_y, val_y = train_test_split(train_x, train_y, test_size=0.1, random_state=random_seed)
如果多次運行,則1000個數(shù)據(jù),900個訓(xùn)練集的,下一次變成,900*0.9=810個數(shù)據(jù),同時,還發(fā)現(xiàn),
train_y = to_categorical(label, num_classes =2),這里也可能出現(xiàn)問題,比如,二分類,在第一次運行后是,2行
第二次運行就變成4行
(2) 在做交叉驗證時
新版本epoch的寫法是epochs=
estimator = KerasClassifier(build_fn=baseline_model, epochs=20, batch_size=32, verbose=2)
如果用成下面老版本,則n_epoch無法讀取,運行的時候,默認(rèn)的是1所以我定義的 n_epoch=20是失效。
estimator = KerasClassifier(build_fn=baseline_model, n_epoch=20, batch_size=32, verbose=2)
補(bǔ)充知識:keras中l(wèi)oss與val_loss的關(guān)系
loss是訓(xùn)練集的損失值,val_loss是測試集的損失值
以下是loss與val_loss的變化反映出訓(xùn)練走向的規(guī)律總結(jié):
train loss 不斷下降,test loss不斷下降,說明網(wǎng)絡(luò)仍在學(xué)習(xí);(最好的)
train loss 不斷下降,test loss趨于不變,說明網(wǎng)絡(luò)過擬合;(max pool或者正則化)
train loss 趨于不變,test loss不斷下降,說明數(shù)據(jù)集100%有問題;(檢查dataset)
train loss 趨于不變,test loss趨于不變,說明學(xué)習(xí)遇到瓶頸,需要減小學(xué)習(xí)率或批量數(shù)目;(減少學(xué)習(xí)率)
train loss 不斷上升,test loss不斷上升,說明網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計不當(dāng),訓(xùn)練超參數(shù)設(shè)置不當(dāng),數(shù)據(jù)集經(jīng)過清洗等問題。(最不好的情況)
以上這篇keras做CNN的訓(xùn)練誤差loss的下降操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 判斷網(wǎng)絡(luò)連通的實現(xiàn)方法
下面小編就為大家分享一篇python 判斷網(wǎng)絡(luò)連通的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04opencv 形態(tài)學(xué)變換(開運算,閉運算,梯度運算)
這篇文章主要介紹了opencv 形態(tài)學(xué)變換(開運算,閉運算,梯度運算),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Django報錯TemplateDoesNotExist的問題及解決
這篇文章主要介紹了Django報錯TemplateDoesNotExist的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)對切片命名清除索引的方法
這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)對切片命名清除索引的方法,結(jié)合實例形式分析了Python字符串截取及indices方法映射序列的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03