Keras計算F1_score

實現代碼:

from keras.callbacks import Callback
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score

class Metrics(Callback):
    def on_train_begin(self, logs={}):
        self.val_f1s = []
        self.val_recalls = []
        self.val_precisions = []

    def on_epoch_end(self, epoch, logs={}):
        val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()##.model
        val_targ = self.validation_data[1]###.model
        _val_f1 = f1_score(val_targ, val_predict,average='micro')
        _val_recall = recall_score(val_targ, val_predict,average=None)###
        _val_precision = precision_score(val_targ, val_predict,average=None)###
        self.val_f1s.append(_val_f1)
        self.val_recalls.append(_val_recall)
        self.val_precisions.append(_val_precision)
        #print("— val_f1: %f — val_precision: %f — val_recall: %f" %(_val_f1, _val_precision, _val_recall))
        print("— val_f1: %f "%_val_f1)
        return

f1=Metrics()
hist=cnn_net.fit(x_train,y_train,batch_size=batch_size,epochs=35,verbose=1,validation_data=(x_train,y_train),callbacks=[f1])#50validation_split=0.3

問題一:用print輸出_val_f1, _val_precision, _val_recall時,會報錯:TypeError: only length-1 arrays can be converted to Python scalars

目前還不知道原因,但是隻輸出 _val_f1卻不會報錯。

問題二:直接調用別人代碼

_val_f1 = f1_score(val_targ, val_predict)

_val_recall = recall_score(val_targ, val_predict)

_val_precision = precision_score(val_targ, val_predict) 

會報錯:ValueError: Target is multilabel-indicator but average='binary'. Please choose another average setting.

添加參數 average後,未報錯。參考sklearn metrics for multiclass classification

問題三:計算F1要添加validation_data,我的代碼中爲了方便直接用的訓練集。直接調用

self.model.validation_data[0]  

self.model.validation_data[1]

會報錯:AttributeError: 'Sequential' object has no attribute 'validation_data'

應該將其改爲self.validation_data[0]   self.validation_data[1],參考Sequential has no attribution “validation_data”

代碼參考:keras實現f1_score(多分類、二分類)keras裏面如何計算f1-score

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章