淺談Keras中shuffle和validation_split的順序
模型的fit函式有兩個引數,shuffle用於將資料打亂,validation_split用於在沒有提供驗證集的時候,按一定比例從訓練集中取出一部分作為驗證集
這裡有個陷阱是,程式是先執行validation_split,再執行shuffle的,所以會出現這種情況:
假如你的訓練集是有序的,比方說正樣本在前負樣本在後,又設定了validation_split,那麼你的驗證集中很可能將全部是負樣本
同樣的,這個東西不會有任何錯誤報出來,因為Keras不可能知道你的資料有沒有經過shuffle,保險起見如果你的資料是沒shuffle過的,最好手動shuffle一下
補充知識:Keras使用陷阱
1 TF卷積核與TH卷積核
Keras提供了兩套後端,Theano和Tensorflow。如果你從無到有搭建自己的一套網路,則大可放心。但如果你想使用一個已有網路,或把一個用th/tf 訓練的網路以另一種後端應用,在載入的時候你就應該特別小心了。
卷積核與所使用的後端不匹配,不會報任何錯誤,因為它們的shape是完全一致的,沒有方法能夠檢測出這種錯誤。
在使用預訓練模型時,一個建議是首先找一些測試樣本,看看模型的表現是否與預計的一致。
如需對卷積核進行轉換,可以使用utils.convert_all_kernels_in_model對模型的所有卷積核進行轉換
2 向BN層中載入權重
如果你不知道從哪裡淘來一個預訓練好的BN層,想把它的權過載入到Keras中,要小心引數的載入順序。
一個典型的例子是,將caffe的BN層引數載入Keras中,caffe的BN由兩部分構成,bn層的引數是mean,std,scale層的引數是gamma,beta。
按照BN的文章順序,似乎載入Keras BN層的引數應該是[mean,std,gamma,beta];
然而不是的,Keras的BN層引數順序應該是[gamma,beta,mean,std],這是因為gamma和beta是可訓練的引數,而mean和std不是。Keras的可訓練引數在前,不可訓練引數在後
錯誤的權重順序不會引起任何報錯,因為它們的shape完全相同
3 shuffle和validation_split的順序
模型的fit函式有兩個引數,shuffle用於將資料打亂,validation_split用於在沒有提供驗證集的時候,按一定比例從訓練集中取出一部分作為驗證集.
這裡有個陷阱是,程式是先執行validation_split,再執行shuffle的,所以會出現這種情況:
假如你的訓練集是有序的,比方說正樣本在前負樣本在後,又設定了validation_split,那麼你的驗證集中很可能將全部是負樣本。
同樣的,這個東西不會有任何錯誤報出來,因為Keras不可能知道你的資料有沒有經過shuffle,保險起見如果你的資料是沒shuffle過的,最好手動shuffle一下。
4 Merge層的層物件與函式方法
Keras定義了一套用於融合張量的方法,位於keras.layers.Merge,裡面有兩套工具,以大寫字母開頭的是Keras Layer類,使用這種工具是需要例項化一個Layer物件,然後再使用。以小寫字母開頭的是張量函式方法,本質上是對Merge Layer物件的一個包裝,但使用更加方便一些。注意辨析。
以上這篇淺談Keras中shuffle和validation_split的順序就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。