为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哔哔one 2024-01-04 17:00:56
我使用 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 tffrom tensorflow.keras.applications import MobileNetV2model = 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))
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

根据文档,事实证明,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_kernel



def 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_kernel



if 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))


查看完整回答
反对 回复 2024-01-04
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信