tflite 如何将 Relu 融合到 conv 层中?
How does tflite fuses Relu into conv layers?
将 TF 模型转换为 tflite 模型(或者换句话说 - 使用 "post-training quantization" 量化模型)时,Relu 层从图中消失。这在 documentation 中有解释:"operations that can be simply removed from the graph (tf.identity), replaced by tensors (tf.placeholder), or fused into more complex operations (tf.nn.bias_add)."
我的问题是 - 如何将 Relu 层融合到前一层中? (这个"fusion"之外的数学是什么?这是量化模型的特定过程,还是也可以在原始浮点模型中完成?)
对于 TFLite 中的 Relu(或激活函数),融合背后并没有真正的数学原理,更多的是因为 Conv 内核支持在计算卷积时进行激活。
因此,与其构建 X 元素的张量作为 Conv 的输出,然后将其作为输入传递给随后的 Relu 层,后者只是迭代计算它,不如直接在卷积过程中钳制值。
因此,由于 TFLite 内核支持这一点,我们可以在转换期间简化图形并将激活层与 conv 融合,并在 ConvParams 中设置 FusedActivationFunction 类型,激活应该在卷积期间发生。
这并非特定于量化模型,TFLite 浮点 Conv 内核也这样做。
这是一个示例,其中在 GEMM 之前设置了钳位值
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/optimized/optimized_ops.h#L1338
对于 bias_add 消失,转换器融合 bias_add 和 conv 并在 Op 中设置偏置参数(以防添加的值是常数),所以内核可以在卷积计算过程中添加偏差值
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/reference/conv.h#L89
对于像 Mul 这样的情况,如果乘数是某个常数,转换器会将 mul 与 Conv 融合
Mul (Const_A, Conv(Input, Filter), bias)
Conv(输入, (过滤器 * Const_A), (偏差 * Const_A))
假设Const_A和Filter是可广播类型
希望对您有所帮助。
将 TF 模型转换为 tflite 模型(或者换句话说 - 使用 "post-training quantization" 量化模型)时,Relu 层从图中消失。这在 documentation 中有解释:"operations that can be simply removed from the graph (tf.identity), replaced by tensors (tf.placeholder), or fused into more complex operations (tf.nn.bias_add)."
我的问题是 - 如何将 Relu 层融合到前一层中? (这个"fusion"之外的数学是什么?这是量化模型的特定过程,还是也可以在原始浮点模型中完成?)
对于 TFLite 中的 Relu(或激活函数),融合背后并没有真正的数学原理,更多的是因为 Conv 内核支持在计算卷积时进行激活。 因此,与其构建 X 元素的张量作为 Conv 的输出,然后将其作为输入传递给随后的 Relu 层,后者只是迭代计算它,不如直接在卷积过程中钳制值。 因此,由于 TFLite 内核支持这一点,我们可以在转换期间简化图形并将激活层与 conv 融合,并在 ConvParams 中设置 FusedActivationFunction 类型,激活应该在卷积期间发生。 这并非特定于量化模型,TFLite 浮点 Conv 内核也这样做。 这是一个示例,其中在 GEMM 之前设置了钳位值 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/optimized/optimized_ops.h#L1338
对于 bias_add 消失,转换器融合 bias_add 和 conv 并在 Op 中设置偏置参数(以防添加的值是常数),所以内核可以在卷积计算过程中添加偏差值 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/reference/conv.h#L89
对于像 Mul 这样的情况,如果乘数是某个常数,转换器会将 mul 与 Conv 融合
Mul (Const_A, Conv(Input, Filter), bias)
Conv(输入, (过滤器 * Const_A), (偏差 * Const_A))
假设Const_A和Filter是可广播类型
希望对您有所帮助。