Tensorflow & Keras: 为精确度构建自定义度量

我已经对Metric类进行了子类化,以创建一个自定义的精确度度量。一切看起来都很好;我的意思是没有运行时错误。但是当我看到输出中的精确度分数记录时,我怀疑有什么问题,每个epoch结束时显示的分数总是相同的,例如,epoch 0.1000 或 0.9000

这是我的代码:

(X_train_10, y_train_10), (X_test_10, y_test_10) = keras.datasets.cifar10.load_data()X_train_10 = X_train_10 / 255.X_test_10 = X_test_10 / 255.class PrecisionMetric(keras.metrics.Metric):    def __init__(self, name = 'precision', **kwargs):        super(PrecisionMetric, self).__init__(**kwargs)        self.tp = self.add_weight('tp', initializer = 'zeros')        self.fp = self.add_weight('fp', initializer = 'zeros')    def update_state(self, y_true, y_pred):        y_true = tf.cast(y_true, tf.bool)        y_pred = tf.cast(y_pred, tf.bool)                true_p = tf.logical_and(tf.equal(y_true, True), tf.equal(y_pred, True))        false_p = tf.logical_and(tf.equal(y_true, False), tf.equal(y_pred, True))        self.tp.assign_add(tf.reduce_sum(tf.cast(true_p, self.dtype)))        self.fp.assign_add(tf.reduce_sum(tf.cast(false_p, self.dtype)))    def reset_states(self):        self.tp.assign(0)        self.fp.assign(0)    def result(self):        return self.tp / (self.tp + self.fp)keras.backend.clear_session()model = keras.models.Sequential()model.add(keras.layers.Flatten(input_shape = np.array(X_train_10.shape[1: ])))for _ in range(2):    model.add(keras.layers.Dense(50, activation = 'elu', kernel_initializer = 'he_normal'))model.add(keras.layers.Dense(1, activation = 'sigmoid'))loss = keras.losses.binary_crossentropyoptimizer = keras.optimizers.SGD()model.compile(loss = loss, optimizer = optimizer, metrics = [PrecisionMetric()])# To make it binary classificationy_train_5 = (y_train_10 == 5)y_test_5 = (y_test_10 == 5)history = model.fit(X_train_10, y_train_5, epochs = 5)

运行5个epoch后的输出:

Epoch 1/51563/1563 [==============================] - 5s 4ms/step - loss: 0.2921 - precision_metric: 0.1000Epoch 2/51563/1563 [==============================] - 4s 2ms/step - loss: 0.2744 - precision_metric: 0.1000Epoch 3/51563/1563 [==============================] - 3s 2ms/step - loss: 0.2682 - precision_metric: 0.1000Epoch 4/51563/1563 [==============================] - 3s 2ms/step - loss: 0.2651 - precision_metric: 0.1000Epoch 5/51563/1563 [==============================] - 4s 3ms/step - loss: 0.2629 - precision_metric: 0.1000

注意:即使尝试了更多的epoch,例如100个,输出的精确度仍然完全相同,而损失值一直在缩小。


回答:

编辑

你的实现中确实有一个错误。你不应该将y_pred转换为布尔值。这些是sigmoid的输出。你应该这样做

y_pred = tf.math.greater(y_pred, 0.5)

当你的问题是二元分类时(你从sigmoid得到输出)。并且需要为多类分类进行调整。

请在result中检查是否没有在进行0/0的除法,通过以下方式:

    def result(self):        res =  self.tp / (self.tp + self.fp)        if tf.math.is_nan(res):            return 0.0        else:            return res

我为第一次错误的答案道歉,尽管我希望它在某种程度上是有教育意义的。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注