Python Keras:尽管具有get_config,但无法使用自定义层加载模型

时间:2020-03-26 15:17:23

标签: python keras

我为Keras模型使用了一个自定义层,即DepthwiseConv3D层。 我训练了模型并使用model.save("model.h5")

保存了模型
from DepthwiseConv3D import DepthwiseConv3D

model = load_model('model.h5',
          custom_objects={'DepthwiseConv3D': DepthwiseConv3D})

但是我收到了DepthWiseConv3D在以下位置引发的“ TypeError:乱序类型:NoneType()> int()”。

if (self.groups > self.input_dim):
       raise ValueError('The number of groups cannot exceed the number of channels')

图层配置为:

 def get_config(self):
        config = super(DepthwiseConv3D, self).get_config()
        config.pop('filters')
        config.pop('kernel_initializer')
        config.pop('kernel_regularizer')
        config.pop('kernel_constraint')
        config['depth_multiplier'] = self.depth_multiplier
        config['depthwise_initializer'] = initializers.serialize(self.depthwise_initializer)
        config['depthwise_regularizer'] = regularizers.serialize(self.depthwise_regularizer)
        config['depthwise_constraint'] = constraints.serialize(self.depthwise_constraint)
        return config

我实例化为

x = DepthwiseConv3D(kernel_size=(7,7,7),
                depth_multiplier=1,groups=9, 
                padding ="same", use_bias=False,
                input_shape=(50, 37, 25, 9))(x)
x = DepthwiseConv3D(depth_multiplier= 32, groups=8, kernel_size=(7,7,7), 
                strides=(2,2,2), activation='relu', padding = "same")(x)
x = DepthwiseConv3D(depth_multiplier= 64, groups=8, kernel_size=(7,7,7), 
                strides=(2,2,2), activation='relu', padding = "same")(x)

如何加载我的模型?

1 个答案:

答案 0 :(得分:1)

您使用的自定义层中的get_config方法未正确实现,它没有保存所需的所有参数,因此在加载模型时出错。

如果可以使用相同的原始代码实例化模型,则可以使用model.load_weights从同一文件加载权重。这只是解决问题的方法,它应该可以工作。适当的解决方案是实施正确版本的get_config,这将需要重新训练模型。