我有一个在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进行了转换,并在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量化的论文: http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf 我几乎知道所有事情,我知道激活和内核的S和Z值是什么。但是在矩阵乘法之后,它应该乘以因子:M:= S1 * S2 / S3。 我不知道S3比例是什么以及如何获得它。因为我在netron图中看不到任何相关内容。有什么建议吗?