将正则化器从 tf.keras.applications 添加到模型时无法保存模型

我使用 python 3.7 和 Tensorflow 2.2.0。我想从头开始训练 MobileNet-V2,因此我采用已经构建的模型并向所有所需层添加正则化器。该模型编译得很好,我能够拟合它。但是,在保存模型时,遇到以下错误:


  File "/mnt/disk1/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow/python/saved_model/nested_structure_coder.py", line 82, in _map_structure

    "No encoder for object [%s] of type [%s]." % (str(pyobj), type(pyobj)))

tensorflow.python.saved_model.nested_structure_coder.NotEncodableError: No encoder for object [<tensorflow.python.keras.layers.convolutional.Conv2D object at 0x7fd2f00469d0>] of type [<class 'tensorflow.python.keras.layers.convolutional.Conv2D'>].

如果不添加正则化(下面代码中的 config.regularizer.name = ""),模型可以成功拟合并保存。我想知道这是一个错误还是我在这里做错了什么?


import tensorflow as tf

from tensorflow.keras.applications import MobileNetV2


model = MobileNetV2(input_shape=ds_info["shape"], classes=ds_info["n_classes"], weights=None, include_top=True)


if config.regularizer.name == "l2":

    l2_reg = config.regularizer.weight

    for layer in model.layers:

        if isinstance(layer, tf.keras.layers.DepthwiseConv2D):

            layer.add_loss(lambda la=layer: tf.keras.regularizers.l2(l2_reg)(la.depthwise_kernel))

        elif isinstance(layer, tf.keras.layers.Conv2D) or isinstance(layer, tf.keras.layers.Dense):

            layer.add_loss(lambda la=layer: tf.keras.regularizers.l2(l2_reg)(la.kernel))


哔哔one
浏览 43回答 1
1回答

潇湘沐

根据文档,事实证明,lambda 函数不应该带有任何参数。然而,当我没有传递参数时,它导致了另一个非常奇怪的错误(这是关于Dense没有 的层depthwise_kernel,这是显而易见的,不应该发生,但不知何故它发生了)。因此,我的最终解决方案是定义两个单独的正则化函数,如上面链接中的建议。def add_l2_regularization_kernel(layer, weight):    def _add_l2_regularization_kernel():        l2 = tf.keras.regularizers.l2(weight)        return l2(layer.kernel)    return _add_l2_regularization_kerneldef add_l2_regularization_depthwise_kernel(layer, weight):    def _add_l2_regularization_depthwise_kernel():        l2 = tf.keras.regularizers.l2(weight)        return l2(layer.depthwise_kernel)    return _add_l2_regularization_depthwise_kernelif config.has("regularizer"):    if config.regularizer.name == "l2":        l2_reg = config.regularizer.weight        for layer in model.layers:            if isinstance(layer, tf.keras.layers.DepthwiseConv2D):                layer.add_loss(add_l2_regularization_depthwise_kernel(layer, l2_reg))            elif isinstance(layer, tf.keras.layers.Conv2D) or isinstance(layer, tf.keras.layers.Dense):                layer.add_loss(add_l2_regularization_kernel(layer, l2_reg))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python