【发布时间】: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