我对张量流的量化还相当陌生。我有以下代码:

import tensorflow as tf
from tensorflow.python.ops.gen_math_ops import quantized_mat_mul
from tensorflow.python.ops.gen_math_ops import quantized_add

a = tf.constant([1.4,-1.2],shape =[1,2],dtype = tf.float32)
a1 = tf.constant([[1.0],[1.0]],shape = [2,1], dtype=tf.float32)
bias_a = tf.constant([-1.2,1.2],shape=[1,2],dtype = tf.float32)

min_a= tf.reduce_min(a)
max_a= tf.reduce_max(a)
x = tf.quantize(a,min_a,max_a,tf.quint8)

min_a1= tf.reduce_min(a1)
max_a1= tf.reduce_max(a1)
x1 = tf.quantize(a1,min_a1,max_a1,tf.quint8)

min_bias_a= tf.reduce_min(bias_a)
max_bias_a= tf.reduce_max(bias_a)
bias_a_x = tf.quantize(bias_a,min_bias_a,max_bias_a,tf.qint32)

y =tf.matmul(a,a1)
y1 = quantized_mat_mul(x.output,x1.output,x.output_min,x.output_max,x1.output_min,x1.output_max)

o = quantized_add(y1.out,bias_a_x.output,y1.min_out,y1.max_out,bias_a_x.output_min,bias_a_x.output_max)


y1的结果如下(qint32,float_max,float_min),其中float_max和float_min表示量化的int 32位输出的最小和最大float值。

但是,quantized_add需要以下格式的输入(quint8,float_max,float_min),其中float_max和float_min是表示量化uint8结果的最大和最小float值。

我想知道是否有一种方法可以将qint32的结果转换为quint8,这样我就可以将其输入quantized_add函数中了?

如果有人可以帮助我,我将不胜感激。

谢谢并恭祝安康,
阿比纳夫·乔治(Abhinav George)

最佳答案

您可以将类型从tf.int32强制转换为tf.quint8,如下所示:


y1_out = tf.cast(y1.out, tf.quint8)
bias_a_x_out = tf.cast(bias_a_x.output, tf.quint8)


然后执行quantized_add为:

o = quantized_add(y1_out,
              bias_a_x_out,
              y1.min_out,
              y1.max_out,
              bias_a_x.output_min,
              bias_a_x.output_max)

09-27 09:10