我是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
,它本身不起作用。该错误消息指出,应再次使用QuantizeConfig
和quantize_annotate_layer()
函数。我试过了,但是根本没用。call
来覆盖原始对象的super
函数以获取原始结果,然后返回平方输出。我分别使用Default8BitQuantizeConfig
和Default8BitConvQuantizeConfig
来注释图层。这适用于Dense层,但不适用于Conv2D。再次,Conv2D版本在尝试转换模型时产生了与上述相同的错误。