1. 程式人生 > 程式設計 >keras中模型訓練class_weight,sample_weight區別說明

keras中模型訓練class_weight,sample_weight區別說明

keras 中fit(self,x=None,y=None,batch_size=None,epochs=1,verbose=1,callbacks=None,validation_split=0.0,

validation_data=None,shuffle=True,class_weight=None,sample_weight=None,initial_epoch=0,

steps_per_epoch=None,validation_steps=None)

官方文件中:

class_weight:字典,將不同的類別對映為不同的權值,該引數用來在訓練過程中調整損失函式(只能用於訓練)。該引數在處理非平衡的訓練資料(某些類的訓練樣本數很少)時,可以使得損失函式對樣本數不足的資料更加關注。

sample_weight:權值的numpy array,用於在訓練時調整損失函式(僅用於訓練)。可以傳遞一個1D的與樣本等長的向量用於對樣本進行1對1的加權,或者在面對時序資料時,傳遞一個的形式為(samples,sequence_length)的矩陣來為每個時間步上的樣本賦不同的權。這種情況下請確定在編譯模型時添加了sample_weight_mode='temporal'。

class_weight---主要針對的上資料不均衡問題,比如:異常檢測的二項分類問題,異常資料僅佔1%,正常資料佔99%; 此時就要設定不同類對loss的影響。

sample_weigh---主要解決的是樣本質量不同的問題,比如前1000個樣本的可信度,那麼它的權重就要高,後1000個樣本可能有錯、不可信,那麼權重就要調低。

補充知識:Keras 中資料不均衡時,metrics,class_weight的設定方法

當資料處理不均衡時,比如處理癌症訓練問題,有病樣本很少,參考:

http://www.deepideas.net/unbalanced-classes-machine-learning/

主要從兩個方面著手:

一、loss函式的權重問題

訓練時,設定的權重:

class_weight={
  1: n_non_cancer_samples / n_cancer_samples * t
}

二、編譯時設定模型的metrics

def sensitivity(y_true,y_pred):
  true_positives = K.sum(K.round(K.clip(y_true * y_pred,1)))
  possible_positives = K.sum(K.round(K.clip(y_true,1)))
  return true_positives / (possible_positives + K.epsilon())

def specificity(y_true,y_pred):
  true_negatives = K.sum(K.round(K.clip((1-y_true) * (1-y_pred),1)))
  possible_negatives = K.sum(K.round(K.clip(1-y_true,1)))
  return true_negatives / (possible_negatives + K.epsilon())
model.compile(
  loss='binary_crossentropy',optimizer=RMSprop(0.001),metrics=[sensitivity,specificity]
)

以上這篇keras中模型訓練class_weight,sample_weight區別說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。