TensorFlow lite: высокая потеря точности после преобразования модели в tflite

Я пытался TFLite, чтобы увеличить скорость обнаружения на Android, но странно, что моя модель.tflite теперь почти обнаруживает только 1 категорию.

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

Для переподготовки я использовал файл retrain.py из Tensorflow для поэтов 2

Я использую следующие команды для переподготовки, оптимизации для вывода и преобразования модели в tflite:

python retrain.py \
--image_dir ~/tf_files/tw/ \
--tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/feature_vector/1 \
--output_graph ~/new_training_dir/retrainedGraph.pb \
-–saved_model_dir ~/new_training_dir/model/ \
--how_many_training_steps 500 

sudo toco \
--input_file=retrainedGraph.pb \
--output_file=optimized_retrainedGraph.pb \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TENSORFLOW_GRAPHDEF \
--input_shape=1,224,224,3 \
--input_array=Placeholder \
--output_array=final_result \

sudo toco \
--input_file=optimized_retrainedGraph.pb \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--output_file=retrainedGraph.tflite \
--inference_type=FLOAT \
--inference_input_type=FLOAT \
--input_arrays=Placeholder \
--output_array=final_result \
--input_shapes=1,224,224,3

Я что-то здесь не так делаю? Откуда может возникнуть потеря точности?

1 ответ

Я столкнулся с той же проблемой, когда пытался преобразовать модель.pb в.lite.

На самом деле моя точность упала бы с 95 до 30!

Оказалось, что ошибка, которую я совершал, была не во время преобразования.pb в.lite или в задействованной для этого команде. Но на самом деле это было при загрузке изображения и его предварительной обработке, прежде чем оно будет передано в облегченную модель и выведено с использованием

interpreter.invoke()

команда.

Приведенный ниже код - это то, что я имел в виду под предварительной обработкой:

test_image=cv2.imread(file_name)
test_image=cv2.resize(test_image,(299,299),cv2.INTER_AREA)
test_image = np.expand_dims((test_image)/255, axis=0).astype(np.float32)
interpreter.set_tensor(input_tensor_index, test_image)
interpreter.invoke()
digit = np.argmax(output()[0])
#print(digit)
prediction=result[digit]

Как вы можете видеть, есть две важные команды / предварительная обработка изображения, когда оно читается с помощью "imread()":

i) Размер изображения должен быть изменен до размера, который равен значениям input_height и input_width входного изображения / тензора, который использовался во время обучения. В моем случае (inception-v3) это было 299 для input_height и input_width. (Прочтите документацию модели для этого значения или найдите эту переменную в файле, который вы использовали для обучения или повторного обучения модели)

ii) Следующая команда в приведенном выше коде:

test_image = np.expand_dims((test_image)/255, axis=0).astype(np.float32)

Я получил это из "формул" / кода модели:

test_image = np.expand_dims((test_image-input_mean)/input_std, axis=0).astype(np.float32)

Чтение документации показало, что для моей архитектуры input_mean = 0 и input_std = 255.

Когда я внес указанные изменения в свой код, я получил ожидаемую точность (90%).

Надеюсь это поможет.

Пожалуйста, отправьте вопрос на GitHub https://github.com/tensorflow/tensorflow/issues и добавьте ссылку здесь. Также, пожалуйста, добавьте больше подробностей о том, для чего вы переобучаете последний слой.

Другие вопросы по тегам