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

Keras CV微调YOLOV8后加载模型出现'YOLOV8Detector'未知层错误

Keras CV微调YOLOV8后加载模型出现'YOLOV8Detector'未知层错误

看起来你在微调Keras CV的YOLOv8模型后,加载保存的权重时遇到了自定义层识别的问题,我来帮你一步步解决这个问题。

先梳理下你遇到的几个核心问题:

  • 直接用keras.models.load_model加载时,报错 ValueError: Unknown layer: 'YOLOV8Detector'——这是因为Keras默认不识别Keras CV提供的自定义检测器类;
  • 尝试用tensorflow_hub.YOLOV8Detector是找错了位置,这个类属于keras_cv.models模块,和TensorFlow Hub无关;
  • 保存成.tf格式报错,是因为当前Keras的ModelCheckpoint默认要求使用.keras后缀的原生Keras模型格式。

1. 加载模型时正确指定自定义对象

当加载包含Keras CV自定义层的模型时,必须在load_model中通过custom_objects参数明确指定YOLOV8Detector类,它来自keras_cv.models模块。

修正后的加载代码:

from keras_cv.models import YOLOV8Detector

# 先把文件后缀改成.keras(后面会说明原因)
checkpoint_filepath='E:\model.yolo_v8_s_ft.keras'
# 加载模型时指定自定义对象
loaded_model = keras.models.load_model(
    checkpoint_filepath,
    custom_objects={'YOLOV8Detector': YOLOV8Detector}
)

2. 修正模型保存的格式

你之前尝试保存成.tf格式报错,是因为Keras目前的ModelCheckpoint默认推荐使用.keras作为模型文件后缀(这是Keras原生的完整模型格式,包含架构、权重和优化器状态)。

修正后的保存回调代码:

# 确保文件路径后缀为.keras
checkpoint_filepath='E:\model.yolo_v8_s_ft.keras'

Save_mode= keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_filepath,
    monitor='val_loss',
    mode='auto',
    save_best_only=True,
    save_freq="epoch"
)

3. 完整的微调+保存+加载示例

把这些修正整合到你的代码里,完整的流程应该是这样:

import tensorflow as tf
from tensorflow import keras
from keras_cv.models import YOLOV8Detector, YOLOV8Backbone

# 假设你已经定义了这些常量和数据集
LEARNING_RATE = 0.001
GLOBAL_CLIPNORM = 10.0
EPOCH = 20
class_mapping = {"cat": 0, "dog": 1}  # 替换成你的类别映射
train_ds = ...  # 你的训练数据集(已预处理为xyxy格式)
val_ds = ...    # 你的验证数据集

checkpoint_filepath='E:\model.yolo_v8_s_ft.keras'

# 尝试加载已保存的模型,失败则初始化新模型
try:
    yolo = keras.models.load_model(
        checkpoint_filepath,
        custom_objects={'YOLOV8Detector': YOLOV8Detector}
    )
    print("成功加载已保存的模型,继续训练")
except:
    # 初始化新模型
    backbone = YOLOV8Backbone.from_preset("yolo_v8_m_backbone_coco")
    yolo = YOLOV8Detector(
        num_classes=len(class_mapping),
        bounding_box_format="xyxy",
        backbone=backbone,
        fpn_depth=2,
    )
    print("未找到已保存模型,初始化新模型")

# 编译模型
optimizer = tf.keras.optimizers.Adam(
    learning_rate=LEARNING_RATE,
    global_clipnorm=GLOBAL_CLIPNORM,
)
yolo.compile(
    optimizer=optimizer,
    classification_loss="binary_crossentropy",
    box_loss="ciou"
)

# 回调函数
reduce_lr = keras.callbacks.ReduceLROnPlateau(
    monitor='val_loss', 
    factor=0.5,
    patience=3, 
    min_lr=0.0001
)
Stop=keras.callbacks.EarlyStopping(
    monitor="val_loss",
    patience=7,
    mode="auto"
)

# 开始训练
yolo.fit(
    train_ds,
    validation_data=val_ds,
    epochs=EPOCH,
    callbacks=[Save_mode, reduce_lr, Stop],
)

为什么之前的方法不行?

  • 你误用tensorflow_hub.YOLOV8Detector是因为搞混了模块归属:YOLOV8Detector是Keras CV库的组件,和TensorFlow Hub没有关系,所以会报AttributeError;
  • .tf格式不符合当前ModelCheckpoint的默认要求,Keras现在推荐使用.keras格式来保存完整的模型状态,避免加载时出现格式兼容问题。

备注:内容来源于stack exchange,提问作者Pulf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:49:37