полная кватизация не исключает данных int8 для изменения входного слоя модели на int8

Я квантую модель keras h5 до uint8. Чтобы получить полную кватизацию uint8, пользователь dtlam26 сообщил мне в this post, что репрезентативный набор данных уже должен быть в uint8, иначе входной слой все еще находится в float32.

Проблема в том, что если я загружаю данные uint8, я получаю следующую ошибку во время вызова converter.convert()

ValueError: невозможно установить тензор: получен тензор типа INT8, но ожидаемый тип FLOAT32 для входа 178, имя: input_1

Похоже, модель все еще ожидает float32. Итак, я проверил базовую предварительно обученную модель keras_vggface (отсюда) с

from keras_vggface.vggface import VGGFace
import keras

pretrained_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg')  # pooling: None, avg or max

pretrained_model.save()

и получившаяся модель h5 имеет входной слой с float32. Затем я изменил определение модели, используя uint8 в качестве входного dtype:

def RESNET50(include_top=True, weights='vggface',
             ...)

    if input_tensor is None:
        img_input = Input(shape=input_shape, dtype='uint8')

Но для int разрешен только int32. Однако использование int32 приводит к тому, что следующие уровни ожидают float32.

Кажется, это неправильный способ делать это вручную для всех слоев.

Почему моя модель во время квантования не использует данные uint8 и автоматически меняет вход на uint8?

Что я пропустил? Вы знаете решение? большое спасибо.


person Florida Man    schedule 10.09.2020    source источник


Ответы (1)


РЕШЕНИЕ от пользователя dtlam26

Несмотря на то, что модель по-прежнему не работает с Google NNAPI, решение для квантования модели с входом и выходом в int8 с использованием либо TF 1.15.3, либо TF2.2.0, благодаря delan:

...
converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + modelname) 
        
def representative_dataset_gen():
  for _ in range(10):
    pfad='pathtoimage/000001.jpg'
    img=cv2.imread(pfad)
    img = np.expand_dims(img,0).astype(np.float32) 
    # Get sample input data as a numpy array in a method of your choosing.
    yield [img]
    
converter.representative_dataset = representative_dataset_gen

converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.experimental_new_converter = True

converter.target_spec.supported_types = [tf.int8]
converter.inference_input_type = tf.int8 
converter.inference_output_type = tf.int8 
quantized_tflite_model = converter.convert()
if tf.__version__.startswith('1.'):
    open("test153.tflite", "wb").write(quantized_tflite_model)
if tf.__version__.startswith('2.'):
    with open("test220.tflite", 'wb') as f:
        f.write(quantized_tflite_model)
person Florida Man    schedule 11.09.2020