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)
0 comments:
Post a Comment