I tried to replicate the results of the Fully Convolutional Network using TensorFlow. I used the implementation of Marvin Teichmann from github. I need to write only a training shell. I create two graphs that separate variables and two input queues, one for training and one for testing. To test my training shell, I used two short lists of training and verification files, and I do validation immediately after each training era. I also printed out the shape of each image from the input queue to check if I am getting the correct input. However, after I started training, it seems that only images from the training queue are delayed. Thus, both training and validation schedules receive input from the training queue, and the verification queue is not available. Can someone help explain and solve this problem?
Here is 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)
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