在TF-Lite中使用自定义激活功能

时间:2020-06-04 12:09:42

标签: tensorflow tensorflow-lite tf-lite

我是TensorFlow Lite的新手,并且使用自定义激活函数(f(x)= x ^ 2)遇到了问题。

让模型量化意识,编译,训练和评估工作正常。但是,尝试转换模型已成为一个问题。我尝试遵循“量化意识培训综合指南”,并创建了一个自定义QuantizeConfig。由于权重量化是我主要感兴趣的部分,因此我使用了与“修改层的一部分以进行量化”部分中相同的技术,并跳过了对激活的量化:

def get_activations_and_quantizers(self, layer):
    # Skip quantizing activations.
    return []

def set_quantize_activations(self, layer, quantize_activations):
    # Empty since `get_activaations_and_quantizers` returns
    # an empty list.
    return

但是,当尝试转换模型时,出现以下错误/异常:

File "C:\[..]\lib\site-packages\tensorflow\lite\python\wrap_toco.py", line 32, in wrapped_toco_convert
  return _pywrap_toco_api.TocoConvert(
Exception: C:\[...]\lib\site-packages\tensorflow\python\ops\gen_math_ops.py:5793:1: error: 'std.constant' op requires attribute's type ('tensor<20x20xf32>') to match op's return type ('tensor<*xf32>')
_, _, _op, _outputs = _op_def_library._apply_op_helper(

File "C:\[...]\lib\site-packages\tensorflow\lite\python\convert.py", line 183, in toco_convert_protos
  raise ConverterError(str(e))
tensorflow.lite.python.convert.ConverterError: C:\[...]\lib\site-packages\tensorflow\python\ops\gen_math_ops.py:5793:1: error: 'std.constant' op requires attribute's type ('tensor<20x20xf32>') to match op's return type ('tensor<*xf32>')
_, _, _op, _outputs = _op_def_library._apply_op_helper(

是否只能量化权重而不是激活函数?如果不是,是否有任何示例描述如何量化自定义激活函数?我在谷歌搜索时没有在这些行中找到任何东西,并且迷失了试图在源代码中搜索它的地方。

作为参考,这是我用来转换模型的内容:

converter = tf.lite.TFLiteConverter.from_keras_model(quant_aware_model)
converter.allow_custom_ops = True
converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,
    tf.lite.OpsSet.SELECT_TF_OPS
]
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(quantized_tflite_model)

编辑(我尝试过的其他操作):

  • 尝试实现一个自定义层,该层在call方法中进行平方。与自定义激活功能存在相同的问题。
  • 紧随相关层之后,使用tf.keras.layers.Multiply()层代替激活功能。但是不支持layer,需要将QuantizeConfig传递到quantize_annotate_layer()中。但是,这样做会导致与上述完全相同的问题:仅转换模型无效,并且与上述相同。
  • 使用tf.math.multiply(x, x)。由于Layer tf_op_layer_Mul:<class 'tensorflow.python.keras.engine.base_layer.TensorFlowOpLayer'> is not supported,它本身不起作用。该错误消息指出,应再次使用QuantizeConfigquantize_annotate_layer()函数。我试过了,但是根本没用。
  • 最后,我尝试制作需要平方激活函数的层的平方版本(Dense和Conv2D)。我通过设置各自的层来做到这一点,首先使用call来覆盖原始对象的super函数以获取原始结果,然后返回平方输出。我分别使用Default8BitQuantizeConfigDefault8BitConvQuantizeConfig来注释图层。这适用于Dense层,但不适用于Conv2D。再次,Conv2D版本在尝试转换模型时产生了与上述相同的错误。

0 个答案:

没有答案