首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >量化感知训练比后量化差

量化感知训练比后量化差
EN

Stack Overflow用户
提问于 2021-11-02 08:28:36
回答 1查看 69关注 0票数 0

我想使用量化感知训练将我的模型量化为int8。不幸的是,我不能简单地量化整个模型,因为我的第一层是批归一化(在InputLayer之后),所以我需要为该层使用一个自定义的quantizationConfig。我的问题是,我的准确率下降了大约4%,而使用后量化只下降了2%。下面的代码有什么问题吗?如果没有,你知道为什么QAT在这种情况下会变得更糟吗?

代码语言:javascript
复制
class DefaultDenseQuantizeConfig(tfmot.quantization.keras.QuantizeConfig):

   def get_weights_and_quantizers(self, layer):
     return [(layer.weights[i], LastValueQuantizer(num_bits=8, symmetric=True, narrow_range=False, per_axis=False)) for i in range(2)]

   def get_activations_and_quantizers(self, layer):
     return []

   def set_quantize_weights(self, layer, quantize_weights):
     layer.weights[0] = quantize_weights[0]
     layer.weights[1] = quantize_weights[1]

   def set_quantize_activations(self, layer, quantize_activations):
     pass

   def get_output_quantizers(self, layer):
    return [tfmot.quantization.keras.quantizers.MovingAverageQuantizer(
        num_bits=8, per_axis=False, symmetric=False, narrow_range=False)]

   def get_config(self):
     return {}

def apply_quantization_to_dense(self,layer):
  if layer != self.base_model.layers[1]:
     return tfmot.quantization.keras.quantize_annotate_layer(layer)
  else:
     return tfmot.quantization.keras.quantize_annotate_layer(
            layer,
            quantize_config=DefaultDenseQuantizeConfig())

annotated_model = tf.keras.models.clone_model(
         self.base_model,
         clone_function=self.apply_quantization_to_dense,
        )
q_aware_model = quantize_annotate_model(annotated_model)
with quantize_scope(
    {'DefaultDenseQuantizeConfig': DefaultDenseQuantizeConfig,}):
        q_aware_model = tfmot.quantization.keras.quantize_apply(q_aware_model)

q_aware_model.compile(optimizer=self.optimizer, loss=self.loss, loss_weights=self.loss_weights)
q_aware_model.fit(self.train_dataset,
                          steps_per_epoch= epochs,    
                          epochs=self.quantization_dict["quantization_epochs"],
                          callbacks=callbacks, )

converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_tflite_model = converter.convert()
EN

回答 1

Stack Overflow用户

发布于 2021-11-08 15:22:46

如果没有实际的模型,很难说出任何结论。

我建议开始检查量化配置是否如您所期望的那样应用在模型上。这包括在带注释的模型上调用summary()时查看每层输出。如果需要,可以使用Netron等工具进一步检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69807316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档