Ошибка значения: обнаружены недопустимые входные данные тензоров

#android #python #tensorflow #tensorboard #tensorflow-datasets

#Android #python #tensorflow #tensorboard #tensorflow-datasets

Вопрос:

Я не могу преобразовать .pb в tflite

Вот команда, которую я выполняю для генерации .pb Я успешно ее сгенерировал.

 IMAGE_SIZE=224
ARCHITECTURE="mobilenet_1_1.0_${IMAGE_SIZE}"

python retrain.py  
 --bottleneck_dir=tf_files/bottlenecks   
 --how_many_training_steps=500   
 --model_dir=tf_files/models/   
 --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}"  
  --output_graph=tf_files/retrained_graph.pb   
  --output_labels=tf_files/retrained_labels.txt   
  --architecture="${ARCHITECTURE}"  
  --image_dir=tf_files/flower_photos
  

Как только я пытаюсь создать этот файл .pb в .tflite, происходит сбой с той же ошибкой "ValueError: Invalid tensors 'input' were found."

 tflite_convert 
  --output_file=foo.tflite 
  --graph_def_file=retrained_graph.pb 
  --input_arrays=input 
  --output_arrays=MobilenetV1/Predictions/Reshape_1
  

Комментарии:

1. Что такое input тензор? Можете ли вы опубликовать код, который это определяет?

2. У меня нет кода для этого. я использую базовый конвертер терминала. tensorflow.org/lite/convert/cmdline_examples

3. @AmitPrajapati нашел какое-либо решение для этого?

4. @AkshayNevrekar да, я пытаюсь использовать другой способ, он работает нормально. я скоро опубликую ответ.

Ответ №1:

Я просто следую этой демонстрации Google code.

https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0

Работает нормально

 IMAGE_SIZE=224
ARCHITECTURE="mobilenet_1.0_${IMAGE_SIZE}"

python -m scripts.retrain 
--bottleneck_dir=tf_files/bottlenecks 
--how_many_training_steps=500 
--model_dir=tf_files/models/ 
--summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" 
--output_graph=tf_files/retrained_graph.pb 
--output_labels=tf_files/retrained_labels.txt 
--architecture="${ARCHITECTURE}" 
--image_dir=tf_files/flower_photos

tflite_convert   --graph_def_file=tf_files/retrained_graph.pb   --output_file=tf_files/optimized_graph.tflite   --input_format=TENSORFLOW_GRAPHDEF   --output_format=TFLITE   --input_shape=1,224,224,3   --input_array=input   --output_array=final_result   --inference_type=FLOAT   --input_data_type=FLOAT
  

Я внес одно изменение для этого — просто изменил версию mobilenet.

Ответ №2:

Я получил ту же ошибку, что и вы, с помощью tflite converter python api.

Это вызвано параметрами, которые мы передали в input_arrays .

input_arrays потребность, tensor_name определенная в tf.placeholder(name="input") не proto map key string определена в build_signature_def(inputs={"input": tensor_info_proto},outputs...) .

Вот простой пример.

 x = tf.placeholder(tf.float32, [None], name="input_x")
...

builder = tf.saved_model.builder.SavedModelBuilder(saved_model_path)
input_tensor_info = {"input": tf.saved_model.build_tensor_info(x)}
output_tensor_info = ...
signature_def = tf.saved_model.build_signature_def(inputs=input_tensor_info,
                                                   outputs=...,
                                                   method_name=...)
builder.add_meta_graph_and_variables(...)
builder.save()

# convert saved_model to tflite format.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_path,
                                                     input_arrays=["input"],
                                                     ...)
...
...
  

Как только вы запустите подобный код, это вызовет ошибку "ValueError: Invalid tensors 'input' were found."

Если мы внесем небольшое изменение, как показано ниже, это увенчается успехом.

 # a small change when convert
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_path,
                                                     input_arrays=["input_x"],
                                                     ...)