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 и добавьте ссылку здесь. Также, пожалуйста, добавьте больше подробностей о том, для чего вы переобучаете последний слой.