【发布时间】:2019-11-13 07:47:37
【问题描述】:
我有一个 wav2letter 模型(语音识别模型),我正在尝试手动正确地引入 fakeQuant 操作。我已经设法在适当的位置引入它们(以便 tflite 转换器设法生成 u8_tflite_model),但我的问题是在训练时这些操作的最小/最大范围没有得到更新。这意味着它们在乞求时保持相同(或几乎相同),并且梯度似乎没有流动。
我尝试以多种方式(例如)定义 fakequant:
min_w = tf.get_variable("min_quant_weights", shape=[], initializer=tf.constant_initializer(0), trainable=True)
max_w = tf.get_variable("max_quant_weights", shape=[], initializer=tf.constant_initializer(1), trainable=True)
filters = tf.fake_quant_with_min_max_vars(filters, min=tf.reduce_min(min_w), max=tf.reduce_max(max_w), num_bits=8)
或
min_w = tf.Variable(0.0, name="min_quant_weights")
max_w = tf.Variable(1.0, name="max_quant_weights")
filters = tf.fake_quant_with_min_max_vars(filters, min=min_w, max=max_w)
或
min_w = 0
max_w = 1
filters = tf.quantization.fake_quant_with_min_max_args(bias, min=min_w, max=max_w, num_bits=8, narrow_range=False, name=None)
但无论我尝试什么,最小值/最大值都保持不变。正因为如此,模型(目前仅对一个句子进行了微调)设法使权重适应这些范围,而根本不改变激活范围。我相信在使用 fakeQuants 训练期间,范围和权重都应该更新(我正确吗?)。
此外,这里描述的tf.contrib.quantize.create_training_graph 工具:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/quantize 在我的情况下不起作用,因为定义模型的方式使得该工具无法确定这些 fakeQuant 操作应该在在哪里被介绍,这就是为什么我尝试一种更“hacky”的方式将它们注入到图形源代码中。
有没有人设法正确地做到这一点,或者我完全误解了 fakequant 运营商的工作方式?
谢谢!
【问题讨论】:
-
我想我将不得不在适当的地方引入 tf.fake_quant_with_min_max_vars_gradient ...
标签: python tensorflow deep-learning tensorflow-lite quantization