将Keras模型转换为可在Edge TPU上使用的量化Tensorflow Lite模型

时间:2019-09-26 19:31:31

标签: python tensorflow keras tensorflow-lite tpu

我有一个要在Coral Edge TPU设备上运行的Keras模型。为此,它必须是具有完整整数量化的Tensorflow Lite模型。我能够将模型转换为TFLite模型:

model.save('keras_model.h5')

converter = tf.lite.TFLiteConverter.from_keras_model_file("keras_model.h5")
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

但是当我运行edgetpu_compiler converted_model.tflite时,出现此错误:

Edge TPU Compiler version 2.0.267685300
Invalid model: converted_model.tflite
Model not quantized

这是因为我需要对模型进行量化,但是我不确定如何做到这一点。我发现this page告诉我如何执行此操作,但是它希望我创建一个输入数据生成器。这是它提供的示例:

def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]

如何修改此代码以使用我的输入数据? num_calibration_steps来自哪里?有一个更好的方法吗? (我看到了对tf.contrib.tpu.keras_to_tpu_model的引用,但已过时了)

1 个答案:

答案 0 :(得分:0)

我相信num_calibration_steps只是转换器使用您的代表集确定量化级别的次数。只是一个猜测,但它可能会多次从您的销售代表子样本中(自举或欺骗)。我仍在亲自调查整个过程,但是,如果我仅将每个产量的图像传递给它,并以num_calibration_steps约100的价格使用(例如100张代表性图像),这似乎对我有用。您可以看到我的演示脚本on github

关键部分是:

image_shape = (56, 56, 32)

def representative_dataset_gen():
    num_calibration_images = 10
    for i in range(num_calibration_images):
        image = tf.random.normal([1] + list(image_shape))
        yield [image]

也可以看到我对这个问题的类似回答: Post-training full integer quantization of Keras model