NotImplementedError:`__init__`中带有参数的图层必须覆盖`get_config` - python

我正在尝试使用model.save()保存我的TensorFlow模型,但是-我遇到此错误。

此处提供了模型摘要:
Model Summary

变压器模型的代码:

def transformer(vocab_size, num_layers, units, d_model, num_heads, dropout, name="transformer"):
    inputs = tf.keras.Input(shape=(None,), name="inputs")
    dec_inputs = tf.keras.Input(shape=(None,), name="dec_inputs")

    enc_padding_mask = tf.keras.layers.Lambda(
        create_padding_mask, output_shape=(1, 1, None),
        name='enc_padding_mask')(inputs)
    # mask the future tokens for decoder inputs at the 1st attention block
    look_ahead_mask = tf.keras.layers.Lambda(
        create_look_ahead_mask,
        output_shape=(1, None, None),
        name='look_ahead_mask')(dec_inputs)
    # mask the encoder outputs for the 2nd attention block
    dec_padding_mask = tf.keras.layers.Lambda(
        create_padding_mask, output_shape=(1, 1, None),
        name='dec_padding_mask')(inputs)

    enc_outputs = encoder(
        vocab_size=vocab_size,
        num_layers=num_layers,
        units=units,
        d_model=d_model,
        num_heads=num_heads,
        dropout=dropout,
    )(inputs=[inputs, enc_padding_mask])

    dec_outputs = decoder(
        vocab_size=vocab_size,
        num_layers=num_layers,
        units=units,
        d_model=d_model,
        num_heads=num_heads,
        dropout=dropout,
    )(inputs=[dec_inputs, enc_outputs, look_ahead_mask, dec_padding_mask])

    outputs = tf.keras.layers.Dense(units=vocab_size, name="outputs")(dec_outputs)

    return tf.keras.Model(inputs=[inputs, dec_inputs], outputs=outputs, name=name)

我不明白为什么会出现此错误,因为模型训练得很好。
任何帮助,将不胜感激。

我的保存代码供参考:

print("Saving the model.")
saveloc = "C:/tmp/solar.h5"
model.save(saveloc)
print("Model saved to: " + saveloc + " succesfully.")

参考方案

这不是一个错误,这是一个功能。

此错误使您知道TF无法保存模型,因为它无法加载模型。
具体来说,它将无法重新实例化自定义的Layer类:encoderdecoder

要解决此问题,只需根据您添加的新参数覆盖其get_config方法。

层配置是包含层配置的Python字典(可序列化)。稍后可以从此配置中重新实例化同一层(没有经过训练的权重)。

例如,如果您的encoder类看起来像这样:

class encoder(tf.keras.layers.Layer):

    def __init__(
        self,
        vocab_size, num_layers, units, d_model, num_heads, dropout,
        **kwargs,
    ):
        super().__init__(**kwargs)
        self.vocab_size = vocab_size
        self.num_layers = num_layers
        self.units = units
        self.d_model = d_model
        self.num_heads = num_heads
        self.dropout = dropout

    # Other methods etc.

那么您只需要重写此方法:

    def get_config(self):

        config = super().get_config().copy()
        config.update({
            'vocab_size': self.vocab_size,
            'num_layers': self.num_layers,
            'units': self.units,
            'd_model': self.d_model,
            'num_heads': self.num_heads,
            'dropout': self.dropout,
        })
        return config

当TF看到这两个类时,您将能够保存模型。

因为现在加载模型时,TF将能够从config重新实例化同一层。

Layer.from_config的source code可以更好地了解其工作原理:

@classmethod
def from_config(cls, config):
  return cls(**config)

python:ConfigParser对象,然后再阅读一次 - python

场景:我有一个配置文件,其中包含要执行的自动化测试的列表。这些测试是长期循环执行的。   配置文件的设计方式使ConfigParser可以读取它。由于有两个三个参数,因此我需要通过每个测试。现在,此配置文件由script(s1)调用,并且按照配置文件中的列表执行测试。Script(s1)第一次读取配置,并且在每次测试完成后都会执行。阅读两次的要求:由于可能会…

如何重写在__init__.py中定义的方法? - python

我正在尝试使用模块(pandas_access),在__init__.py上定义的方法(_extract_dtype)上有问题覆盖__init__.py上定义的方法的正确方法(或任何方法)是什么? 参考方案 您可以“猴子补丁”方法,例如def _extract_dtype_patched(self): print("Patched version&…

如何根据传递给__init__方法的字符串值在类内命名变量? - python

                                class MyClass: __init__(self, some_string): self.some_string = anything 因此类似于pandas的DataFrame类,在该类中,可以通过在点运算符后面附加列名来引用列。喜欢:df.column_name_of_some_co…

Flask-从request.get_json()获取键值 - python

我试图从ajax POST请求json数据后获取键值。我成功检索了数据,但是出现错误:“ AttributeError:'unicode'对象没有属性'keys'”。我曾尝试使用json.load(data),但这也没有成功。@app.route('/sendstats', methods=['GET', '…

Django隐藏重定向 - python

我想为应用内重定向创建一种机制,该机制不会完全重定向,而只是加载另一个视图函数。假设我要进行localhost:8000/a,django渲染视图,视图的最后一行说return HttpResponseRedirect('/b') 因此,现在我的浏览器将转到localhost:8000/b,django将呈现视图并将其返回给我。现在,我只…