tensorflow計算混同マトリクスと各種評価指標を実現

2140 ワード

1 tf.confusion_matrix(y,pred_y,num_classes)


二分類を例にとると、混同行列が2*2の行列であり、実際のラベルがreal=[0,1,1,0,1]であれば、予測ラベルがpredit=[0,1,0,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])を初期化する