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

使用自定义注意力层时保存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:01:08