问题标签 [quantization-aware-training]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
82 浏览

deep-learning - 量化模型的 QAT 输出节点具有相同的最小最大范围

最近,我在 tf1.x 上进行了量化感知训练,以将模型推送到 Coral Dev Board。但是,当我完成模型训练后,为什么我的 2 个输出假量化的最小最大值是相同的?

当一个人的最大目标是 95 和一个是 2pi 时,它应该有所不同吗?

量化感知训练的最小最大值相同

0 投票
1 回答
187 浏览

python - TensorFlow QAT 如何获得量化权重

如何在 TensorFlow 的量化感知训练 (QAT) 后获取量化权重的值或获取量化感知权重。我想在 NumPy 上为应用程序使用整数量化权重。到目前为止,我使用如下,它给出了 float32 值。

0 投票
1 回答
315 浏览

python - 如何在 Python 中执行定点量化

我希望量化现有神经网络模型的权重和偏差。根据我的理解,定点表示确保权重、偏差和激活的固定位宽,具有预定固定数量的整数和小数位。

本质上我想执行训练后量化。我查看了这篇文章https://www.tensorflow.org/model_optimization/guide/quantization/post_training

但是,我找不到任何对我想要做的事情的支持,即能够在定点表示方案中为权重、偏差和激活指定整数和小数位的数量。

我确实找到了似乎支持此功能的 QKeras 库。但是,它似乎没有内置的量化 sigmoid 层。

任何可以帮助我做我想做的事情的指针或图书馆/文章推荐,都会非常有帮助并非常感激。

0 投票
1 回答
127 浏览

tensorflow - ValueError:未知层:AnchorBoxes 量化张量流

我正在将量化应用于 SSD 模型。附上要点。加载模型时添加了一个名为“AnchorBoxes”的自定义对象。当我不进行量化时,这很好用。但是当我应用量化时,无法识别此自定义对象。

我尝试了解决方法。

我在上面的代码中注释了这一行quant_aware_model = tfmot.quantization.keras.quantize_apply(annotated_model),因为它抛出了错误ValueError: Unknown layer: AnchorBoxes

相反,我在对 Conv2D 层应用量化后保存了模型,如下所示

然后我加载了模型,希望如下加载的量化模型将附加 custom_objects。

最后,我将其应用于具有量化层quantize_apply的新的。loaded_model

这再次导致了同样的错误

系统信息

TensorFlow 版本(从源代码或二进制安装):TF 2.0.0

TensorFlow 模型优化版本(从源代码或二进制安装):0.5.0

描述预期的行为
当我运行 quantize_apply(model) 时,模型应该能够感知量化

描述当前行为
在自定义对象上引发错误

重现问题
要点的代码

0 投票
2 回答
328 浏览

tensorflow - 如何在量化感知训练后合并 ReLU

我有一个包含 Conv2D 层和 ReLU 激活的网络,声明如下:

它被移植到 TFLite,具有以下表示:

没有 Q-aware 训练的基本 TFLite 网络

然而,在网络上执行量化感知训练并再次移植后,ReLU 层现在在图中是明确的:

Q-aware 训练后的 TFLite 网络

这导致它们在目标上被单独处理,而不是在评估 Conv2D 内核期间,从而在我的整个网络中导致 10% 的性能损失。

使用以下隐式语法声明激活不会产生问题:

具有隐式 ReLU 激活的基本 TFLite 网络

在 Q 感知训练后具有隐式 ReLU 的 TFLite 网络

但是,这将网络限制为基本的 ReLU 激活,而我想使用不能以这种方式声明的 ReLU6。

这是 TFLite 问题吗?如果没有,有没有办法防止 ReLU 层被分裂?或者,有没有办法在量化感知训练之后手动将 ReLU 层合并回 Conv2D 层?

编辑: QA培训代码:

量化的 TFLite 模型生成代码:

0 投票
0 回答
125 浏览

python - 为什么评估量化模型的指标中有一些 1、0 和一些 NAN?

我在做 CNN 量化,我使用下面的代码来计算一些指标。

但我得到了这样的结果:

我不知道为什么除了准确性之外的所有指标都如此奇怪。有谁知道这是怎么回事?

0 投票
0 回答
309 浏览

tensorflow - 量化感知训练 Tensorflow 对象检测 API

我正在使用 tensorflow 的对象检测 api 来训练我自己的对象检测模型。目前在 tensorflow 1.15 上使用 ssd_inception_v2。我之前使用这个 api 训练了许多模型,但我想要做的是提高我的推理时间。我想尝试通过将这些行添加到我可以执行 qat 的配置文件中发现的量化意识训练。

现在我的问题是,在完成培训后,我是否需要将我的冻结模型转换为 tflite 以利用 8 位精度?或者如果我直接使用我的冻结模型,它会使用 8 位精度吗?如果不是,我如何将我的 pb 转换为 tflite 并对此进行推断?

0 投票
1 回答
185 浏览

tensorflow - 为什么从量化感知训练模型派生的 TFLite 模型与具有相同权重的正常模型不同?

我正在训练一个我想在量化的 8 位环境(微控制器)中使用 TFLite 部署的 Keras 模型。为了提高量化性能,我进行了量化感知训练。然后,我使用我的验证集作为代表性数据集创建量化的 TFLite 模型。使用验证集评估性能并在此图像中说明:

不同条件下各批次 20 次运行的错误率

如果不是简单地从 QA 训练的模型(图中的红色)生成 TFLite 模型(图中的青色),我将权重从 QA 训练的模型复制到原始模型,然后生成 TFLite 模型以解决问题(图中的紫色),这给出了稍微不同的预测。这是为什么?

我知道 TFLite 模型与 QA 训练的模型略有不同,因为转换使用基于验证集的训练后量化。但是如果网络的结构、权重和偏差相同,量化不应该相同吗?

子问题:为什么 TFLite 模型平均比正常的 Keras 模型略差?由于我正在对验证集进行量化和评估,如果有的话,我希望它能够人为地表现得更好。

0 投票
1 回答
464 浏览

python - 如何通过实验量化从 TensorFlow 的量化感知训练中获得量化权重

我正在使用 TensorFlow 的量化感知训练 API,并希望部署具有任意位宽的模型。由于 tflite 部署仅支持 8 位量化,因此我将使用自定义推理算法进行部署,但我仍然需要以正确的大小访问模型的权重。

目前,在使用量化感知训练后,我的模型仍处于浮点状态,据我所知,访问量化权重的唯一方法是将模型转换为 tflite 格式。但是,在使用实验功能时这是不可能的。

这是我的量化配置类:

这是我量化模型的方法:

之前说过,在 ModifiedQuantizer 中使用 eg bits=4 时,模型仍然保存在浮点数中,我不知道如何访问量化的权重。

谢谢!

0 投票
0 回答
241 浏览

python - TensorFlow 的 QAT 似乎没有使用 AllValuesQuantizer 执行每通道量化

我使用 AllValuesQuantizer 创建了两个 QAT 模型,一个使用每个张量,一个使用每个通道量化。在检查它们各自的 QuantizeWrapper 层时,我注意到它们都有变量 kernel_min 和 kernel_max 的标量值。

这是一个每张量量化模型的示例

这是每通道量化模型的示例

正如我从这篇论文中了解到的,内核的最小/最大值是定义比例和零点量化参数的东西。对于每张量量化,模型只有一个最小值和最大值是合理的,因为整个张量具有相同的尺度和零点。但是,对于每通道量化(每个通道都有自己的比例和零点)我相信 kernel_min 和 kernel_max 应该是向量?他们为什么不呢?

这个 github 问题中,有人提到 QAT 自动使用每张量量化(截至 2020 年 3 月),但这可能会发生变化。对我来说,看起来 QAT 仍然只使用每张量量化?如果是这种情况,为什么我可以设置一个参数来启用每张量量化(参见 AllValuesQuantizer 的每轴布尔值)?

为了进一步说明我的观点,我还在AllValuesQuantizer 的源代码中指出 self.per_axis 永远不会传递给下一个函数,那么这个 even 变量是做什么用的?请注意,其他量化器 LastValue 和 MovingAverage 确实传递了此变量。

所以; TF 的 QAT 甚至会执行每通道量化吗?在我看来不像。如何通过 AllValuesQuantizer 使用每通道量化?

GitHub问题:https ://github.com/tensorflow/tensorflow/issues/47858

复制我的两个模型的代码: