Как я могу смоделировать поканальное квантование во время вывода? Эта статья определяет послойное квантование как
Мы можем указать один квантователь (определяемый масштабом и нулевой точкой) для всего тензора, называемого послойным квантованием.
и поканальное квантование как
Поканальное квантование имеет разный масштаб и смещение для каждого сверточного ядра.
Предположим, у нас есть этот подграф
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 действительно делает послойное квантование, а не поканальное квантование. Кроме того, tf.nn.quantized_conv2d
фактически выполняет ввод квантованного слоя для сверток квантованных слоев ядра.
Согласно моему пониманию поканального квантования, будет k
, output_min
и output_max
. Где k
в моем примере 96
(количество ядер, аналогично этому API < / а>).
Существуют ли какие-либо операции в тензорном потоке, которые могут обрабатывать квантование на канал, или есть способ заставить его работать с существующими операциями?