восстановление тензорного графа, использующего shuffle_batch, навсегда зависает - PullRequest
0 голосов
/ 11 июня 2018

У меня есть код тензорного потока, который использует tf.train.shuffle_batch для обучающей части.Я прочитал некоторые форумы, и у меня появилась идея использовать эти строки для разделения между входным конвейером, который использует очереди, и частью вывода, которая должна использовать только одно изображение:

 ima=queue_loader.images
 is_just_one = tf.placeholder(dtype=bool,shape=(),name='is_just_one')
 imgs = tf.placeholder(tf.float32, (1, height, width, 1), name='imgs')
 images = tf.cond(is_just_one, lambda:imgs, lambda:ima)

, тогда я просто указываю в feed_dict is_just_oneЛожно во время моего обучения.Я сохраняю модель после каждой эпохи с помощью:

saver.save(sess, checkpoint_path, global_step=ep+1)

Получив файл контрольных точек, я запускаю код freeze.py следующим образом:

python freeze.py --model_dir=checkpoints --output_node_names=imgs,is_just_one,prediction

Затем: я пытаюсь восстановитьмоя модель с этим кодом:

imn=tf.placeholder(tf.float32, shape=(None,None,1))
imno=tf.image.per_image_standardization(imn)
X=io.imread("test.png")
with tf.Session() as sesss:
  X=sesss.run(imno,feed_dict={imn:X[...,0,None]})

with tf.gfile.GFile("checkpoints/frozen_model.pb", "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
with tf.Graph().as_default() as graph:
    tf.import_graph_def(graph_def,name='import')

for i in range(2):
    with tf.Session(graph=graph,config=tf.ConfigProto(log_device_placement=True)) as sess:
        act_map =graph.get_tensor_by_name("import/prediction:0")
        is_just_one = graph.get_tensor_by_name("import/is_just_one:0")
        inputs = graph.get_tensor_by_name("import/imgs:0")
        mapp=sess.run(act_map,feed_dict={is_just_one:True,inputs:X[None,:,:,None]})

Когда я запускаю свой код, происходит следующее: он зависает навсегда, расположение устройства:

 I tensorflow/core/common_runtime/simple_placer.cc:872] import/shuffle_batch/random_shuffle_queue: (RandomShuffleQueueV2)/job:localhost/replica:0/task:0/cpu:0

Итак, если я правильно понимаю, сохраненные данныеузел, связанный с tf.train.shuffle_batch, ждет входных данных, и, поскольку я его не кормил, он зависает навсегда.

что с этим не так?Есть ли способ игнорировать этот узел и просто подавать изображение на графике как обычно?

Большое спасибо за вашу драгоценную помощь

1 Ответ

0 голосов
/ 11 июня 2018

Я понял это!Это действительно просто, но у меня были очень сильные головные боли.Чтобы решить эту проблему, нужно просто определить что-то вроде:

  input_placeholder = tf.placeholder_with_default(image, [None, None, None, 1],name="inputs")

, где image - это изображение из очереди и shuffle_batch.Структура tf.placeholder_with_default указывает, что, если никакое значение не передается этому узлу в feed_dict, то его значением является просто «изображение».Когда я восстанавливаю свою замороженную модель, я просто использую feed_dict обычным способом, давая что-то этому заполнителю, и все работает.Я думаю, что таким образом все мусорные узлы, касающиеся shuffle_batch, будут просто отделены, если указано значение заполнителя.Хорошо знать.

...