Итератор Tensorflow не может выполнить итерацию - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над проектом, связанным с сегментацией экземпляра. Я пытаюсь обучить Se gNet своим собственным набором данных изображений, который содержит набор изображений и соответствующие им маски, и я успешно использовал tf.Dataset для загрузки своих данных. Но каждый раз, когда я использую питаемый итератор для передачи набора данных в Se gNet, моя программа всегда завершается без каких-либо ошибок или предупреждений. Мой код показан ниже.

load_satellite_image() используется для чтения имени файла для изображений, а dataset() используется для загрузки изображений с помощью tf.Dataset. Кажется, что итератор не может обновить входной конвейер.

     train_path = "data_example/train.txt"
     val_path = "data_example/test.txt"

     config_file = 'config.json'
     with open(config_file) as f:
         config = json.load(f)

     train_img, train_mask = load_satellite_image(train_path)   
     val_img, val_mask = load_satellite_image(val_path)   

     train_dataset = dataset(train_img, train_mask, config, True, 0, 1)  
     val_dataset = dataset(val_img, val_mask, config, True, 0, 1)  

     train_iter = train_dataset.make_initializable_iterator()
     validation_iter = val_dataset.make_initializable_iterator()

     handle = tf.placeholder(tf.string, shape=[])    

     iterator =  tf.data.Iterator.from_string_handle(handle,
                 train_dataset.output_types,train_dataset.output_shapes)

     next_element = iterator.get_next()

     with tf.Session() as Sess:
         sess.run(train_iter.initializer)
         sess.run(validation_iter.initializer)
         train_iter_handle = sess.run(train_iter.string_handle())
         val_iter_handle = sess.run(validation_iter.string_handle())

         for i in range(2):
             print("1")
             try:
                 while True:

                     for i in range(5):
                         print(sess.run(next_element,feed_dict={handle:train_iter_handle}))
                         print('----------------------------','\n')

                     for i in range(2):
                         print(sess.run(next_element,feed_dict={handle:val_iter_handle}))
             except tf.errors.OutOfRangeError:
                     pass

После выполнения кода выше я получил:

         In [2]: runfile('D:/python_code/tensorflow_study/SegNet/load_data.py', 
         wdir='D:/python_code/tensorflow_study/SegNet')

        (tf.float32, tf.int32)
        (TensorShape([Dimension(360), Dimension(480), Dimension(3)]), TensorShape([Dimension(360), 
        Dimension(480), Dimension(1)]))
        (tf.float32, tf.int32)
        (TensorShape([Dimension(360), Dimension(480), Dimension(3)]), TensorShape([Dimension(360), 
        Dimension(480), Dimension(1)]))
        WARNING:tensorflow:From D:\Anaconda\envs\tensorflow-gpu\lib\site- 
        packages\tensorflow\python\data\ops\dataset_ops.py:1419: colocate_with (from 
        tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
        Instructions for updating:
        Colocations handled automatically by placer.

        In [1]:

Я запутался, что мой код завершается без какой-либо причины , Как видите, я могу получить форму и тип данных обучающих / проверочных изображений и масок, что означает, что проблема не имеет ничего общего с моим набором данных. Однако for l oop в tf.Session() не выполняется, и я не могу получить результат print("1"). Итератор также не выполняется sess.run(). Кто-нибудь сталкивался с этой проблемой раньше?

Спасибо !!!

1 Ответ

0 голосов
/ 30 апреля 2020

Проблема решена. Это глупая ошибка, которая тратит впустую много времени. Причина, по которой моя программа завершается без сообщения об ошибке, заключается в том, что я использую глупый Spyder для написания своего кода, и я не знаю, почему он не показывает сообщение об ошибке. На самом деле, существует сообщение об ошибке, выдаваемое TensorFlow. По стечению обстоятельств я запустил свой код через командное окно Anaconda и получил следующее сообщение об ошибке:

2020-04-30 17:31:03.591207: W tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at whole_file_read_ops.cc:114 : Invalid argument: NewRandomAccessFile failed to Create/Open: D:\Study\PhD\python_code\tensorflow_study\SegNet\data_example\trainannot\ges_517405_679839_21.jpg

Итератор не работает, поскольку Tensorflow не может найти местоположения маски. Местоположения изображений и масок хранятся в текстовом файле следующим образом:

data_example\train\ges_517404_679750_21.jpg,data_example\trainannot\ges_517404_679750_21.jpg
data_example\train\ges_517411_679762_21.jpg,data_example\trainannot\ges_517411_679762_21.jpg

Левая сторона - это расположение необработанных изображений, а правая сторона - это расположение их масок. Вначале я использовал split(","), чтобы получить расположение изображений и масок отдельно, но, похоже, что-то не так с расположением масок. Поэтому я проверил код, который используется для генерации текстового файла:

file.writelines([Train_path[i],',',TrainAnnot_path[i],'\n'])

Каждая строка в текстовом файле заканчивается \n, и именно поэтому Tensorflow не может получить расположение масок. Поэтому я заменил file.writelines([Train_path[i],',',TrainAnnot_path[i],'\n']) на file.writelines([Train_path[i],' ',TrainAnnot_path[i],'\n']) и использовал strip().split(" ") вместо split(" "). Это решает проблему.

...