无法实例化抽象类RootMeanSquaredError

问题描述 投票:0回答:2

我正在学习 Chollet 的“Python 深度学习”。我一直在做一些实现,但我陷入了困境。我以为我打错了什么,但看起来并非如此。

有人知道可能发生什么吗?

model = get_mnist_model()
model.compile(optimizer="rmsprop",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy", RootMeanSquaredError()])
model.fit(train_images, train_labels,
    epochs=3,
    validation_data=(val_images, val_labels))

test_metrics = model.evaluate(test_images, test_labels)

TypeError:无法实例化抽象类 RootMeanSquaredError 抽象方法结果

python tensorflow keras deep-learning
2个回答
0
投票

我也遇到了这个错误,并意识到这是因为我在 Jupyter 笔记本中的新代码块中定义了

result
reset_state
方法。一旦我将它们移动到与
RootMeanSquaredError
类定义相同的块中,您发布的代码就可以正常工作,而不会触发 TypeError。

这应该是显而易见的,但直到我看到这个例子我才意识到它们属于类定义。


0
投票

我也遇到和你一样的问题。但我检查了 RootMeanSquaredError 的代码,发现有一个拼写错误(tf.one_hot,而不是 tf.one_bot)以及一些函数名称错误和返回错误。我使用ChatGPT检查了这些错误,并在更正后解决了它。这是正确的代码:

import tensorflow as tf
from tensorflow import keras

class RootMeanSquaredError(keras.metrics.Metric):

  def __init__(self, name="rmse", **kwargs):
    super().__init__(name=name, **kwargs)
    self.mse_sum = self.add_weight(name="mse_sum", initializer="zeros")
    self.total_samples = self.add_weight(
        name="total_samples", initializer="zeros", dtype="int32")
    
  def update_state(self, y_true, y_pred, sample_weight=None):
    y_true = tf.one_hot(y_true, depth=tf.shape(y_pred)[1])
    mse = tf.reduce_sum(tf.square(y_true - y_pred))
    self.mse_sum.assign_add(mse)
    num_samples = tf.shape(y_pred)[0]
    self.total_samples.assign_add(num_samples)

  def result(self):
    return tf.sqrt(self.mse_sum / tf.cast(self.total_samples, tf.float32))

  def reset_state(self):
    self.mse_sum.assign(0.)
    self.total_samples.assign(0)
    return None 

model = get_mnist_model()
model.compile(optimizer="rmsprop",
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy", RootMeanSquaredError()])
model.fit(train_images, train_labels, 
          epochs=3,
          validation_data=(val_images, val_labels))
test_metrics = model.evaluate(test_images, test_labels)
© www.soinside.com 2019 - 2024. All rights reserved.