"Модель не квантована" после посттренировочного квантования зависит от структуры модели? - PullRequest
0 голосов
/ 09 июля 2020

Кажется, что квантование после обучения работает для некоторых структур модели, но не для других. Например, когда я запускаю свой код с

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10)
])

# Train the digit classification model
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=2)

и квантование после обучения как

converter = tf.lite.TFLiteConverter.from_keras_model(model)
# This enables quantization
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.int8]
# This ensures that if any ops can't be quantized, the converter throws an error
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
# These set the input and output tensors to uint8 (added in r2.3)
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
# And this sets the representative dataset so we can quantize the activations
converter.representative_dataset = representative_data_gen


tflite_model = converter.convert()

with open('my_mnist_quant.tflite', 'wb') as f:
    f.write(tflite_model)
    

, команда ! edgetpu_compiler my_mnist_quant.tflite отлично работает и создает модель tflite, которая имеет сопоставимые

Однако, когда я изменил модель на

model = keras.Sequential([
  keras.layers.InputLayer(input_shape=(28, 28)),
  keras.layers.Reshape(target_shape=(28, 28, 1)),
  keras.layers.Conv2D(64, kernel_size=3, activation='relu', input_shape=(28,28,1)),
  keras.layers.Flatten(),
  keras.layers.Dense(10, activation='softmax')
])

, все, что я сделал, это добавил сверточный слой и несколько слоев с изменением формы в свою модель. Однако, когда я провел квантование с этой моделью, все работало нормально, пока я не попытался скомпилировать ее с помощью edgetpu_compiler. В этом случае edgetpu_compiler жалуется и говорит, что моя модель не была квантована, хотя я запустил тот же точный код, что и первая модель.

Может ли кто-нибудь объяснить мне, почему возникает такая ошибка? Можно ли квантовать модель, если она имеет другую структуру?

1 Ответ

0 голосов
/ 11 июля 2020

Если вы используете tf-nightly или более новую версию, может быть включен конвертер MLIR, который пока не поддерживается компилятором. Это может вызвать странную ошибку, если вы попытаетесь отключить это, добавив:

converter.experimental_new_converter = False

, что может быть причиной вашей проблемы!

...