python 如何获取Tensorflow 2.0中的其他指标(不仅仅是准确性)?

6g8kf2rb  于 2022-12-28  发布在  Python
关注(0)|答案(5)|浏览(157)

我是Tensorflow领域的新手,我正在研究mnist数据集分类的简单示例。我想知道除了准确度和损失(并可能显示它们)之外,我如何获得其他指标(例如精度、召回率等)。

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)

既然我只得到准确性和损失,我怎么能得到其他指标?谢谢你提前,我很抱歉,如果这是一个简单的问题或如果已经回答了某处.

ne5o7dgx

ne5o7dgx1#

我添加了另一个答案,因为这是在测试集上正确计算这些指标的最干净的方法(截至2020年3月22日)。
您需要做的第一件事是创建一个自定义回调函数,在其中发送测试数据:

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

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)
du7egjpx

du7egjpx2#

从TensorFlow 2.X开始,precisionrecall都可以作为内置指标使用。
因此,您不需要手动实现它们。除此之外,它们在Keras 2.X版本中被删除了,因为它们具有误导性---因为它们是以批处理方式计算的,precision和recall的全局(真)值实际上是不同的。
你可以看看这里: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()])
zf9nrax1

zf9nrax13#

Keras文档中有一个可用指标列表,包括recallprecision等。
例如,recall

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

ccrfmcuu4#

我无法让Timbus的答案起作用,我发现了一个非常有趣的解释here
上面写着: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().这很有道理。
因此,您可以使用哪些指标取决于您选择的损失。例如,使用指标“True Positives”在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)

在我的情况下,其他2个答案给我形状不匹配。

w3nuxt5m

w3nuxt5m5#

有关支持的度量列表,请参阅:
tf.keras Metrics

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

相关问题