一 tf.confusion_matrix(y,pred_y,num_classes)
以二分类为例,混淆矩阵为2*2的矩阵,如果我们真实标签为real=[0,1,1,0,1],预测标签为predict=[0,1,0,1,1]
num_classes为分类数,一定要设置这个!!!否则默认为None
测试
import numpy as np
import tensorflow as tf
y=np.array([[1,0],[1,0],[1,0],[1,0],[1,0]])
y=tf.convert_to_tensor(y)
predict=np.array([[1,0],[1,0],[1,0],[1,0],[1,0]])
predict=tf.convert_to_tensor(predict)
confusion_matrix=tf.confusion_matrix(tf.argmax(y,1),tf.argmax(predict,1),num_classes=2)
with tf.Session() as sess: #开始一个会话
matrix=sess.run(confusion_matrix)
print(matrix)
#输出[[5 0] [0 0]]
#如果不加num_classes=2就会输出[[5]]
二 评估指标
得到混淆矩阵后,即可得到TP,TN,FP,FN。根据各种指标的公式可求
def evaluate(confusion_metrics):
TP=confusion_metrics[0][0]
FP=confusion_metrics[0][1]
FN=confusion_metrics[1][0]
TN=confusion_metrics[1][1]
ACC=(TP+TN)/(TP+TN+FP+FN)
SEN=TP/(TP+FN)
SPE=TN/(TN+FP)
return ACC,SEN,SPE
三 实际训练
在实际训练时,我们的数据都是分批次放入网络中训练,所以可以初始化一个2*2的0矩阵,一次计算一个混淆矩阵,然后加起来
real=tf.argmax(y,1) #one-hot标签
pred=tf.argmax(predict,1)
confusion_matrix=tf.confusion_matrix(real,pred,num_classes=2)
with tf.Session() as sess: #开始一个会话
sess.run(tf.global_variables_initializer())
avg_cost=0.
all_matrix=np.zeros([2,2])
for i in range(300):
_x,_y=sess.run([train_x,train_y])
matrix=sess.run([confusion_matrix],feed_dict={x:_x,y:_y})
all_matrix+=matrix
avg_cost+=cost/display_step
if (i+1)%display_step==0: #每隔display_step输出一次cost和评估指标并重置为0
train_acc,train_sen,train_spe=evaluate(all_matrix)
print("step:%d,train_acc:%s,train_spe:%s,train_sen:%s"%(i+1,str(train_acc),str(train_spe),str(train_sen)))
avg_cost=0
all_matrix=np.zeros([2,2])
注意:matrix是numpy类型,所以加减需要用np.zeros([2,2])来初始化