【问题标题】:Run quantized tensorflow model on FPGA / pure python在 FPGA / 纯 python 上运行量化的张量流模型
【发布时间】:2018-11-21 21:54:22
【问题描述】:

我有一个在 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 对其进行了转换。它适用于张量流。

然后我尝试用纯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 图中看不到任何相关内容。有什么建议吗?

【问题讨论】:

  • 请添加您尝试的重量代码。最好添加一些简单的示例,以便人们了解问题所在。
  • 您是否设法在 FPGA 上实现了模型?我正在尝试做同样的事情,但无法弄清楚正确的计算流程。

标签: python tensorflow deep-learning tensorflow-lite quantization


【解决方案1】:

您需要执行两个步骤:

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

    (w-w_offset)*w_scale

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

    a/a_scale+a_offset

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

您可以在my Github 中查看我关于 TFlite 的教程,其中我介绍了概念和培训,并且即将写出关于推理的文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多