如何从 .h5 文件正确加载带有自定义层的 Keras 模型?

wal*_*ema 11 python-3.x keras keras-layer

我构建了一个带有自定义层的 Keras 模型,并.h5通过回调将其保存到一个文件中ModelCheckPoint。当我在训练后尝试加载此模型时,出现以下错误消息:

__init__() missing 1 required positional argument: 'pool_size'
Run Code Online (Sandbox Code Playgroud)

这是自定义层及其__init__方法的定义:

__init__() missing 1 required positional argument: 'pool_size'
Run Code Online (Sandbox Code Playgroud)

这就是我将此层添加到我的模型的方式:

class MyMeanPooling(Layer):
    def __init__(self, pool_size, axis=1, **kwargs):
        self.supports_masking = True
        self.pool_size = pool_size
        self.axis = axis
        self.y_shape = None
        self.y_mask = None
        super(MyMeanPooling, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)

这是我加载模型的方式:

x = MyMeanPooling(globalvars.pool_size)(x)
Run Code Online (Sandbox Code Playgroud)

这些是完整的错误消息:

Traceback (most recent call last):
  File "D:/My Projects/Attention_BLSTM/script3.py", line 9, in <module>
    model = load_model(model_path, custom_objects={'MyMeanPooling': MyMeanPooling})
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\engine\saving.py", line 419, in load_model
    model = _deserialize_model(f, custom_objects, compile)
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\engine\saving.py", line 225, in _deserialize_model
    model = model_from_config(model_config, custom_objects=custom_objects)
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\engine\saving.py", line 458, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\layers\__init__.py", line 55, in deserialize
    printable_module_name='layer')
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\utils\generic_utils.py", line 145, in deserialize_keras_object
    list(custom_objects.items())))
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\engine\network.py", line 1022, in from_config
    process_layer(layer_data)
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\engine\network.py", line 1008, in process_layer
    custom_objects=custom_objects)
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\layers\__init__.py", line 55, in deserialize
    printable_module_name='layer')
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\utils\generic_utils.py", line 147, in deserialize_keras_object
    return cls.from_config(config['config'])
  File "D:\ProgramData\Anaconda3\envs\tf\lib\site-packages\keras\engine\base_layer.py", line 1109, in from_config
    return cls(**config)
TypeError: __init__() missing 1 required positional argument: 'pool_size'
Run Code Online (Sandbox Code Playgroud)

Mat*_*gro 9

其实我不认为你可以加载这个模型。

最可能的问题是您没有get_config()在层中实现该方法。此方法返回应保存的配置值字典:

def get_config(self):
    config = {'pool_size': self.pool_size,
              'axis': self.axis}
    base_config = super(MyMeanPooling, self).get_config()
    return dict(list(base_config.items()) + list(config.items()))
Run Code Online (Sandbox Code Playgroud)

将此方法添加到您的层后,您必须重新训练模型,因为之前保存的模型没有保存该层的配置。这就是您无法加载它的原因,它需要在进行此更改后重新训练。