2017-01-05 4 views
0

Я пытаюсь запустить очень простую нейронную сеть в TensorFlow, которая научится классифицировать изображения. Пока это очень просто, потому что я все еще изучаю структуру.Использование очередей в TensorFlow для загрузки изображений и меток из текстового файла

До сих пор я пытаюсь загрузить данные - мои данные находятся в TXT-файле. Каждая строка содержит идентификатор фотографии и двоичный номер, который используется в качестве метки.

Это мой код до сих пор (я лишены несвязанные части):

import tensorflow as tf 

IMAGE_WIDTH = 240 
IMAGE_HEIGHT = 180 
NUMBER_OF_CHANNELS = 3 
SOURCE_DIR = './data/' 
TRAINING_IMAGES_DIR = SOURCE_DIR + 'train/' 
LIST_FILE_NAME = 'list.txt' 
BATCH_SIZE = 100 
TRAINING_SET_SIZE = 15873 

def create_photo_and_label_batches(source_directory): 
    # read the list of photo IDs and labels 
    photos_list = open(source_directory + LIST_FILE_NAME, 'r') 
    filenames_list = [] 
    labels_list = [] 
    # get lists of photo file names and labels 
    for line in photos_list: 
    filenames_list.append(source_directory + line.split(',')[0] + '.jpg') 
    labels_list.append([bool(line.split(',')[1])]) 
    # convert the lists to tensors 
    filenames = tf.convert_to_tensor(filenames_list, dtype=tf.string) 
    labels = tf.convert_to_tensor(labels_list, dtype=tf.bool) 
    # create queue with filenames and labels 
    file_names_queue, labels_queue = 
    tf.train.slice_input_producer([filenames, labels], num_epochs=1, shuffle=True) 
    # convert filenames of photos to input vectors 
    photos_queue = tf.read_file(file_names_queue) # convert filenames to content 
    photos_queue = tf.image.decode_jpeg(photos_queue, channels=NUMBER_OF_CHANNELS) 
    photos_queue.set_shape([IMAGE_HEIGHT, IMAGE_WIDTH, NUMBER_OF_CHANNELS]) 
    photos_queue = tf.to_float(photos_queue) # convert uint8 to float32 
    photos_queue = tf.reshape(photos_queue, [-1]) # flatten the tensor 
    # slice the data into mini batches 
    return tf.train.batch([photos_queue, labels_queue], batch_size=BATCH_SIZE) 

def main(_): 
    # load the training set 
    training_photo_batch, training_label_batch = 
     create_photo_and_label_batches(TRAINING_IMAGES_DIR) 

    # create the model 
    x = training_photo_batch 
    W = tf.Variable(tf.zeros([IMAGE_WIDTH * IMAGE_HEIGHT * NUMBER_OF_CHANNELS, 1], 
    dtype=tf.float32)) # weights tensor 
    b = tf.Variable(tf.zeros([1], dtype=tf.float32)) # bias 
    y_ = training_label_batch 
    y = tf.matmul(x, W) + b 

    # define loss and optimizer 
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, y_)) 
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

    # do the training 
    sess = tf.InteractiveSession() 
    tf.initialize_all_variables().run() 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(coord=coord) 
    for i in range(TRAINING_SET_SIZE // BATCH_SIZE): 
    sess.run(train_step) 

    # stop the queue threads and properly close the session 
    coord.request_stop() 
    coord.join(threads) 
    sess.close() 

Как вы можете видеть, что сеть очень просто один, только один нейрон. Я был вдохновлен кодом, перечисленных здесь: Tensorflow read images with labels После запуска кода я получаю следующее сообщение об ошибке на самой первой итерации:

tensorflow.python.framework.errors_impl.OutOfRangeError: FIFOQueue '_1_batch/fifo_queue' is closed and has insufficient elements (requested 100, current size 0) 
[[Node: batch = QueueDequeueMany[_class=["loc:@batch/fifo_queue"], component_types=[DT_FLOAT, DT_BOOL], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](batch/fifo_queue, batch/n)]] 

Я попытался решить эту проблему в течение нескольких часов в настоящее время. До сих пор я проверил, что:

  • filenames_list и labels_list правильно загружены,
  • формы тензоров (х, у, y_, W и б) являются правильными
  • TensorFlow график, правильно построен и виден в TensorBoard.

Не знаю, что еще я должен проверить. Кажется, я ничего не понимаю о очередях в TensorFlow, но я не знаю, что именно. Заранее благодарю за любую помощь!

+0

Это может быть вызвано 'num_epochs = 1' здесь' tf.train.slice_input_producer ([имена файлов, метки], num_epochs = 1, shuffle = True) '. Вы можете проверить api 'slice_input_producer', где он объясняет: num_epochs: целое число (необязательно). Если задано, slice_input_producer создает каждый фрагмент num_epochs раз перед генерированием ошибки OutOfRange. – Seven

+0

Спасибо, вот и все! Я неправильно понял значение этого параметра при чтении документации. Если вы опубликуете его в качестве ответа, я соглашусь с ним, конечно. :) –

ответ

2

Это может быть вызвано num_epochs=1 здесь tf.train.slice_input_producer([filenames, labels], num_epochs=1, shuffle=True). Вы можете проверить api slice_input_producer, где он объясняет: num_epochs: целое число (необязательно). Если задано, slice_input_producer создает каждый фрагмент num_epochs раз перед генерированием ошибки OutOfRange.

 Смежные вопросы

  • Нет связанных вопросов^_^