解决NotImplementedError: Layer XX has arguments in `__init__` and therefore must override `get_config`

一、报错提示

NotImplementedError: Layer XX has arguments in __init__ and therefore must override get_config.
(XX表示自定义的CLASS)

二、错误原因

使用save方法后,未重新在Class中自定义属性

三、原因

模型保存有两种接口,save和save_weights方法。
区别如下:
save:保存网络模型图结构和参数。
save_weights:仅保存网络模型的参数。

如果使用save方法,自定义的Class里面的声明需要get_config重新配置声明一遍,否则Tensorflow无法保存模型的图结构(至于具体为什么,我就不深究了,毕竟用的人家的接口,只是知道了这个特点)。

如果不想重写,可以用save_weights暂时解决参数的保存的问题,也就不会有上述错误了。但毕竟save()更全面,为了后期的省事,还是推荐使用它(虽然稍占内存)。

四、解决方案

解决save()报错的具体操作如下:
在定义的Class里,增加一个get_config函数用于配置的更新(具体操作如下)。
其中__init__中的声明过的所有属性,需要在get_config函数中update一下。见下图圈中部分

get_config模板如下,替换掉再跑就好了。

def get_config(self):
        config = super().get_config().copy()
        config.update({
            '属性1': self.属性1,
            '属性2': self.属性2,
            '属性3': self.属性3,
        })
        return config

在这里插入图片描述
再次运行,模型保存成功!

这个错误通常是由于自定义层没有正确实现 `get_config` 方法导致的。在 Keras 中,当你使用自定义层时,需要将其序列化,以便能够保存模型并将其加载到其他环境中。因此,每个自定义层都必须实现 `get_config` 方法,该方法返回一个字典,其中包含层的参数。 下面是一个自定义层的示例,其中实现了 `get_config` 方法: ``` import tensorflow as tf class MyLayer(tf.keras.layers.Layer): def __init__(self, units=32): super(MyLayer, self).__init__() self.units = units def build(self, input_shape): self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer='random_normal', trainable=True) self.b = self.add_weight(shape=(self.units,), initializer='random_normal', trainable=True) def call(self, inputs): return tf.matmul(inputs, self.w) + self.b def get_config(self): config = super(MyLayer, self).get_config() config.update({'units': self.units}) return config ``` 在这个例子中,我们定义了一个名为 `MyLayer` 的自定义层,它有一个名为 `units` 的参数。在 `__init__` 方法中,我们将 `units` 存储为层的属性。在 `build` 方法中,我们定义了层的权重,并在 `call` 方法中使用它们来计算输出。 最重要的是,我们还实现了 `get_config` 方法,该方法返回一个字典,其中包含层的参数。在这个例子中,我们将 `units` 添加到字典中,但是如果你有其他参数,你也应该将它们添加到字典中。 当你在模型中使用自定义层时,Keras 将自动调用 `get_config` 方法,并将返回的字典保存在模型的配置中。因此,当你加载模型时,Keras 将使用这些配置来重建自定义层,并使用正确的参数来初始化它们。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinysama

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值