Как я могу получить input_shape замороженной модели Tensorflow для TOCO tf_convert - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь преобразовать замороженную модель, которую я получил из davidsandberg / facenet в .tflite в Ubuntu 18.04.1 LTS (VirtualBox), используя TF Lite Converter (это конкретная модель, которую я использую) .Когда я пытаюсь выполнить команду:

/home/nils/.local/bin/tflite_convert 
--output_file=/home/nils/Documents/frozen.tflite 
--graph_def_file=/home/nils/Documents/20180402-114759/20180402-114759.pb 
--input_arrays=input --output_array=embeddings

, я получаю следующую ошибку:

2018-11-29 16:36:21.774098: I 
tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports 
instructions that this TensorFlow binary was not compiled to use: AVX2
Traceback (most recent call last):
File "/home/nils/.local/bin/tflite_convert", line 11, in <module>
 sys.exit(main())
File 
"/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib   /lite/python/tflite_convert.py", 
line 412, in main
 app.run(main=run_main, argv=sys.argv[:1])
   File 
"/home/nils/.local/lib/python3.6/site-packages/tensorflow/python/platform/app.py", 
line 125, in run
 _sys.exit(main(argv))
File 
"/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/tflite_convert.py", 
line 408, in run_main
 _convert_model(tflite_flags)
File 
"/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/tflite_convert.py", 
line 162, in _convert_model
 output_data = converter.convert()
File 
"/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/lite.py", 
line 404, in convert
 "'{0}'.".format(_tensor_name(tensor)))
ValueError: Provide an input shape for input array 'input'.

Поскольку я сам не тренировался с моделью, я не знаю, какую именно формувход имел.Вероятно, можно извлечь его из classifier.py и facenet.py, найденного в GitHubRep Дэвида Сэндберга, в facenet / src, но я не достаточно понимаю код, чтобы сделать это сам.Я даже пытался анализировать график с помощью тензорной доски.Я все равно не могу понять, но, может быть, вы можете: Tensorboard-Screenshot Как вы, возможно, уже заметили, я довольно новичок в Ubuntu, Tensorflow и во всем, что связано, поэтому я рад принять любоесовет по этому вопросу.Заранее спасибо!

Это соответствующая часть classifier.py, где модель загружается и настраивается:

 # Load the model
        print('Loading feature extraction model')
        facenet.load_model(args.model)

        # Get input and output tensors
        images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
        embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
        phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
        embedding_size = embeddings.get_shape()[1]

        # Run forward pass to calculate embeddings
        print('Calculating features for images')
        nrof_images = len(paths)
        nrof_batches_per_epoch = int(math.ceil(1.0*nrof_images / args.batch_size))
        emb_array = np.zeros((nrof_images, embedding_size))
        for i in range(nrof_batches_per_epoch):
            start_index = i*args.batch_size
            end_index = min((i+1)*args.batch_size, nrof_images)
            paths_batch = paths[start_index:end_index]
            images = facenet.load_data(paths_batch, False, False, args.image_size)
            feed_dict = { images_placeholder:images, phase_train_placeholder:False }
            emb_array[start_index:end_index,:] = sess.run(embeddings, feed_dict=feed_dict)

        classifier_filename_exp = os.path.expanduser(args.classifier_filename)

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Спасибо за вашу помощь, я сделал так, как сказал Алан Чао, и последовал за load_data () к facenet.py, где я в итоге нашел форму [1 160, 160, 3].Кроме того, Ссылка командной строки Tensorflow для преобразователя tf lite показала мне, на что мне нужно обращать внимание:

- input_shapes.Тип: разделенный двоеточиями список разделенных запятыми списков целых чисел.Каждый разделенный запятыми список целых чисел задает форму одного из входных массивов, указанных в соглашении TensorFlow.

Пример: --input_shapes = 1,60,80,3 для типичной модели зрения означает размер пакета, равный1, высота входного изображения 60, ширина входного изображения 80 и глубина входного изображения 3 (представляющих каналы RGB).

0 голосов
/ 10 января 2019

Я прошел код для конвертера tflite.Я обнаружил, что вам нужно задать форму ввода в виде словаря в формате {"input_tensor_name": [input shape]}.

. Вот пример, который решает проблему:

`graph_def_file = "20180402-114759/20180402-114759.pb"
input_arrays = ["input"]
output_arrays = ["embeddings"]

converter = tf.lite.TFLiteConverter.from_frozen_graph(
  graph_def_file, input_arrays, output_arrays,input_shapes={"input":[1,160,160,3]})

tflite_model = converter.convert()
open("model.tflite", "wb").write(tflite_model)
`
0 голосов
/ 12 декабря 2018

Если вы снова запустите Tensorboard, вернитесь к графику, который вы видели, там должен быть значок поиска (я думаю, в верхнем левом углу), где вы можете ввести «input» и найти тензор ввода.Это даст вам желаемую форму.Я предполагаю, что это будет что-то в форме '[1, image_size, image_size, 3]'.

В качестве альтернативы, вы можете проверить код

feed_dict = { images_placeholder:images, phase_train_placeholder:False }

Обратите внимание, что мывводим объект 'images' в держатель изображения, который отображается на тензор "input: 0".По сути, вы хотите форму объекта изображения.

images происходит от вызова facenet.load_data ().Если вы зайдете в facenet.py и изучите функцию load_data, вы увидите, что форма похожа на то, что я предложил выше.Если вы напечатаете значение image_size, оно должно соответствовать тому, что вы видите в Tensorboard.

...