Подтвердить что ты не робот

Преодоление Graphdef не может превышать 2 ГБ в тензорном потоке

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

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

python classify_image.py --image_file new_image.jpeg 

Я отредактировал основную функцию, чтобы я мог взять папку с изображениями и сразу вернуть предсказание на все изображения и написать векторы объектов в файле csv. Вот как я это сделал:

def main(_):
  maybe_download_and_extract()
  #image = (FLAGS.image_file if FLAGS.image_file else
  #         os.path.join(FLAGS.model_dir, 'cropped_panda.jpg'))
  #edit to take a directory of image files instead of a one file
  if FLAGS.data_folder:
    images_folder=FLAGS.data_folder
    list_of_images = os.listdir(images_folder)
  else: 
    raise ValueError("Please specify image folder")

  with open("feature_data.csv", "wb") as f:
    feature_writer = csv.writer(f, delimiter='|')

    for image in list_of_images:
      print(image) 
      current_features = run_inference_on_image(images_folder+"/"+image)
      feature_writer.writerow([image]+current_features)

Он работал отлично для около 21 изображения, но затем разбился со следующей ошибкой:

  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1912, in as_graph_def
    raise ValueError("GraphDef cannot be larger than 2GB.")
ValueError: GraphDef cannot be larger than 2GB.

Я думал, вызывая метод run_inference_on_image(images_folder+"/"+image), предыдущие данные изображения будут перезаписаны, чтобы рассматривать только новые данные изображения, что, похоже, не так. Как решить эту проблему?

4b9b3361

Ответ 1

Проблема заключается в том, что каждый вызов run_inference_on_image() добавляет узлы к одному и тому же графу, что в конечном итоге превышает максимальный размер. Есть как минимум два способа исправить это:

  • простой, но медленный способ заключается в использовании другого графика по умолчанию для каждого вызова run_inference_on_image():

    for image in list_of_images:
      # ...
      with tf.Graph().as_default():
        current_features = run_inference_on_image(images_folder+"/"+image)
      # ...
    
  • более эффективный способ заключается в изменении run_inference_on_image() для запуска на нескольких изображениях. Переместите петлю for, чтобы окружить этот sess.run() вызов, и вам больше не придется восстанавливать всю модель для каждого вызова, что должно сильно обрабатывать каждое изображение быстрее.

Ответ 2

Вы можете переместить create_graph() где-то до этого цикла for image in list_of_images: (который перебирает файлы).

То, что он делает, выполняет многократный вывод на одном графике.

Ответ 3

Самый простой способ - поставить create_graph() в первую из основных функций. Затем он просто создает только граф