我有一个在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中看不到任何相关内容。有什么建议吗?
你需要做两个步骤:
>
将输入、权重和偏差反量化回全精度(或等效整数)
(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上运行时比较的输出,那么这似乎是可能的。但是,在使用代码进行测试时: 我得到了错误: 谢了!