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
相关产品推荐
相关产品推荐

