ValueError:不支持在另一个 tf.keras 模型中量化 tf.keras 模型

问题描述 投票:0回答:2

我刚刚开始使用 Keras/Tensorflow,我正在尝试重新训练和量化为 int8 MobileNetV2,但我收到此错误:

ValueError: Quantizing a tf.keras Model inside another tf.keras Model is not supported.

我遵循这个指南来绕过量化步骤,但我不太确定我到底在做什么不同。

IMG_SHAPE = (224, 224, 3)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                                  include_top=False, 
                                                  weights='imagenet')
base_model.trainable = False
model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(units=2, activation='softmax')
])

quantize_model = tfmot.quantization.keras.quantize_model
q_aware_model = quantize_model(model)

堆栈跟踪:

ValueError                                Traceback (most recent call last)

<ipython-input-34-b724ad4872a5> in <module>()
      9 
     10 quantize_model = tfmot.quantization.keras.quantize_model
---> 11 q_aware_model = quantize_model(model)

4 frames

/usr/local/lib/python3.7/dist-packages/tensorflow_model_optimization/python/core/quantization/keras/quantize.py in _add_quant_wrapper(layer)
    217     if isinstance(layer, tf.keras.Model):
    218       raise ValueError(
--> 219           'Quantizing a tf.keras Model inside another tf.keras Model is not supported.'
    220       )
    221 
python tensorflow keras tensorflow-lite quantization-aware-training
2个回答
0
投票

在这种情况下,您的

base_model
的行为就好像它是一个图层。为了扩展它,您需要使用Functional API,而不是Sequential API:

IMG_SHAPE = (224, 224, 3)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                                  include_top=False, 
                                                  weights='imagenet')
base_model.trainable = False
x = tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu')(base_model.output)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(units=2, activation='softmax')(x)

model = tf.keras.Model(base_model.input, x)
model.summary()

请注意,模型摘要显示了所有层,包括

base_model's
。然后您就可以申请:

quantize_model = tfmot.quantization.keras.quantize_model
q_aware_model = quantize_model(model)

-1
投票

我正在使用一个存储库https://github.com/wangermeng2021/EfficientDet-tensorflow2其中模型是由

创建的
model = get_model(args,training=True)

get_model 代表以下内容。

def get_model(args, training=True):
    model_args = efficientdet_config.get_struct_args(args)
    if training:
        cur_num_classes = model_args.num_classes
        model_args.num_classes = 90
        model_pretrain = EfficientDetNet(model_args)
        model_inputs_pretrain = tf.keras.layers.Input(shape=(model_args.image_size, model_args.image_size, 3))
        model_outputs_pretrain = model_pretrain(model_inputs_pretrain,training=True)
        model_pretrain = tf.keras.Model(inputs=model_inputs_pretrain, outputs=model_outputs_pretrain)
        model_args.num_classes = cur_num_classes
        if args.use_pretrain:
            try:
                model_pretrained_weights = "./pretrain/efficientdet-{}/model".format(args.model_type)
                model_pretrain.load_weights(model_pretrained_weights).expect_partial()
            except:
                raise ValueError('weight file {} is invalid!'.format(model_pretrained_weights))

        model = EfficientDetNet(model_args)
        model_inputs = tf.keras.layers.Input(shape=(model_args.image_size, model_args.image_size, 3))
        model_outputs = model(model_inputs)
        num_level = model_args.max_level-model_args.min_level+1
        level_cls_outputs = [tf.keras.layers.Lambda(lambda x: x, name='level_{}_cls'.format(level))(model_outputs[0][level]) for level in range(num_level)]
        level_box_outputs = [tf.keras.layers.Lambda(lambda x: x, name='level_{}_box'.format(level))(model_outputs[1][level]) for level in range(num_level)]
        
        model = tf.keras.Model(inputs=model_inputs, outputs=(level_cls_outputs,level_box_outputs))

        for layer in model_pretrain.layers[-1].layers:
            if layer.name!='class_net':
                model.layers[-11].get_layer(layer.name).set_weights(model_pretrain.layers[-1].get_layer(layer.name).get_weights())
        return model

在这种情况下我也会遇到同样的错误。我需要在这里更改什么?

© www.soinside.com 2019 - 2024. All rights reserved.