How to use tf.layers.batch_normalization () in a tensor stream?

I am confused by tf.layers.batch_normalization in a tensor stream.

My code is as follows:

 def my_net(x, num_classes, phase_train, scope): x = tf.layers.conv2d(...) x = tf.layers.batch_normalization(x, training=phase_train) x = tf.nn.relu(x) x = tf.layers.max_pooling2d(...) # some other staffs ... # return return x def train(): phase_train = tf.placeholder(tf.bool, name='phase_train') image_node = tf.placeholder(tf.float32, shape=[batch_size, HEIGHT, WIDTH, 3]) images, labels = data_loader(train_set) val_images, val_labels = data_loader(validation_set) prediction_op = my_net(image_node, num_classes=2,phase_train=phase_train, scope='Branch1') loss_op = loss(...) # some other staffs optimizer = tf.train.AdamOptimizer(base_learning_rate) update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops): train_op = optimizer.minimize(loss=total_loss, global_step=global_step) sess = ... coord = ... while not coord.should_stop(): image_batch, label_batch = sess.run([images, labels]) _,loss_value= sess.run([train_op,loss_op], feed_dict={image_node:image_batch,label_node:label_batch,phase_train:True}) step = step+1 if step==NUM_TRAIN_SAMPLES: for _ in range(NUM_VAL_SAMPLES/batch_size): image_batch, label_batch = sess.run([val_images, val_labels]) prediction_batch = sess.run([prediction_op], feed_dict={image_node:image_batch,label_node:label_batch,phase_train:False}) val_accuracy = compute_accuracy(...) def test(): phase_train = tf.placeholder(tf.bool, name='phase_train') image_node = tf.placeholder(tf.float32, shape=[batch_size, HEIGHT, WIDTH, 3]) test_images, test_labels = data_loader(test_set) prediction_op = my_net(image_node, num_classes=2,phase_train=phase_train, scope='Branch1') # some staff to load the trained weights to the graph saver.restore(...) for _ in range(NUM_TEST_SAMPLES/batch_size): image_batch, label_batch = sess.run([test_images, test_labels]) prediction_batch = sess.run([prediction_op], feed_dict={image_node:image_batch,label_node:label_batch,phase_train:False}) test_accuracy = compute_accuracy(...) 

Learning seems to work well, and val_accuracy is reasonable (say 0.70 ). The problem is this: when I tried to use a prepared model to run a test (i.e. test function), if the phase_train parameter phase_train set to False , the test_accuracy value test_accuracy very low (for example, 0.000270 ), but when the phase_train value phase_train set to True , test_accuracy seems correct (say 0.69 ).

As far as I understood, phase_train should be False at the testing stage, right? I am not sure what the problem is. Do not I understand the normalization of the party?

+5
source share

Source: https://habr.com/ru/post/1272349/


All Articles