Проблема с TensorFlow, когда feed_dict не замечается при использовании пакетной обработки

Я пытался сделать учебник mnist с файлами png и довел большинство вещей до того момента, когда они имеют смысл.

Суть кода находится здесь, однако я расскажу, что он делает и где проблема происходит.

У меня есть функция, которая генерирует имена файлов, которые я могу передать slice_input_producer.

def gen_file_names_and_labels(rootDir):

"""goes through the directory structure and extracts images and labels from each image."""
file_names = []
labels = []
for file_name in glob.glob(rootDir+'/*/*'):

    file_type_removed = file_name.split('.')[0]
    split_by_dir = file_type_removed.split('/')
    file_names.append(file_name)
    labels.append(int(split_by_dir[2])) #getting the folder it's in, turning into an int, and using as label
return file_names, labels

Это ведет себя так, как ожидалось.

В теле я запускаю эту функцию для обучения и тестирования и превращаю их в тензоры, передавая эти тензоры в slice_input_producer

sess = tf.InteractiveSession()

#THERE A PIPELINE FOR BOTH TESTING AND TRAINING. THEY COME IN PAIRS    
image_list_train,   label_list_train    = gen_file_names_and_labels('mnist_png/training')
image_list_test,    label_list_test     = gen_file_names_and_labels('mnist_png/testing')

images_train    = tf.convert_to_tensor(image_list_train,dtype=tf.string)    
images_test     = tf.convert_to_tensor(image_list_test,dtype=tf.string)    

#remember that these aren't the actual images, just file_names
labels_train    = tf.convert_to_tensor(label_list_train,dtype=tf.int32)
labels_test     = tf.convert_to_tensor(label_list_test,dtype=tf.int32)

input_queue_train   = tf.train.slice_input_producer([images_train   ,labels_train]  , shuffle=True)
input_queue_test    = tf.train.slice_input_producer([images_train   ,labels_train]  , shuffle=True)

эта часть также работает правильно.

Здесь все становится странно.

asdf = tf.placeholder(tf.int32)
input_queue = tf.cond( asdf>0, lambda: input_queue_train, lambda: input_queue_test)
# input_queue = input_queue_test
image, label = read_images_from_disk(input_queue)
image_reshaped = tf.reshape( image, [28,28,1])
image_batch, label_batch = tf.train.batch([image_reshaped,label],batch_size=50)

Переменная asdf была переименована в гневе, так как она несла плохие новости. См. План здесь состоял в том, чтобы использовать разные очереди для обучения и тестирования. Я планировал передать в feed_dict одно целое число, которое будет работать как специальное логическое значение для переключения между ними.

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
sess.run(tf.initialize_all_variables())
print(label_batch.eval(feed_dict={asdf:0,keep_prob:1.0}))
for i in range(500):
    # batch = mnist.train.next_batch(50)

    if i%20 ==0:
        train_accuracy = accuracy.eval(feed_dict={keep_prob:1.0,asdf:0})
        print("step %d, training accuracy %g"%(i, train_accuracy))

    train_step.run(feed_dict={keep_prob:0.9,asdf:0})

Однако при его запуске я получаю сообщение об ошибке: «Вы должны передать значение для тензора-заполнителя «Заполнитель» с dtype int32», что странно, потому что я передаю его.

используя «print(foo.eval(feed_dict={asdf:0,keep_prob:1.0))», я смог заметить некоторые интересные явления. Кажется, что переключение работает нормально, когда я оцениваю отдельные переменные, объявленные «изображение, метка», которые выйти из "read_images_from_disk(input_queue)"

Однако, если я попытаюсь оценить пакетную обработку, которая следует сразу после этого, я получу вышеупомянутую ошибку.

Что я делаю неправильно с пакетной обработкой, чтобы это произошло? Есть ли лучший способ сделать это переключение между тестовыми и тренировочными наборами? В чем смысл жизни, вселенной и всего остального? Я рассчитываю на вас StackOverflow. Ты моя единственная надежда.


person Aleksandr Savchenkov    schedule 30.09.2016    source источник


Ответы (1)


В ответ на ваш вопрос: «Есть ли лучший способ сделать это переключение между тестовыми и тренировочными наборами?» Да, есть. tf.cond() оценивает обе функции на каждом этапе (см. здесь) и поэтому без необходимости обращается к обеим очередям. Это обсуждение SO и соответствующие ссылки предоставляют несколько лучших альтернативы:

  • используйте tf.placeholder_with_default() для ваших тестовых данных
  • использовать make_template
person RobR    schedule 30.09.2016
comment
Это довольно хорошее наблюдение. Я забыл о не очень ленивом вычислении tf.cond, поэтому здесь я использую его совершенно неправильно. Попытаюсь переделать его прямо сейчас, чтобы использовать placeholder_with_default. - person Aleksandr Savchenkov; 30.09.2016
comment
Только что попробовал оценить тестовые партии и ввести их в файл feed_dict. Работал отлично. С первой попытки не меньше! Спасибо. - person Aleksandr Savchenkov; 30.09.2016