Keras 2.1.6升级后出现super(type, obj)类型错误求助
嘿,我之前也踩过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这类参数。你需要确认:
- 所有
Conv2D的kernel_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




