使用自定义注意力层时保存Keras模型抛出NotImplementedError
问题根因
报错由写法问题直接导致:
- 自定义层类的继承关系错误:当前类同时继承
Model和Layer,Python方法解析顺序会打乱super()的调用链路,导致get_config()调用时命中了未实现对应逻辑的父类方法,抛出NotImplementedError。自定义计算层只需要继承tf.keras.layers.Layer,不需要继承Model。 - 附加隐患:偏置权重
b的形状硬绑定了输入的固定序列长度input_shape[1],后续如果输入序列长度和训练时不一致会直接触发形状不匹配错误。
修复方案
快速修复(仅解决保存报错)
直接修改类定义的继承关系,去掉Model继承即可:
# 原错误写法 class attention(Model,Layer): class attention(Layer):
其余代码不需要改动,即可正常调用save_model保存,不会再触发NotImplementedError。
完整修复(同时解决长度适配隐患)
修正继承关系的同时调整偏置项形状,让层支持可变长度输入,修复后完整代码如下:
import tensorflow.keras.backend as K from tensorflow.keras.layers import Layer class Attention(Layer): def __init__(self, return_sequences=True, **kwargs): super().__init__(**kwargs) self.return_sequences = return_sequences def build(self, input_shape): self.W = self.add_weight( name="att_weight", shape=(input_shape[-1], 1), initializer="normal" ) self.b = self.add_weight( name="att_bias", shape=(1, 1, 1), initializer="zeros" ) super().build(input_shape) def call(self, x): e = K.tanh(K.dot(x, self.W) + self.b) a = K.softmax(e, axis=1) output = x * a if self.return_sequences: return output return K.sum(output, axis=1) def get_config(self): config = super().get_config().copy() config.update({"return_sequences": self.return_sequences}) return config
模型加载说明
保存后的h5模型加载时,需要传入自定义层映射参数:
from tensorflow.keras.models import load_model model = load_model('/path/to/my_h5_model.h5', custom_objects={"Attention": Attention})
内容的提问来源于stack exchange,提问作者Ali Haider Ahmad
相关产品推荐
相关产品推荐

