我正在学习 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 抽象方法结果
我也遇到了这个错误,并意识到这是因为我在 Jupyter 笔记本中的新代码块中定义了
result
和 reset_state
方法。一旦我将它们移动到与 RootMeanSquaredError
类定义相同的块中,您发布的代码就可以正常工作,而不会触发 TypeError。
这应该是显而易见的,但直到我看到这个例子我才意识到它们属于类定义。
我也遇到和你一样的问题。但我检查了 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)