使用函数式 API 进行迁移学习和量化感知训练

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

我有一个正在使用 MobileNetV2 迁移学习的模型,我想对其进行量化,并将其与使用迁移学习的非量化模型的准确性差异进行比较。但是,它们并不完全支持递归量化,但根据此,此方法应该量化我的模型:https://github.com/tensorflow/model-optimization/issues/377#issuecomment-820948555

我尝试做的是:

import tensorflow as tf
import tensorflow_model_optimization as tfmot
pretrained_model = tf.keras.applications.MobileNetV2(include_top=False)
pretrained_model.trainable = True
    
for layer in pretrained_model.layers[:-1]:
    layer.trainable = False
    
quantize_model_pretrained = tfmot.quantization.keras.quantize_model
q_pretrained_model = quantize_model_pretrained(pretrained_model)
    
    
original_inputs = tf.keras.layers.Input(shape=(224, 224, 3))
y = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)(original_inputs)
y = base_model(original_inputs)
y = tf.keras.layers.GlobalAveragePooling2D()(y)
original_outputs = tf.keras.layers.Dense(5, activation="softmax")(y)

model_1 = tf.keras.Model(original_inputs, original_outputs)
quantize_model = tfmot.quantization.keras.quantize_model
q_aware_model = quantize_model(model_1)

它仍然给我以下错误:

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

我想了解在这种情况下执行量化感知训练的正确方法是什么?

python tensorflow machine-learning keras deep-learning
2个回答
2
投票

根据您提到的issue,您应该分别量化每个模型,然后将它们组合在一起。像这样的东西:

import tensorflow as tf
import tensorflow_model_optimization as tfmot

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=(224, 224, 3), include_top=False)
pretrained_model.trainable = True
    
for layer in pretrained_model.layers[:-1]:
    layer.trainable = False
    
q_pretrained_model = tfmot.quantization.keras.quantize_model(pretrained_model)
q_base_model = tfmot.quantization.keras.quantize_model(tf.keras.Sequential([tf.keras.layers.GlobalAveragePooling2D(input_shape=(7, 7, 1280)), tf.keras.layers.Dense(5, activation="softmax")]))
   
original_inputs = tf.keras.layers.Input(shape=(224, 224, 3))
y = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)(original_inputs)
y = q_pretrained_model(original_inputs)
original_outputs = q_base_model(y)

model = tf.keras.Model(original_inputs, original_outputs)

它看起来并不像已经开箱即用的支持,即使这是声称


0
投票

对迁移学习模型进行量化感知训练的一个解决方法是首先将其转换为 keras 模型:

inputs = pretrained_model.input
outputs = pretrained_model.output
model = tf.keras.Model(inputs=inputs, outputs=outputs)

稍后使用

将量化感知注释应用到所需的层
def apply_quantization(layer):
        if isinstance(layer, tf.keras.layers.Conv2D) or isinstance(layer, tf.keras.layers.Dense):
            return tfmot.quantization.keras.quantize_annotate_layer(layer)
        return layer

annotated_model = tf.keras.models.clone_model(
    model,
    clone_function=apply_quantization,
)

请注意,该层需要 Keras 支持 QAT。这些层包括卷积层、激活层和密集层。要仔细检查标签是否已添加到您的模型中,您可以检查 annotated_model 摘要。

model.summary()

您还可以根据您的情况向迁移学习模型添加层:

inputs = pretrained_model.input
x = Flatten()(pretrained_model.output)
outputs = Dense(5, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

在应用注释之前。据我所知,GlobalAveragePooling 不受支持,因此也许可以考虑忽略它。

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