Как лучше всего создать матрицу путаницы с несколькими метками на TensorFlow?

Я пытаюсь сгенерировать путаницу с 3 метками, которые можно предсказать с помощью функции TensorFlow tf.confusion_matrix().

Моя проблема в том, что способ, которым я это реализовал, очень медленный.

Я делаю это для вызова функции, которая перебирает набор данных и суммирует матрицу путаницы для каждого пакета. Я думаю, проблема в том, что мой тензор tf.confusion_matrix определен в отдельном графе, который требует его оценки с использованием другого сеанса (см. Код ниже).

Я попытался реализовать его в основном графике, но не понял, как сгладить (развернуть) прогнозы в списке.

def do_accuracy_eval(sess, data_set, data_index, data_type, batch_size, self):    
steps_per_epoch = len(data_set) // batch_size
for step in range(steps_per_epoch):
    batch_inputs, batch_labels, batch_info, data_index, word_labels = generate_batch(batch_size, 
                                                                        data_set, 
                                                                        data_index)

    feed_dict = {self._train_inputs : batch_inputs, self._train_labels : batch_labels, 
                 self._info_inputs : batch_info, self._train_labels_NER : word_labels} 

    prediction_NER = sess.run([self._prediction_NER], feed_dict=feed_dict)

    #compute the confusion matrix for NER
    word_labels_unstacked =        word_labels.reshape(word_labels.shape[0]*word_labels.shape[1])
    prediction_NER_unstacked = prediction_NER.reshape(prediction_NER.shape[0]*prediction_NER.shape[1])
    if step == 0:
        NER_confusion_mat = tf.confusion_matrix(word_labels_unstacked, prediction_NER_unstacked, num_classes=3, name='NER_confusion_matrix')
    else:
        NER_confusion_mat += tf.confusion_matrix(word_labels_unstacked, prediction_NER_unstacked, num_classes=3, name='NER_confusion_matrix')

print('confusion matrix NER')
session = tf.Session()
with session.as_default():
    cm = session.run(NER_confusion_mat)
    print(cm)

Когда я делаю это для двоичного класса, я могу напрямую вычислить его, используя код, похожий на приведенный ниже, но я не знаю, как это сделать с более чем двумя классами.

prediction = tf.cast(tf.argmax(logits, axis=1), tf.float32, name='prediction')
t_p = tf.count_nonzero(prediction * tf.cast(train_labels, tf.float32), name='tp')
t_n = tf.count_nonzero((prediction - 1) * (tf.cast(train_labels, tf.float32) - 1), name='tn')
f_p = tf.count_nonzero(prediction * (tf.cast(train_labels, tf.float32) - 1), name='fp')
f_n = tf.count_nonzero((prediction - 1) * tf.cast(train_labels, tf.float32), name='fn')

Спасибо за вашу помощь!

0 ответов

Другие вопросы по тегам