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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:32:13