Как получить другие метрики в Tensorflow 2.0 (не только точность)? - PullRequest
2 голосов
/ 10 марта 2020

Я новичок в мире Tensorflow и работаю над простым примером классификации наборов данных mnist. Я хотел бы знать, как я могу получить другие метрики (например, точность, отзыв и т. Д. c) в дополнение к точности и потерям (и, возможно, показать их). Вот мой код:

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.callbacks import TensorBoard
import os 

#load mnist dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

#create and compile the model
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)), 
  tf.keras.layers.Dense(128, activation='relu'), 
  tf.keras.layers.Dropout(0.2), 
  tf.keras.layers.Dense(10, activation='softmax') 
])
model.summary()

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

#model checkpoint (only if there is an improvement)

checkpoint_path = "logs/weights-improvement-{epoch:02d}-{accuracy:.2f}.hdf5"

cp_callback = ModelCheckpoint(checkpoint_path, monitor='accuracy',save_best_only=True,verbose=1, mode='max')

#Tensorboard
NAME = "tensorboard_{}".format(int(time.time())) #name of the model with timestamp
tensorboard = TensorBoard(log_dir="logs/{}".format(NAME))

#train the model
model.fit(x_train, y_train, callbacks = [cp_callback, tensorboard], epochs=5)

#evaluate the model
model.evaluate(x_test,  y_test, verbose=2)

Поскольку я получаю только точность и потери, как я могу получить другие метрики? Заранее спасибо, извините, если это простой вопрос или если где-то уже ответили.

Ответы [ 5 ]

2 голосов
/ 22 марта 2020

Я добавляю еще один ответ, потому что это самый чистый способ правильного вычисления этих показателей в вашем наборе тестов (по состоянию на 22 марта 2020 года).

Первое, что вам нужно сделать, - это создать пользовательский обратный вызов, в котором вы отправляете свои тестовые данные:

import tensorflow as tf
from sklearn.metrics import classification_report
from tensorflow.keras.callbacks import Callback 

class MetricsCallback(Callback):
    def __init__(self, test_data, y_true):
        #Should be the label encoding of your classes
        self.y_true = y_true
        self.test_data = test_data

    def on_epoch_end(self, epoch, logs=None):
         #Here we get the probabilities
         y_pred = self.model.predict(self.test_data))
         #Here we get the actual classes
         y_pred = tf.argmax(y_pred,axis=1)
         #Actual dictionary
         report_dictionary = classification_report(self.y_true, y_pred, output_dict = True)
         #Only printing the report
         print(classification_report(self.y_true,y_pred,output_dict=False)              

В свою основную, где вы загружаете свой набор данных и добавляете обратные вызовы:

metrics_callback = MetricsCallback(test_data = my_test_data, y_true = my_y_true)
...
...
#train the model
model.fit(x_train, y_train, callbacks = [cp_callback, metrics_callback,tensorboard], epochs=5)
1 голос
/ 10 марта 2020

Начиная с TensorFlow 2.X, precision и recall доступны как встроенные метрики.

Поэтому вам не нужно реализовывать их вручную. В дополнение к этому они были удалены ранее в версиях Keras 2.X, потому что они вводили в заблуждение - поскольку они вычислялись пакетным способом, глобальные (истинные) значения точности и отзыва будут фактически отличаться.

Вы можете посмотреть здесь: https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Recall

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

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy',tf.keras.metrics.Precision(),tf.keras.metrics.Recall()])
0 голосов
/ 10 марта 2020

Я не смог получить ответ Тимбуса на работу, и нашел очень интересное объяснение здесь .

Там написано: The meaning of 'accuracy' depends on the loss function. The one that corresponds to sparse_categorical_crossentropy is tf.keras.metrics.SparseCategoricalAccuracy(), not tf.metrics.Accuracy(). Что имеет большой смысл.

Итак, какие метрики вы можете использовать, зависит от выбранной вами потери. Например, использование metri c TruePositives не будет работать в случае SparseCategoricalAccuracy, потому что эта потеря означает, что вы работаете с более чем одним классом, что, в свою очередь, означает, что True Positives не могут быть определены, потому что он используется только в двоичном проблемы классификации.

Потеря, подобная tf.keras.metrics.CategoricalCrossentropy(), будет работать, потому что она разработана с учетом нескольких классов! Пример:

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.callbacks import TensorBoard
import time
import os 

#load mnist dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

#create and compile the model
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)), 
  tf.keras.layers.Dense(128, activation='relu'), 
  tf.keras.layers.Dropout(0.2), 
  tf.keras.layers.Dense(10, activation='softmax') 
])
model.summary()

# This will work because it makes sense
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy(),
                       tf.keras.metrics.CategoricalCrossentropy()])

# This will not work because it isn't designed for the multiclass classification problem
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy(),
                       tf.keras.metrics.TruePositives()])

#model checkpoint (only if there is an improvement)

checkpoint_path = "logs/weights-improvement-{epoch:02d}-{accuracy:.2f}.hdf5"

cp_callback = ModelCheckpoint(checkpoint_path,
                              monitor='accuracy',
                              save_best_only=True,
                              verbose=1,
                              mode='max')

#Tensorboard
NAME = "tensorboard_{}".format(int(time.time())) # name of the model with timestamp
tensorboard = TensorBoard(log_dir="logs/{}".format(NAME))

#train the model
model.fit(x_train, y_train, epochs=5)

#evaluate the model
model.evaluate(x_test,  y_test, verbose=2)

В моем случае два других ответа дали мне несоответствие формы.

0 голосов
/ 10 марта 2020

Список поддерживаемых метрик см .:

tf.keras Metrics

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy',tf.keras.metrics.Precision(),tf.keras.metrics.Recall()])
0 голосов
/ 10 марта 2020

Список доступных метрик содержится в документации Keras . Включает в себя recall, precision и др. c.

Например, вспомните :

model.compile('adam', loss='binary_crossentropy', 
    metrics=[tf.keras.metrics.Recall()])
...