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, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 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), 0, 1))) possible_negatives = K.sum(K.round(K.clip(1-y_true, 0, 1))) return true_negatives / (possible_negatives + K.epsilon()) model.compile( loss='binary_crossentropy', optimizer=RMSprop(0.001), metrics=[sensitivity, specificity] )
[niceskyabc ] keras中模型訓練class已經有242次圍觀