Ruizhi Deng
Ruizhi Deng

Reputation: 91

Tensorflow Training and Validation Input Queue Separation

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

Upvotes: 3

Views: 949

Answers (1)

Sergio Guadarrama
Sergio Guadarrama

Reputation: 257

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)

Upvotes: 0

Related Questions