Wednesday, May 24, 2017

Tensorflow Training and Validation Input Queue Separation

Leave a Comment

I tried to replicate the Fully Convolutional Network results using TensorFlow. I used Marvin Teichmann's implementation from github. I only need to write the training wrapper. I create two graphs that share variables and two input queues, one for training and one for validation. To test my training wrapper, I used two short lists of training and validation files and I do a validation immediately after every training epoch. I also printed out the shape of every image from the input queue to check whether I get the correct input. However, after I started the training, it seems that only the images from the training queue is being dequeued. So both the training and validation graphs take input from the training queue and the validation queue is never accessed. Can anyone help explain and solve this problem?

Here's part of the relevant code:

def get_data(image_name_list, num_epochs, scope_name, num_class = NUM_CLASS):     with tf.variable_scope(scope_name) as scope:         images_path = [os.path.join(DATASET_DIR, i+'.jpg') for i in image_name_list]         gts_path = [os.path.join(GT_DIR, i+'.png') for i in image_name_list]         seed = random.randint(0, 2147483647)         image_name_queue = tf.train.string_input_producer(images_path, num_epochs=num_epochs, shuffle=False, seed = seed)         gt_name_queue = tf.train.string_input_producer(gts_path, num_epochs=num_epochs, shuffle=False, seed = seed)         reader = tf.WholeFileReader()         image_key, image_value = reader.read(image_name_queue)         my_image = tf.image.decode_jpeg(image_value)         my_image = tf.cast(my_image, tf.float32)         my_image = tf.expand_dims(my_image, 0)         gt_key, gt_value = reader.read(gt_name_queue)         # gt stands for ground truth         my_gt = tf.cast(tf.image.decode_png(gt_value, channels = 1), tf.float32)         my_gt = tf.one_hot(tf.cast(my_gt, tf.int32), NUM_CLASS)         return my_image, my_gt  train_image, train_gt = get_data(train_files, NUM_EPOCH, 'training') val_image, val_gt = get_data(val_files, NUM_EPOCH, 'validation') with tf.variable_scope('FCN16') as scope:         train_vgg16_fcn = fcn16_vgg.FCN16VGG()         train_vgg16_fcn.build(train_image, train=True, num_classes=NUM_CLASS, keep_prob = KEEP_PROB)         scope.reuse_variables()         val_vgg16_fcn = fcn16_vgg.FCN16VGG()         val_vgg16_fcn.build(val_image, train=False, num_classes=NUM_CLASS, keep_prob = 1) """ Define the loss, evaluation metric, summary, saver in the computation graph. Initialize variables and start a session. """ for epoch in range(starting_epoch, NUM_EPOCH):     for i in range(train_num):         _, loss_value, shape = sess.run([train_op, train_entropy_loss, tf.shape(train_image)])         print shape     for i in range(val_num):         loss_value, shape = sess.run([val_entropy_loss, tf.shape(val_image)])         print shape 

1 Answers

Answers 1

To make sure you are reading different images you could run:

[train_image_np, val_image_np] = sess.run([train_image, val_image]) 

To reuse variables this is better and safer:

with tf.variable_scope('FCN16') as scope:    train_vgg16_fcn = fcn16_vgg.FCN16VGG()      train_vgg16_fcn.build(train_image, train=True, num_classes=NUM_CLASS, keep_prob = KEEP_PROB) with tf.variable_scope(scope, reuse=True):    val_vgg16_fcn = fcn16_vgg.FCN16VGG()    val_vgg16_fcn.build(val_image, train=False, num_classes=NUM_CLASS, keep_prob = 1) 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment