我用一个卷积层构建了一个简单的 CNN 模型,并用 Tensorflow Lite 对其进行了转换。(对于 MNIST !!)所以现在我的模型得到 8 位整数输入,权重也是 8 位整数。
我想测试从 TFLite 获得的参数,所以我为推理步骤编写了 C 代码。
输入图像像素被赋予 0 到 255 之间的 8 位整数,权重在 -128~127 之间。(偏差是 32 位整数。)当然,卷积结果由大于 255 的数字组成。
我查看了这篇论文(https://arxiv.org/pdf/1712.05877.pdf,“用于高效整数运算的神经网络的量化和训练”),它提供了一些关于如何处理这个卷积结果的提示。它说我必须(1)缩小,(2)向下(到 uint8),以及(3)应用激活函数来生成 8 位输出。
据我了解,我需要将 2^(-n) 乘以卷积结果。所以我将卷积输出划分为 256 并将最大数量限制为 255,并使用全连接层的权重进一步计算它们。
它显示了一个很好的结果(准确度 0.96+),但没有 TFLite 评估所说的那么高。(精度 0.98+)
我认为我没有以正确的方式做到这一点,因为“256”(我将卷积输出划分为)是一个随机数。实际上,当我将其更改为 340 时,它显示出最好的结果,但仍远低于使用 TFLite Interpreter 进行的 TFLite 评估。
实现推理步骤的正确和复杂的方法是什么?如何缩小规模?