You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tf.keras.callbacks.ModelCheckpoint报错:无法将EagerTensor序列化到JSON

错误原因

报错是因为你使用了tfa.optimizers.MultiOptimizer和tfa.optimizers.AdamW两类TensorFlow Addons提供的自定义优化器,这类优化器的超参数(学习率、权重衰减值)如果是以EagerTensor类型传入的,Keras的ModelCheckpoint在执行保存逻辑时,会尝试将模型及优化器配置序列化为JSON格式,而原生JSON序列化不支持Tensor类型,因此触发报错。即使你设置了save_weights_only=True,部分版本的Keras依然会尝试序列化优化器配置,所以无法规避问题。

解决方法

  • 方案一:转换超参数为原生Python数值(最简便)
    定义AdamW优化器时,将学习率、权重衰减参数用float()包裹,确保传入的是Python原生浮点类型而非Tensor类型,修改优化器定义部分代码即可:
    optimizers = [
        tfa.optimizers.AdamW(learning_rate=float(lr * .001) , weight_decay=float(wd)),
        tfa.optimizers.AdamW(learning_rate=float(lr), weight_decay=float(wd))
    ]
    
  • 方案二:使用自定义Checkpoint回调绕开序列化逻辑
    不用Keras自带的ModelCheckpoint,自定义回调手动判断最优指标并保存权重,model.save_weights()仅存储权重参数不会触发配置序列化:
    best_acc = 0.0
    checkpoint_path = os.path.join(os.getcwd(), 'keras_model')
    class CustomCheckpoint(tf.keras.callbacks.Callback):
        def on_epoch_end(self, epoch, logs=None):
            global best_acc
            current_acc = logs.get('categorical_accuracy')
            if current_acc > best_acc:
                best_acc = current_acc
                self.model.save_weights(checkpoint_path)
    
    # 训练时替换原来的checkpoint_cb
    history = model.fit(train_data, validation_data=test_data, epochs=N_EPOCHS, callbacks=[CustomCheckpoint()])
    
  • 方案三:替换分层学习率实现
    不用tfa.optimizers.MultiOptimizer,改用TensorFlow原生的分层学习率设置逻辑,避免引入第三方优化器的兼容性问题。

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:57:02