训练过程acc_KERAS(4.调整metrics-附带训练过程中recall及precision输出)

在Keras 2.0后,训练过程中的准确率、召回率和查准率不再默认显示,需要自定义计算函数。本文介绍了如何在训练时添加recall和precision的计算,并通过实例展示了不同迭代次数下的模型表现,从欠拟合到模型能力增强的过程。
摘要由CSDN通过智能技术生成

====

有些鬼人是真的嘴碎,本文原标题只是调整metrics,并没有说给你真的recall和precision的计算方式,不知道伸手党哪来的脸瞎喷什么鬼,好吧我承认之前年轻不知道抄人家代码要转载,现在我看了一下人家代码,确实有问题,现在修改了,完全是我的代码了,应该是没问题了,读不懂标题、不会说话的崽崽请自重,都学keras了还这点素质真不想挂你了

====

由于针对每个batch的准确率/召回率/查准率的计算意义不大,因而在keras2.0后训练过程中这三项metrics被取消了,因而若需要还需自行定义召回率/查准率/的计算函数

由于需要调用keras后台(本人使用的是tensorflow),针对张量进行批量处理,代码中,K为后台(keras.backend),ytrue为真实值,y_pred为预测值

import keras.backend as K
from keras import Sequential
from keras.layers import Dense
import numpy as np

def getPrecision(y_true, y_pred):
    TP = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))#TP
    N = (-1)*K.sum(K.round(K.clip(y_true-K.ones_like(y_true), -1, 0)))#N
    TN=K.sum(K.round(K.clip((y_true-K.ones_like(y_true))*(y_pred-K.ones_like(y_pred)), 0, 1)))#TN
    FP=N-TN
    precision = TP / (TP + FP + K.epsilon())#TT/P
    return precision

def getRecall(y_true, y_pred):
    TP = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))#TP
    P=K.sum(K.round(K.clip(y_true, 0, 1)))
    FN = P-TP #FN=P-TP
    recall = TP / (TP + FN + K.epsilon())#TP/(TP+FN)
    return recall

在compile时候调用这两个函数

myModel.compile(optimizer="sgd",
                           loss="categorical_crossentropy",
                           metrics=["acc",getRecall,getPrecision])

然后训练时候可以用以下main函数检验一下

if __name__=="__main__":
    x=np.array([[0,0],[1,0],[1,1],[0,1]])
    y=np.array([[0],[0],[1],[1]])
    myModel =Sequential()
    myModel.add(Dense(256,activation='sigmoid',input_shape=(2,)))
    myModel.add(Dense(128,activation='sigmoid'))
    myModel.add(Dense(64,activation='sigmoid'))
    myModel.add(Dense(1,activation='sigmoid'))
    myModel.compile(optimizer="adam",
                           loss="binary_crossentropy",
                           metrics=["acc",getRecall,getPrecision])
    myModel.fit(x,y,epochs=300)
    preY=myModel.predict(x)
    print(y.T)
    print(preY.T)

15次迭代下训练结果展示如下:

Epoch 15/15
4/4 [==============================] - 0s 749us/step - loss: 0.7211 - acc: 0.5000 - getRecall: 0.0000e+00 - getPrecision: 0.0000e+00

预测结果为:

[[0 0 1 1]]
[[0.38936457 0.38851783 0.38819802 0.389041  ]]

可见,模型基本把所有结果都预测为0,因而TP为0,因而recall和precision为0

300次迭代下训练结果展示如下:

Epoch 7/300
4/4 [==============================] - 0s 749us/step - loss: 0.6917 - acc: 0.5000 - getRecall: 1.0000 - getPrecision: 0.5000
....
Epoch 300/300
4/4 [==============================] - 0s 1ms/step - loss: 0.0021 - acc: 1.0000 - getRecall: 1.0000 - getPrecision: 1.0000

预测结果为:

[[0 0 1 1]]
[[0.00177999 0.00176538 0.9976775  0.99769515]

可见,初期欠拟合阶段,recall与precision产生差异,之后随着模型能力增强,recall与precision差异逐渐降低,直至都为1。

然后有的同学可能需要做其他运算,建议稍微学学tensorflow的张量运算,就能自己创造metrics啦~

然后关于伴随metrics的存取问题链接放这呐

白歌:KERAS(5.伴随metrics保存/读取模型)​zhuanlan.zhihu.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值