2016-08-19 2 views
0

Я построил автоматический кодировщик, чтобы «преобразовать» активации с VGG19.relu4_1 в пиксели. Я использую новые функции удобства в tensorflow.contrib.layers (как в TF 0.10rc0). Код имеет аналогичную компоновку, как учебник CIFAR10 от TensorFlow, с train.py, который выполняет обучение и контрольные точки модели на диск и один eval.py, который опросает новые файлы контрольных точек и выполняет вывод на них.Восстановление неисправностей контрольно-пропускной пункт TensorFlow net

Моя проблема заключается в том, что оценка никогда не бывает такой хорошей, как обучение, ни с точки зрения значения функции потерь, ни при просмотре выходных изображений (даже при работе на тех же изображениях, что и в тренировках). Это заставляет меня думать, что это как-то связано с процессом восстановления.

Когда я смотрю на результат обучения в TensorBoard, он выглядит хорошо (в конце концов), поэтому я не думаю, что с моей сетью что-то не так.

Моя чистая выглядит следующим образом:

import tensorflow.contrib.layers as contrib 
bn_params = {                    
    "is_training": is_training, 
    "center": True, 
    "scale": True 
}                                      

tensor = contrib.convolution2d_transpose(vgg_output, 64*4, 4,        
    stride=2, 
    normalizer_fn=contrib.batch_norm, 
    normalizer_params=bn_params, 
    scope="deconv1")               
tensor = contrib.convolution2d_transpose(tensor, 64*2, 4,        
    stride=2, 
    normalizer_fn=contrib.batch_norm, 
    normalizer_params=bn_params, 
    scope="deconv2") 
. 
. 
. 

И в train.py я делаю это, чтобы сохранить контрольную точку:

variable_averages = tf.train.ExponentialMovingAverage(mynet.MOVING_AVERAGE_DECAY) 
variables_averages_op = variable_averages.apply(tf.trainable_variables()) 

with tf.control_dependencies([apply_gradient_op, variables_averages_op]): 
    train_op = tf.no_op(name='train') 

while training: 
    # train (with batch normalization's is_training = True) 
    if time_to_checkpoint: 
     saver.save(sess, checkpoint_path, global_step=step) 

В eval.py я делаю это:

# run code that creates the net 

variable_averages = tf.train.ExponentialMovingAverage(
        mynet.MOVING_AVERAGE_DECAY) 
saver = tf.train.Saver(variable_averages.variables_to_restore()) 

while polling: 
    # sleep and check for new checkpoint files 
    with tf.Session() as sess: 
     init = tf.initialize_all_variables() 
     init_local = tf.initialize_local_variables() 
     sess.run([init, init_local]) 
     saver.restore(sess, checkpoint_path) 

     # run inference (with batch normalization's is_training = False) 

The loss function

Синий - это потеря тренировки, а оранжевая - потеря eval.

ответ

1

Проблема была в том, что я использовал tf.train.AdamOptimizer() напрямую. Во время оптимизации он не вызывал операции, определенные в contrib.batch_norm, для вычисления среднего значения/дисперсии входа, так что среднее значение/дисперсия всегда было 0.0/1.0.

Решение состоит в том, чтобы добавить зависимость от коллекции GraphKeys.UPDATE_OPS. Там уже есть функция, определенная в модуле contrib, которая делает это (optimize_loss())

+0

Спасибо за решение. Я единственный, кто считает, что это действительно должно быть хорошо документировано/исправлено. Я полагал, что функция 'optimize_loss()' была всего лишь ярлыком для оптимизатора.minimize (loss, step), а не что-то, что было необходимо для других вкладчиков, чтобы они работали как рекламируемые. – DomJack

Смежные вопросы