当前位置: 首页 > 知识库问答 >
问题:

在FPGA/pure python上运行量化tensorflow模型

彭弘方
2023-03-14

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

我试图做的是重写这个模型并在FPGA设备上运行。为了做到这一点,我想充分了解量化模型是如何工作的。

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

所以我有一个量化模型,准确率约为90%。

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

虽然简单的python代码(矩阵乘法、add bias和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中工作。

然后我尝试用纯html" target="_blank">html" target="_blank">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%,所以出现了一些问题。如何纠正这种模式?

提前感谢。

编辑:我读了一篇关于量化的论文,http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf

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

共有1个答案

湛光明
2023-03-14

你需要做两个步骤:

>

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

    (w-w_偏移)*w_刻度

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

    a/a_scalea_offset

    您可能可以跳过第2步,该步骤量化-去量化激活,但具有获得与TFlite模型不同结果的次要风险。这是因为Relu没有上限,但TFlite将使其饱和到最大值。

    您可以在我的Github中查看我关于TFlite的教程,在这里我介绍了概念和培训,并准备写下关于推理的内容。

  •  类似资料:
    • 正如您在TensorFlow中实现的量化MobileNet模型的屏幕截图中看到的那样,仍然有一些浮动操作。量化是通过graph_transform工具在TensorFlow中完成的。 图像中的红色椭圆在右侧大小文本框中有其描述。“depthwise”是一个“depthwiseConv2Native”操作,需要“DT_FLOAT”输入。 尽管较低的Relu6执行8位量化操作,但结果必须经过“(Rel

    • 我有一个TensorFlow Lite模型和一个Coral开发板,我想在开发板的TPU上执行推理。 在我的Python推理脚本中初始化TensorFlow Lite解释器时,我添加了“libedgetpu.so.1”作为实验代表,遵循Google Coral TFLite Python示例中的示例(链接到Coral Dev Board入门指南),但是推理的速度与我不指定TPU实验代表时完全相同,

    • 我已经在Ubuntu 14.04上安装了tensorflow的GPU版本。 我在一个GPU服务器上,在那里Tenorflow可以访问可用的GPU。 我想在CPU上运行tenorflow。 通常我可以使用env CUDA\u VISIBLE\u DEVICES=0在0号GPU上运行。 如何在CPU之间进行选择? 我对用tf重写代码不感兴趣。设备(“/cpu:0”):

    • 我使用预先训练好的mobilenet模型构建了Tensorflow Lite演示摄像头应用程序,如所述https://www.tensorflow.org/lite/convert/cmdline_examples. 据我所知,AndroidNNAPI(神经网络api)支持高通六边形数字信号处理器。如果可能的话,我想让Tensorflow Lite的演示应用程序在我手机上的六边形数字信号处理器芯片

    • 我试图使我的第一次尝试与Tensorflow使用Windows 8.1和Py魅力,但我得到一个Tensorflow错误。 我还使用pip在虚拟环境中安装了所有东西,并在命令行中运行了代码,得到了相同的结果。 有些事我试过了 > 还找到了与降级到python 3.5相关的信息。我实际上使用的是Python 3.7,不想降级。我担心其他应用程序无法工作。有人能确认它不能与大于3.5的Python一起工

    • 我正在尝试让TensorFlow的函数在我的GPU上运行;假设这个TensorFlow源页面有一个函数,该函数在CPU和GPU上运行时比较的输出,那么这似乎是可能的。但是,在使用代码进行测试时: 我得到了错误: 谢了!