AttributeError: объект типа TFLiteConverterV2 не имеет атрибута from_keras_model_file - PullRequest
1 голос
/ 17 июня 2020

У меня есть один модуль TensorFlow Keras "model.h5". Я хочу создать из него флит. Для этого я использую приведенный ниже код. Я использую тензорный поток версии 2.0.0.

import tensorflow as tf
import numpy as np
from tensorflow import lite

dataset_dir = "C:\\Users\\Ravi\\dataset"
IMAGE_SIZE = 224
saved_keras_model = "C:\\Users\\Ravi\\model.h5"

def representative_data_gen():
  dataset_list = tf.data.Dataset.list_files(dataset_dir + '/*/*')
  for i in range(100):
    image = next(iter(dataset_list))
    image = tf.io.read_file(image)
    image = tf.io.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, [IMAGE_SIZE, IMAGE_SIZE])
    image = tf.cast(image / 255., tf.float32)
    image = tf.expand_dims(image, 0)
    yield [image]

converter =  lite.TFLiteConverter.from_keras_model_file(saved_keras_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
# 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
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('mobilenet_v2_1.0_224_quant.tflite', 'wb') as f:
      f.write(tflite_model)

Я получаю такую ​​ошибку.

Traceback (most recent call last):

  File "C:\Users\Ravi\face-mask-models\tflite_model.py", line 28, in <module>
    converter =  lite.TFLiteConverter.from_keras_model_file(saved_keras_model)

AttributeError: type object 'TFLiteConverterV2' has no attribute 'from_keras_model_file'

В чем может быть проблема? Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 17 июня 2020

Из этой страницы вы получите следующую информацию:

Только целые числа Создание моделей только целых чисел - распространенный вариант использования TensorFlow Lite для микроконтроллеров и TPU Coral Edge.

Кроме того, для обеспечения совместимости с целочисленными устройствами (такими как 8-битные микроконтроллеры) и ускорителями (такими как Coral Edge TPU) вы можете принудительно применить полное целочисленное квантование для всех операций, включая ввод и вывод, выполнив следующие действия:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_keras_model('model.h5')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
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]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

Итак, я предполагаю, что вы хотите обеспечить совместимость только с целочисленными устройствами с указанным выше кодом.

Если вам это не нужно, и вы хотите только преобразовать свою модель, сделайте:

# WHOLE MODEL
tflite_model = tf.keras.models.load_model('model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(tflite_model)
tflite_save = converter.convert()
open("generated.tflite", "wb").write(tflite_save)

Вообще говоря, в вашем коде отсутствует 'tf' перед 'lite, поэтому в указанной c строке должно быть:

converter =  tf.lite.TFLiteConverter.from_keras_model_file(saved_keras_model)

вместо:

converter =  lite.TFLiteConverter.from_keras_model_file(saved_keras_model)

и вы всегда можете перейти на TF v 2.2.0, если что-то не работает.

Отметьте меня, если вам что-то понадобится

...