【问题标题】:Tensorflow per channel quantizationTensorFlow 每通道量化
【发布时间】:2019-01-13 06:28:27
【问题描述】:

使用当前的 Tensorflow quantization ops,我将如何在推理过程中模拟 每通道 量化?这个paper每层量化定义为

我们可以为整个张量指定单个量化器(由尺度和零点定义),称为每层量化

每通道量化为

每通道量化对于每个卷积核都有不同的比例和偏移量。

假设我们有这个子图

import tensorflow as tf

x = np.random.uniform(size=500*80*64*1)
      .astype('float32')
      .reshape(500, 80, 64, 1)
W1 = tf.get_variable('W1', 9, 5, 1, 96],
                    initializer=tf.truncated_normal_initializer(stddev=0.1))
h1 = tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='VALID')

在当前的 API 下,我可能会做这样的事情来模拟推理时的每层量化

import tensorflow as tf

x = np.random.uniform(size=500*80*64*1)
      .astype('float32')
      .reshape(500, 80, 64, 1)
min_x = tf.reduce_min(x)
max_x = tf.reduce_max(x)

W1 = tf.get_variable('W1', 9, 5, 1, 96],
                    initializer=tf.truncated_normal_initializer(stddev=0.1))
min_W1 = tf.reduce_min(W1)
max_W1 = tf.reduce_max(W1)

qX = tf.quantize(A, min_X, max_X, tf.quint8, mode='MIN_FIRST')
qW = tf.quantize(W, min_W, max_W, tf.quint8, mode='MIN_FIRST')

# This is how one would simulate per layer quantization for convolution.
qAW = tf.nn.quantized_conv2d(qX[0], qW[0], qX[1], qX[2], qW[1], qW[2], 
strides = [1, 1, 1, 1], padding='VALID')

我的问题是如何模拟每个通道的量化?据我了解,tf.quantization.quantize 实际上是在进行 per-layer 量化,而不是 per-channel 量化。此外,tf.nn.quantized_conv2d 实际上是在对量化层内核卷积进行量化层输入。

根据我对每通道量化的理解,会有koutput_minoutput_max。其中k 在我的示例中为96(内核数,类似于此API)。

张量流中是否有任何现有的 Ops 可以处理每通道量化,或者有没有办法让它与现有的 ops 一起工作?

【问题讨论】:

    标签: python tensorflow tensorflow-lite


    【解决方案1】:

    目前无法在 tflite 上模拟每通道量化推断。 如我所见,如今的 tensorflow 开发人员正在实现 experimental symmetric per channel quantization。但是没有办法测试它

    【讨论】:

    • 似乎每层量化将在 tflite 上被弃用,并且默认情况下每通道量化是否有可能以某种方式在 tflite 上具有该功能或理想情况下两者兼有?
    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2021-01-01
    • 2017-03-03
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多