Полное целочисленное квантование TensorFlow Lite не удается в TF 2
Обучал модели resnet50v2 и densenet 169. TensorFlow nightly 2.3.0-dev20200608. Модель работает нормально, и я попробовал некоторые оптимизации, такие как "простой" tf lite, tf lite dynamic range, tf lite 16float, и все они работают нормально (точность либо идентична исходной, либо немного ниже, чем ожидалось). Я хочу преобразовать свою модель для использования полностью целочисленного квантования после обучения с помощью uint8. Я преобразовал свою модель из формата SavedModel с помощью:
converter = tf.lite.TFLiteConverter.from_saved_model('/path/to/my/saved_models')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
def representative_dataset_gen():
for i in range(100):
yield [x_train[i].astype(np.float32)]
converter.representative_dataset = representative_data_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
tflite_model = converter.convert()
with open('resnet.tflite', 'wb') as f:
f.write(tflite_model)
как написано на сайте TensorFlow lite. Затем я скомпилировал модель для Edge TPU. Это работает в том смысле, что edge tpu позволяет мне запускать его без ошибок, но результаты тарабарщины. Он всегда предсказывает одно и то же значение. Я попробовал тогда на процессоре с интерпретатором tf lite. Тензор ввода / вывода правильно uint8, но снова предсказывает то же значение. На процессоре с tf lite проблема с переходом на int8 сохраняется. Кто-нибудь еще сталкивался с такой же проблемой?
Найдите здесь папку Google с кодом, который я использую для преобразования, моделью до и после преобразования и преобразованной моделью.
https://drive.google.com/drive/folders/11XruNeJzdIm9DTn7FnuIWYaSalqg2F0B?usp=sharing