TensorFlow Addons中RSquare触发TypeError的解决求助
解决TensorFlow Addons中RSquare指标触发TypeError的问题
问题说明
在Google Colab构建单隐藏层回归模型时,调用tfa.metrics.RSquare()会触发TypeError: isinstance() arg 2 must be a type or tuple of types,即使运行TensorFlow官方提供的RSquare示例代码,也会出现相同错误。
解决方案
1. 修复版本兼容性问题
该错误核心是TensorFlow Addons(TFA)与当前TensorFlow/Keras版本不匹配,导致类型注解校验失败。
- 执行以下命令卸载现有TFA并安装兼容版本(以适配TF 2.x的0.20.0版本为例):
!pip uninstall -y tensorflow-addons !pip install tensorflow-addons==0.20.0
- 执行完成后,重启Colab运行时(点击顶部菜单栏
Runtime -> Restart runtime),再重新运行模型代码或官方示例即可正常工作。
2. 自定义RSquare指标(无依赖替代方案)
若不想调整版本,可自行实现RSquare指标,完全规避TFA的问题代码:
import tensorflow as tf class RSquare(tf.keras.metrics.Metric): def __init__(self, name='r_square', **kwargs): super().__init__(name=name, **kwargs) self.total_sum_of_squares = self.add_weight(name='tss', initializer='zeros') self.residual_sum_of_squares = self.add_weight(name='rss', initializer='zeros') def update_state(self, y_true, y_pred, sample_weight=None): y_true = tf.cast(y_true, tf.float32) y_pred = tf.cast(y_pred, tf.float32) mean_true = tf.reduce_mean(y_true) tss = tf.reduce_sum(tf.square(y_true - mean_true)) rss = tf.reduce_sum(tf.square(y_true - y_pred)) if sample_weight is not None: sample_weight = tf.cast(sample_weight, tf.float32) tss = tf.reduce_sum(sample_weight * tf.square(y_true - mean_true)) rss = tf.reduce_sum(sample_weight * tf.square(y_true - y_pred)) self.total_sum_of_squares.assign_add(tss) self.residual_sum_of_squares.assign_add(rss) def result(self): return 1 - (self.residual_sum_of_squares / self.total_sum_of_squares) def reset_state(self): self.total_sum_of_squares.assign(0.0) self.residual_sum_of_squares.assign(0.0)
在模型编译时使用该自定义指标:
# 替换原有metrics参数 onelayer.compile(loss=lossfunc, optimizer=optimizer, metrics=[RSquare()])
方法对比
- 版本修复:操作简洁,完全复用TFA官方实现,但需注意版本匹配。
- 自定义指标:无需依赖第三方库,灵活性高,适合需要长期稳定运行的场景。
内容的提问来源于stack exchange,提问作者Nima Zamanpour
相关产品推荐
相关产品推荐

