Как я могу получить точность из матрицы путаницы в тензорном потоке или в керасе в виде тензора? - PullRequest
0 голосов
/ 21 января 2019

Я хочу получить UAR (невзвешенную точность) из матрицы путаницы для мониторинга UAR данных проверки. Однако с тензором сложно разобраться.

https://www.davidtvs.com/keras-custom-metrics/

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

model.compile(loss='categorical_crossentropy',optimizer=adam, metrics=['accuracy', uar_accuracy])

Однако я не знаю, как определить функцию uar_accuracy.

            def uar_accuracy(y_true, y_pred):

            # Calculate the label from one-hot encoding
            pred_class_label = K.argmax(y_pred, axis=-1)
            true_class_label = K.argmax(y_true, axis=-1)


            cf_mat = tf.confusion_matrix(true_class_label, pred_class_label )

            diag = tf.linalg.tensor_diag_part(cf_mat)
            uar = K.mean(diag)

            return uar

Этот результат возвращает среднее количество правильных данных для каждого класса. Но я не хочу, чтобы среднее число правильных данных, , но я хочу среднее значение правильных вероятностей для каждого класса.

Как я могу это реализовать?

Я реализовал следующее для типа numpy, а не типа Tensor, используя библиотеки sklearn.metrics и collections

            def get_accuracy_and_cnf_matrix(label, predict):
            uar = 0
            accuracy = []
            cnf_matrix = confusion_matrix(label, predict)
            diag=np.diagonal(cnf_matrix)
            for index,i in enumerate(diag):
                uar+=i/collections.Counter(label)[index]

            # cnf_marix (Number of corrects -> Accuracy)    
            cnf_matrix = np.transpose(cnf_matrix)
            cnf_matrix = cnf_matrix*100 / cnf_matrix.astype(np.int).sum(axis=0)
            cnf_matrix = np.transpose(cnf_matrix).astype(float)
            cnf_matrix = np.around(cnf_matrix, decimals=2)   

            # WAR, UAR
            test_weighted_accuracy = np.sum(label==predict)/len(label)*100
            test_unweighted_accuracy = uar/len(cnf_matrix)*100    
            accuracy.append(test_weighted_accuracy)
            accuracy.append(test_unweighted_accuracy)

            return np.around(np.array(accuracy),decimals=2), cnf_matrix  

1 Ответ

0 голосов
/ 21 января 2019

Вы можете использовать tf.reduce_sum для вычисления суммы каждой строки в вашей матрице путаницы.Это соответствует общему количеству точек данных для каждого класса.Затем вы делите диагональные элементы с помощью этой суммы строк, чтобы вычислить соотношение правильно спрогнозированных примеров на класс.

def non_nan_average(x):
    # Computes the average of all elements that are not NaN in a rank 1 tensor
    nan_mask = tf.debugging.is_nan(x)
    x = tf.boolean_mask(x, tf.logical_not(nan_mask))
    return K.mean(x)


def uar_accuracy(y_true, y_pred):
    # Calculate the label from one-hot encoding
    pred_class_label = K.argmax(y_pred, axis=-1)
    true_class_label = K.argmax(y_true, axis=-1)

    cf_mat = tf.confusion_matrix(true_class_label, pred_class_label )

    diag = tf.linalg.tensor_diag_part(cf_mat)    

    # Calculate the total number of data examples for each class
    total_per_class = tf.reduce_sum(cf_mat, axis=1)

    acc_per_class = diag / tf.maximum(1, total_per_class)  
    uar = non_nan_average(acc_per_class)

    return uar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...