Запустить квантованную модель тензорного потока на FPGA / чистый питон - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть модель, обученная керасу, которая является простой моделью, обученной на наборе данных 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 и как ее получить.Потому что я не вижу ничего связанного с графом нетрона.Любое предложение?

1 Ответ

0 голосов
/ 12 декабря 2018

Есть два шага, которые вам нужно сделать:

  1. Деквантовать ввод, веса и смещение обратно в полную точность (или целочисленный эквивалент)

    (ш-w_offset) * w_scale

  2. После Relu квантовать активации обратно в целое число

    a / a_scale + a_offset

    Вы, вероятно, можете пропустить шаг 2которые квантуют-деквантовывают активации с минимальным риском получения другого результата в качестве модели TFlite.Это потому, что у Relu нет верхней границы, но TFlite насытит ее до максимального значения.

Вы можете проверить мои учебники по TFlite в my Github , где у меня естьпредставил концепцию и обучение и собирается написать о выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...