树莓派4B加载Colab训练模型遇Custom>Adam优化器错误求助
问题描述
我正在学习机器学习,想在树莓派上应用相关技术。我的设备是RPi 4B,运行环境如下:
NAME="Raspbian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" 架构为armv7l 已安装TensorFlow,版本是2.5.0-rc0
尝试加载在Colab中用Adam优化器训练的模型时,出现以下错误:
ValueError: Unknown optimizer: Custom>Adam. Please ensure this object is passed to the `custom_objects` argument. See <https://www.tensorflow.org/guide/keras/save_and_serialize#registering_the_custom_object> for details.
初始加载代码:
import librosa import numpy as np import tensorflow as tf from tensorflow.keras.optimizers import Adam import simpleaudio as sa # 加载训练好的机器学习模型 with tf.device('/cpu:0'): model = tf.keras.models.load_model('/home/pi/Desktop/project/pineapplemodeltwoclassbs16e75.h5')
我试过两种方案,但都没解决问题:
方案一
# 定义自定义Adam优化器 class CustomAdam(Adam): pass # 注册自定义优化器 tf.keras.utils.get_custom_objects().update({'CustomAdam': CustomAdam}) # 加载模型 with tf.device('/cpu:0'): model = tf.keras.models.load_model('/home/pi/Desktop/project/pineapplemodeltwoclassbs16e75.h5', custom_objects={'CustomAdam': CustomAdam})
方案二
# 从tensorflow.keras.optimizers导入Adam Adam = tf.keras.models.optimizers.Adam # 加载模型 with tf.device('/cpu:0'): model = tf.keras.models.load_model('/home/pi/Desktop/project/pineapplemodeltwoclassbs16e75.h5', custom_objects={'Adam': Adam})
请问该如何解决这个错误?
解决方案
这个错误的核心是模型保存时,优化器被序列化为Custom>Adam而非标准Adam,加载时需要匹配这个序列化名称。
方法一:精准匹配序列化名称加载
直接在custom_objects中使用错误提示里的Custom>Adam作为键,对应值用标准Adam优化器:
import tensorflow as tf from tensorflow.keras.optimizers import Adam with tf.device('/cpu:0'): model = tf.keras.models.load_model( '/home/pi/Desktop/project/pineapplemodeltwoclassbs16e75.h5', custom_objects={'Custom>Adam': Adam} )
方法二:复刻Colab中的自定义优化器
如果Colab训练时用了自定义的Adam子类(比如封装了特殊参数),需要在树莓派上完全复刻这个类的定义,再加载模型:
假设Colab中自定义Adam的代码是:
from tensorflow.keras.optimizers import Adam class CustomAdam(Adam): def __init__(self, learning_rate=0.001, **kwargs): super().__init__(learning_rate=learning_rate, **kwargs)
那么树莓派上复制相同的类定义后,再加载:
import tensorflow as tf from tensorflow.keras.optimizers import Adam class CustomAdam(Adam): def __init__(self, learning_rate=0.001, **kwargs): super().__init__(learning_rate=learning_rate, **kwargs) with tf.device('/cpu:0'): model = tf.keras.models.load_model( '/home/pi/Desktop/project/pineapplemodeltwoclassbs16e75.h5', custom_objects={'Custom>Adam': CustomAdam} )
方法三:改用SavedModel格式重新保存模型(若可访问Colab环境)
HDF5格式在跨环境加载时易出现自定义对象兼容问题,建议在Colab中重新用SavedModel格式保存:
model = tf.keras.models.load_model('your_trained_model.h5') # 保存为SavedModel格式 model.save('pineapplemodel_savedmodel', save_format='tf')
之后在树莓派上加载这个格式的模型,无需额外指定自定义对象:
with tf.device('/cpu:0'): model = tf.keras.models.load_model('/home/pi/Desktop/project/pineapplemodel_savedmodel')
内容的提问来源于stack exchange,提问作者Jan Dimitri Portugal
相关产品推荐
相关产品推荐

