Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在FPGA/pure python上运行量化tensorflow模型_Python_Tensorflow_Deep Learning_Tensorflow Lite_Quantization - Fatal编程技术网

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

在FPGA/pure python上运行量化tensorflow模型,python,tensorflow,deep-learning,tensorflow-lite,quantization,Python,Tensorflow,Deep Learning,Tensorflow Lite,Quantization,我有一个在keras中训练的模型,这是一个在MNIST数据集上训练的简单模型 我试图做的是重写这个模型并在FPGA设备上运行。 为了做到这一点,我想充分了解量化模型是如何工作的 首先,我使用训练后量化将该模型转换为.tflite格式和UINT8精度() 所以我有一个量化模型,准确率约为90% 现在,我尝试从量化模型中获取权重,并在纯python中实现它。我使用此工具进行可视化并获取模型权重: 虽然简单的python代码(矩阵乘法、add bias和relu)可以工作,但带有量化权重的代码不起作用

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

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

首先,我使用训练后量化将该模型转换为.tflite格式和UINT8精度()

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

现在,我尝试从量化模型中获取权重,并在纯python中实现它。我使用此工具进行可视化并获取模型权重:

虽然简单的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中工作

然后我尝试用纯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中量化的论文:

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

您需要执行两个步骤:

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

    (w-w_偏移)*w_刻度

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

    a/a\U比例+a\U偏移

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


  • 您可以查看我在TFlite上的教程,在这里我介绍了概念和培训,并将要写下关于推断的内容。

    请添加您尝试的权重代码。更好的办法是添加一些简单的示例,这样人们就可以看到问题所在。您是否成功地在FPGA上实现了该模型?我正试图做同样的事情,但无法计算出正确的计算流程。