问题标签 [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.
python - 为什么 checkpoint 中保存的参数与融合模型中保存的参数不同?
我在 中训练了一个QAT
基于(量化感知训练)的模型Pytorch
,训练进行得很顺利。然而,当我尝试将权重加载到融合模型中并在更宽的数据集上运行测试时,我遇到了很多错误:
完整列表可以在这里找到。
基本上找不到权重。加上融合模型中缺少的比例和零点。
如果重要,以下代码段是用于训练和保存模型的实际训练循环:
用于测试test_widerface.py
使用的可以在此处访问您可以在此处
查看密钥
为什么会这样?这应该如何处理?
更新
我检查了名称,并创建了一个新的 state_dict 字典,并使用下面的代码片段插入了检查点和模型中的 112 个键:
然后使用这个新的 state_dict!但是我得到了完全相同的错误!意思是这样的错误:
这真的很令人沮丧,并且没有关于此的文档!我在这里完全一无所知。
python - TensorFlow 版本 2 和 BatchNorm 折叠中的量化感知训练
我想知道在 Tensorflow 2 的量化感知训练期间模拟 BatchNorm 折叠的当前可用选项是什么。Tensorflow 1 具有tf.contrib.quantize.create_training_graph
将 FakeQuantization 层插入图中并负责模拟批量归一化折叠的功能(根据本白皮书)。
Tensorflow 2 有一个关于如何在他们最近采用的 API 中使用量化的教程tf.keras
,但他们没有提到任何关于批量标准化的内容。我尝试了以下带有 BatchNorm 层的简单示例:
但是,它给出了以下例外:
这表明 TF 不知道如何处理它。
我还看到了这个相关主题,它们适用tf.contrib.quantize.create_training_graph
于 keras 构建的模型。然而,他们不使用 BatchNorm 层,所以我不确定这是否可行。
那么在 TF2 中使用这个 BatchNorm 折叠功能有哪些选择呢?这可以从 keras API 完成,还是我应该切换回 TensorFlow 1 API 并以旧方式定义图形?
python - TensorFlow Keras 模型的量化感知训练
我想用我的 keras 模型进行量化感知训练。我已经尝试过如下。我正在使用张量流 1.14.0
它可以正常工作。
但是,保存的模型(h5 和 ckpt)的大小与没有量化的模型完全相同。
这是正确的方法吗?我如何检查它是否量化好?
或者,有没有更好的量化方法?
tensorflow - 层 up_sampling2d:不支持
我正在尝试为可以在 Google Coral edgetpu 上运行的语义分割实现 UNet。为此,我们需要有一个可以使用 tensorflow_model_optimization API 获得的量化模型。
但是在使用 API 时,有一个 UpSampling2D 层不受Quantization Aware API支持。这是从推荐的正常模型中获取量化模型的代码。
以下是调查结果——
- 我尝试使用 up_sampling2d Conv2DTranspose 的替代方法而不是上采样,但看起来 Conv2DTranspose 也不支持。
Layer conv2Dtranspose:<class 'tensorflow.python.keras.layers.convolutional.Conv2DTranspose'> is not supported.
Edge TPU的大多数官方示例量化模型不需要对图像进行放大。例如 - 分类和检测模型输出是一个类或多个具有相应类的边界框。
- 虽然有一个用于分割的示例 edgetpu 量化模型——基于 Deeplabv3 的量化 edgetpu 分割,但对于架构和如何解决放大问题没有帮助。
在这方面的任何帮助将不胜感激。
pytorch - 如何在 PyTorch Lightning 中编写多个训练设置
我想迭代地量化我的模型。这意味着在通常实现的正常训练循环之后,training_step
我想迭代地量化一些参数并重新训练模型几个步骤。
我真的不明白这将如何在 Lightning 中完成。我可以向班级添加一个新实例,但是我必须自己再次编写训练循环?
python - 如何在 Python 中实现 TF Lite 推理
出于研究目的,我试图了解 TF Lite 如何进行推理。我只对软件逻辑感兴趣。
我正在使用 TensorFlow 2.1 和 TensorFlow 模型优化 0.3.0。
例如,我使用一个非常简单的全连接网络:
我通过量化感知训练在 mnist 上训练网络。
然后用 TF Lite 对网络进行量化:
为了确保我知道自己在做什么,我做了 3 件事:我使用 TF 从 32 位模型中获取输出。我使用 TF Lite 从量化模型中获取输出。我在 Python 中实现了 32 位模型的前向传递,并将其输出与之前的 2 进行了比较。
现在我正在尝试了解如何实现量化模型的前向传递。
使用interpreter.get_tensor_details(),我得到以下输出:
我使用这篇论文作为参考:https ://arxiv.org/pdf/1712.05877.pdf 我还阅读了这个页面:https ://www.tensorflow.org/lite/performance/quantization_spec
我目前的实现是这样的:
函数 quantize_multiplier_smaller_than_one 是我对 C 函数的 Python 实现:https ://github.com/google/gemmlowp/blob/master/doc/quantization_example.cc
所以我的问题是,这是正确的方法吗?我肯定在这里遗漏了一些计算,它是什么?而且,当我有一个更大的网络时,我怎么知道如何系统地使用正确的索引来提取每一层的量化参数。
非常感谢您的任何建议。
python - std.constant' op 需要属性的类型来匹配 op 的返回类型
我正在尝试将我在其官方网站上使用量化感知训练教程训练和微调的 keras 模型转换为 int tflite 模型。在我必须将模型转换为 tflite 格式之前,我可以按照他们的步骤进行操作。然后它给了我这个输出:
如果我删除优化标志,它会给我一个 tflite 模型,但它没有给我我需要的 int8 模型。我可以成功发布训练量化相同的模型,我使用 quant 感知训练进行微调,但由于某种原因,当我将模型包装在 Quantize 包装器中并尝试转换它时,它不起作用。我正在使用最新的夜间版本,并尝试在访问和不访问 GPU 的情况下运行脚本。`
如果您需要更多信息,请随时询问。该模型还有一个是 4 个 CNN + Max_pool 块,最后有一些 Dense 层。如果需要,我可以提供模型的可视化。
PS。这是摘要:
python - 如何为英特尔 Movidius 重新训练检测模型并对其进行量化?
我想用一个新的图像数据集重新训练一个现有的对象检测模型,并为英特尔 Movidius 量化它。是否有任何工作程序可以做到这一点?
我已经成功地重新训练了模型,但未能量化它。我已按照以下教程重新训练 SSD MobileNet
tensorflow - TensorFlow fake-quantize 层也是从 TF-Lite 调用的
我正在使用 TensorFlow 2.1 来训练具有量化感知训练的模型。
这样做的代码是:
这将向图中添加伪量化节点。这些节点应该调整模型的权重,以便它们更容易量化为 int8 并处理 int8 数据。
训练结束时,我将模型转换并量化为 TF-Lite,如下所示:
在这一点上,我不希望在 TL-Lite 图中看到虚假量化层。但令人惊讶的是,我确实看到了它们。此外,当我在 TF-Lite C++示例应用程序中运行这个量化模型时,我看到它也在推理过程中运行了假量化节点。除此之外,它还对每一层之间的激活进行去量化和量化。
这是 C++ 代码的输出示例:
节点 0 运算符内置代码 80 FAKE_QUANT
输入:1
输出:237
节点 1 运算符内置代码 114 QUANTIZE
输入:237
输出:238
节点 2 运算符内置代码 3 CONV_2D
输入:238 59 58
输出:167
临时:378
节点 3 运算符内置代码 6 DEQUANTIZE
输入:167
输出:239
节点 4 运算符内置代码 80 FAKE_QUANT
输入:239
输出:166
节点 5 运算符内置代码 114 QUANTIZE
输入:166
输出:240
节点 6 运算符内置代码 3 CONV_2D
输入:240 61 60
输出:169
所以我觉得这一切都很奇怪,同时考虑到这个模型应该只在 int8 上运行并且实际上假量化节点将 float32 作为输入。
这里的任何帮助将不胜感激。