У меня есть модель, обученная керасу, которая является простой моделью, обученной на наборе данных MNIST.
Что я пытаюсь сделать, это переписать эту модель и запустить на устройстве FPGA.Чтобы сделать это, я хочу полностью понять, как работает квантованная модель.
Сначала я преобразовал эту модель с квантованием после обучения в формат .tflite и точность UINT8 (https://www.tensorflow.org/lite/performance/post_training_quantization).
Итак, у меня естьКвантованная модель и точность составляет около 90%.
Теперь я пытаюсь получить весовые коэффициенты из квантованной модели и реализовать ее на чистом питоне. Я использую этот инструмент для визуализации и получения весовых коэффициентов модели: https://github.com/lutzroeder/netron.
Хотя простой код Python (умножение матриц, добавление смещения и реля) работает, код с квантованными весами не работает.
Поэтому мой вопрос заключается в том, как написать прямую передачу с использованием numpy?
Моя модель в керасе выглядит следующим образом:
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%, поэтому что-то идет не так. Как исправить эту модель?
Заранее спасибо.
Редактировать: Я прочиталстатья о квантеizing in tenorflow: http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf
И я знаю почти все, я знаю, каковы значения S и Z для активаций и ядер.Но после умножения матрицы ее следует умножить на коэффициент: M: = S1 * S2 / S3.И я не знаю, что такое шкала S3 и как ее получить.Потому что я не вижу ничего связанного с графом нетрона.Любое предложение?