====
有些鬼人是真的嘴碎,本文原标题只是调整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