web-dev-qa-db-ja.com

tensorflowで分類するための混同行列を作成する方法

4つの出力ノードを持つCNNモデルがあり、個々のクラスの精度を知ることができるように混同行列を計算しようとしています。全体的な精度を計算できます。リンク here で、Igor Valanticは、混乱行列変数を計算できる関数を提供しました。 correct_prediction = tf.nn.in_top_k(logits, labels, 1, name="correct_answers")でエラーが発生し、エラーは_TypeError: DataType float32 for attr 'T' not in list of allowed values: int32, int64_です

def evaluation(logits, labels)という関数内でinit32にロジットを型キャストしようとしましたが、_correct_prediction = ..._を_TypeError:Input 'predictions' of 'InTopK' Op has type int32 that does not match expected type of float32_として計算するときに別のエラーが発生します

この混同行列を計算する方法は?

_sess = tf.Session()
model = dimensions() # CNN input weights are calculated 
data_train, data_test, label_train, label_test =  load_data(files_test2,folder)
data_train, data_test, = reshapedata(data_train, data_test, model)
# input output placeholders
x  = tf.placeholder(tf.float32, [model.BATCH_SIZE, model.input_width,model.input_height,model.input_depth]) # last column = 1 
y_ = tf.placeholder(tf.float32, [model.BATCH_SIZE, model.No_Classes])
p_keep_conv = tf.placeholder("float")
# 
y  = mycnn(x,model, p_keep_conv)
# loss
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, y_))
# train step
train_step = tf.train.AdamOptimizer(1e-3).minimize(cost)
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
true_positives, false_positives, true_negatives, false_negatives = evaluation(y,y_)
lossfun = np.zeros(STEPS)
sess.run(tf.global_variables_initializer())

for i in range(STEPS):
    image_batch, label_batch = batchdata(data_train, label_train, model.BATCH_SIZE)
    Epoch_loss = 0
    for j in range(model.BATCH_SIZE):
        sess.run(train_step, feed_dict={x: image_batch, y_: label_batch, p_keep_conv:1.0})
        c = sess.run( cost, feed_dict={x: image_batch, y_: label_batch, p_keep_conv: 1.0})
        Epoch_loss += c
    lossfun[i] = Epoch_loss
    print('Epoch',i,'completed out of',STEPS,'loss:',Epoch_loss )
 TP,FP,TN,FN = sess.run([true_positives, false_positives, true_negatives,  false_negatives], feed_dict={x: image_batch, y_: label_batch, p_keep_conv:1.0})
_

これは私のコードスニペットです

5
Raady

Tensorflowの 混同行列 を使用するだけです。私はyがあなたの予測であり、あなたは_num_classes_を持っているかもしれないし持っていないかもしれません(これはオプションです)

_y_ = placeholder_for_labels # for eg: [1, 2, 4]
y = mycnn(...) # for eg: [2, 2, 4]

confusion = tf.confusion_matrix(labels=y_, predictions=y, num_classes=num_classes)
_

print(confusion)の場合、

_  [[0 0 0 0 0]
   [0 0 1 0 0]
   [0 0 1 0 0]
   [0 0 0 0 0]
   [0 0 0 0 1]]
_

print(confusion)が混同行列を出力していない場合は、print(confusion.eval(session=sess))を使用します。ここでsessはTensorFlowセッションの名前です。

12
vega
import tensorflow as tf     
y = [1, 2, 4]
y_ = [2, 2, 4]

con = tf.confusion_matrix(labels=y_, predictions=y )
sess = tf.Session()
with sess.as_default():
        print(sess.run(con))

出力は次のとおりです。

[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 0 0]
[0 0 0 0 0]
[0 0 0 0 1]]
4
Zaya Kh