You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Keras 2.1.6升级后出现super(type, obj)类型错误求助

解决Keras 2.1.6升级后Tiny YOLOv2构建的TypeError问题

嘿,我之前也踩过Keras版本升级的类似坑,结合你描述的情况,这个错误大概率是Keras 2.1.6对层初始化逻辑的严格校验导致的,下面给你拆解可能的原因和对应的解决办法:

问题定位

你遇到的错误:

kernel_constraint=None, TypeError: super(type, obj): obj must be an instance or subtype of type

本质是类继承时的实例类型不匹配,通常出现在自定义层或者内置层的参数传递上——毕竟Keras 2.1.6对比2.1.5在层的初始化逻辑上做了不少细节调整。

具体解决方案

1. 检查自定义层的super()调用

如果你为Tiny YOLOv2写了自定义输出层(比如处理锚框和检测结果的层),旧版本的super()写法可能在新版本中失效。比如之前你可能这么写:

class YOLOOutputLayer(keras.layers.Layer):
    def __init__(self, anchors, num_classes, **kwargs):
        super(YOLOOutputLayer, self).__init__(name='yolo_output')
        # 其他初始化代码

这种写法在2.1.6中可能因为没有传递全部kwargs或者继承链问题触发类型错误,改成下面的写法试试:

class YOLOOutputLayer(keras.layers.Layer):
    def __init__(self, anchors, num_classes, **kwargs):
        # 传递所有关键字参数给父类
        super(YOLOOutputLayer, self).__init__(**kwargs)
        self.anchors = anchors
        self.num_classes = num_classes
        # 其他初始化逻辑

如果是Python 3环境,更推荐用简化版super().__init__(**kwargs),避免手动指定类名带来的类型匹配问题。

2. 规范内置层的参数传递

Keras 2.1.6对Conv2D等层的参数校验更严格,尤其是kernel_constraint这类参数。你需要确认:

  • 所有Conv2Dkernel_constraint要么是None,要么是Keras约束类的实例(比如keras.constraints.MaxNorm(3)),绝对不能传字符串或者其他无效类型。
  • 尽量用关键字参数定义层,避免位置参数顺序混乱。比如把:
    Conv2D(64, 3, padding='same', kernel_constraint=None)
    
    改成:
    Conv2D(filters=64, kernel_size=3, padding='same', kernel_constraint=None)
    
    虽然多写几个字,但能避免新版本中参数顺序调整导致的问题。

3. 统一Keras导入方式

你代码里同时导入了tensorflow和原生keras,很容易出现命名空间冲突。比如有些层来自keras.layers,有些来自tensorflow.keras.layers,这两个库的类虽然功能类似,但属于不同的类型,继承时就会触发super()的类型错误。

解决办法是二选一
要么全用原生Keras:

import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Conv2D, ...

要么全用TensorFlow集成的Keras:

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, ...

绝对不要混合导入,不然类型不匹配的坑会一直跟着你。

4. 版本兼容性排查

Keras 2.1.6对TensorFlow版本有要求,如果你只升级了Keras没动TensorFlow,可能出现底层API不兼容。建议:

  • 查看Keras 2.1.6的官方文档,确认兼容的TensorFlow版本(一般是1.8.x到1.10.x之间)。
  • 如果不想动TensorFlow,可以暂时降级Keras回2.1.5,等后续版本稳定了再升级;或者同步升级TensorFlow到兼容版本。

快速验证技巧

如果不确定哪里出问题,可以先把代码简化成最小模型:只保留基础的卷积层和全连接层,去掉自定义层,看是否还报错。如果不报错了,就逐步加回自定义层,定位到具体出错的组件,再针对性修复。

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

火山引擎 最新活动