溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

keras模型用于預測時需要注意什么

發(fā)布時間:2020-06-28 12:20:39 來源:億速云 閱讀:163 作者:清晨 欄目:開發(fā)技術

這篇文章將為大家詳細講解有關keras模型用于預測時需要注意什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

為什么訓練誤差比測試誤差高很多?

一個Keras的模型有兩個模式:訓練模式測試模式一些正則機制,如Dropout,L1/L2正則項在測試模式下將不被啟用。

另外,訓練誤差是訓練數(shù)據(jù)每個batch的誤差的平均。在訓練過程中,每個epoch起始時的batch的誤差要大一些,而后面的batch的誤差要小一些。另一方面,每個epoch結束時計算的測試誤差是由模型在epoch結束時的狀態(tài)決定的,這時候的網絡將產生較小的誤差。

【Tips】可以通過定義回調函數(shù)將每個epoch的訓練誤差和測試誤差并作圖,如果訓練誤差曲線和測試誤差曲線之間有很大的空隙,說明你的模型可能有過擬合的問題。當然,這個問題與Keras無關。

在keras中文文檔中指出了這一誤區(qū),筆者認為產生這一問題的原因在于網絡實現(xiàn)的機制。即dropout層有前向實現(xiàn)和反向實現(xiàn)兩種方式,這就決定了概率p是在訓練時候設置還是測試的時候進行設置

利用預訓練的權值進行Fine tune時的注意事項:

不能把自己添加的層進行將隨機初始化后直接連接到前面預訓練后的網絡層

in order to perform fine-tuning, all layers should start with properly trained weights: for instance you should not slap a randomly initialized fully-connected network on top of a pre-trained convolutional base. This is because the large gradient updates triggered by the randomly initialized weights would wreck the learned weights in the convolutional base. In our case this is why we first train the top-level classifier, and only then start fine-tuning convolutional weights alongside it.

we choose to only fine-tune the last convolutional block rather than the entire network in order to prevent overfitting, since the entire network would have a very large entropic capacity and thus a strong tendency to overfit. The features learned by low-level convolutional blocks are more general, less abstract than those found higher-up, so it is sensible to keep the first few blocks fixed (more general features) and only fine-tune the last one (more specialized features).

fine-tuning should be done with a very slow learning rate, and typically with the SGD optimizer rather than an adaptative learning rate optimizer such as RMSProp. This is to make sure that the magnitude of the updates stays very small, so as not to wreck the previously learned features.

補充知識:keras框架中用keras.models.Model做的時候預測數(shù)據(jù)不是標簽的問題

我們發(fā)現(xiàn),在用Sequential去搭建網絡的時候,其中有predict和predict_classes兩個預測函數(shù),前一個是返回的精度,后面的是返回的具體標簽。但是,在使用keras.models.Model去做的時候,就會發(fā)現(xiàn),它只有一個predict函數(shù),沒有返回標簽的predict_classes函數(shù),所以,針對這個問題,我們將其改寫。改寫如下:

def my_predict_classes(predict_data):
  if predict_data.shape[-1] > 1:
    return predict_data.argmax(axis=-1)
  else:
    return (predict_data > 0.5).astype('int32')
 
# 這里省略網絡搭建部分。。。。
 
model = Model(data_input, label_output)
model.compile(loss='categorical_crossentropy',
       optimizer=keras.optimizers.Nadam(lr=0.002),
       metrics=['accuracy'])
model.summary()
 
y_predict = model.predict(X_test)
y_pre = my_predict_classes(y_predict)

這樣,y_pre就是具體的標簽了。

關于keras模型用于預測時需要注意什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI