python - 在 FPGA/纯 python 上运行量化的 tensorflow 模型

标签 python tensorflow deep-learning tensorflow-lite quantization

我有一个在 keras 中训练的模型,这是一个在 MNIST 数据集上训练的简单模型。

我尝试做的是重写这个模型并在 FPGA 设备上运行。 为此,我想充分了解量化模型的工作原理。

首先,我将带有训练后量化的模型转换为 .tflite 格式和 UINT8 精度 ( https://www.tensorflow.org/lite/performance/post_training_quantization)。

所以我有量化模型,准确率大约是 90%。

现在我尝试从量化模型中获取权重并在纯 Python 中实现它。我使用此工具进行可视化并获取模型权重:https://github.com/lutzroeder/netron .

虽然简单的 Python 代码(矩阵乘法、添加偏差和 ReLU)可以工作,但具有量化权重的代码不起作用。

所以我的问题是如何使用 numpy 编写前馈?

我在 keras 中的模型如下所示:

model = Sequential()
model.add(Dense(512, input_shape=input_shape))
model.add(Activation(tf.nn.relu))
model.add(Dense(100))
model.add(Activation(tf.nn.relu))
model.add(Dense(num_classes))
model.add(Activation(tf.nn.softmax))
model.compile(
    optimizer=Adam(),
    loss='categorical_crossentropy',
    metrics=['accuracy'],
)

我用 TocoConverter 转换了它。它适用于 tensorflow。

然后我尝试用纯 python 编写前馈:

for img, label in zip(x_test, y_test):
    img = img.astype('uint8')
    total_seen += 1
    label = tf.keras.utils.to_categorical(label, num_classes=num_classes)
    X = img.reshape(1, 784)
    z1 = np.dot(X, W0.T) + b0
    a1 = relu(z1)
    z2 = np.dot(a1, W1.T) + b1
    a2 = relu(z2)
    z3 = np.dot(a2, W2.T) + b2
    prediction = np.argmax(z3)
    label = np.argmax(label)
    if prediction == label:
        num_correct += 1

但是这个模型的准确率大约是 10%,所以出问题了。 如何修正这个模型?

提前致谢。

编辑: 我读过关于 tensorflow 量化的论文: http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf

而且我几乎什么都知道,我知道激活和核的 S 值和 Z 值是多少。但在矩阵乘法之后,它应该乘以因子:M :=S1*S2/S3。 而且我不知道什么是 S3 比例以及如何获得它。因为我在 netron 图中看不到任何相关内容。有什么建议吗?

最佳答案

您需要执行两个步骤:

  1. 将输入、权重和偏差反量化为全精度(或等效整数)

    (w-w_offset)*w_scale

  2. 在 Relu 之后,将激活量化回整数

    a/a_scale+a_offset

    您可以跳过第 2 步对激活进行量化-反量化,而获得与 TFlite 模型不同的结果的风险很小。这是因为 Relu 没有上限,但 TFlite 会将其饱和到最大值。

您可以在 my Github 中查看我关于 TFlite 的教程我已经介绍了概念和训练,即将写出推理。

关于python - 在 FPGA/纯 python 上运行量化的 tensorflow 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53420994/

相关文章:

python - scrapy中规则类的使用方法

tensorflow - 在没有安装 Tensorflow 的情况下运行 Tensorflow 模型

deep-learning - Keras 中的多维输入层

python - Tensorflow 中的预定采样

python - IOError - PythonAnywhere.com

python - 产生二叉树的所有根到叶分支

python - 运行时错误 : To use MKL 2018 with Theano you MUST set "MKL_THREADING_LAYER=GNU"

python - tensorflow 概率: Gradients always zero when backpropagating the log_prob of a sample of a normal distribution

python - 如何在jupyter中添加conda环境

machine-learning - 将长一维矢量数据、一维矢量标签输入 Caffe