寫這篇博客的原因主要是為了總結下在深度學習中我們常會遇到的一些問題,以及不知道如何解決,我准備把這個部分作為一個系列,為了讓大家少走一些坑,對於本博客有什么錯誤,歡迎大家指出,下面切入正題吧。
1. 深度學習,一個令人頭疼的問題就是如何調參?
簡而言之,如果數據集復雜的話,那么就要增加網絡的層數,模型欠擬合了,加節點。
2. 關於驗證集的loss曲線和acc曲線震盪,不平滑問題
出現loss震盪不平滑的原因可能如下:
(1) 學習率可能太大
(2) batch size太小
(3) 樣本分布不均勻
(4) 加入正則化
3. 對於模型過擬合問題
(1) 換一個簡單模型
(2) 增加數據
4. 對於自己定義的損失函數,如果我們加載模型常會提示loss出錯,此時解決方法有兩個:
(1) 首先用json保存模型用,然后保存權重,加載模型時,先load模型,然后載入權重
(2) load_model函數提供了參數,所以加載時需要加入這個參數,假設自定義參數loss的函數名為cosloss,所以加載時應采用以下方式
- model = load_model('model.h5', {'cosloss':cosloss})
5. 在keras中如果想輸出訓練過程中訓練集合驗證集准確值和損失值得變化,可以采用回調函數,具體參考以下方式:
- history=model.fit()
- plt.plot()
- plt.plot(history.history['val_acc'])
- plt.title('model accuracy')
- plt.ylabel('accuracy')
- plt.xlabel('epoch')
- plt.legend(['train', 'test'], loc='upper left')
- plt.show()
- # summarize history for loss
- plt.plot(history.history['loss'])
- plt.plot(history.history['val_loss'])
- plt.title('model loss')
- plt.ylabel('loss')
- plt.xlabel('epoch')
- plt.legend(['train', 'test'], loc='upper left')
- plt.show()
說明:如果你想把每個epoch的accuray結果保存在txt中也是可以的
- accy=history.history['acc']
- np_accy=np.array(accy)
- np.savetxt('save.txt',np_accy)
6. 如果訓練中發現loss的值為NAN,這時可能的原因如下:
(1)學習率太高
(2)如果是自己定義的損失函數,這時候可能是你設計的損失函數有問題
7. 對於新手來說,一個比較困惑的地方可能就是不明白,loss值和acc之間的關系,有時候即使acc高,但是loss值也高
一般來說,較高的acc對應的loss較低,但這不是絕對,畢竟他們是兩個不同的東西,所以在實際實現中,我們可以對兩者進行一個微調。
8. 關於模型epoch輪數?對於一個新模型,迭代多少次才可以收斂,具體應該怎么設置
關於epoch設置問題,我們可以設置回調函數,選擇驗證集最高的acc作為最優模型。
9. 關於BN和dropout,應該使用哪個?
其實這兩個是兩個完全不同的東西,BN針對數據分布,dropout是從模型結構方面優化,所以他們兩個可以一起使用,對於BN來說其不但可以防止過擬合,還可以防止梯度消失等問題,並且可以加快模型的收斂速度,但是加了BN,模型訓練往往會變得慢些。
10. 這一條作為總結吧,多看看keras官方文檔,里面基本能找到你需要的東西。這篇暫時就醬~