【问题标题】:Unable to achieve same performance training with vanilla Tensorflow code compared to training using TF-slim与使用 TF-slim 的训练相比,使用 vanilla TensorFlow 代码无法实现相同的性能训练
【发布时间】:2018-11-26 19:25:19
【问题描述】:

以下代码使用 TF-Slim 库加载模型并对其进行微调,在分类任务中实现了 90% 的性能(我省略了加载数据和预处理):

with slim.arg_scope(resnet_v1.resnet_arg_scope(weight_decay=0.0001)):
    logits, _ = resnet_v1.resnet_v1_50(images, num_classes=dataset.num_classes, is_training=True)

one_hot_labels = slim.one_hot_encoding(labels, NUM_CLASSES)
tf.losses.softmax_cross_entropy(one_hot_labels, logits)
total_loss = tf.losses.get_total_loss()
global_step = variables.get_or_create_global_step()
lr = tf.train.exponential_decay(LEARNING_RATE, global_step, DECAY_STEPS, GAMMA)
optimizer = tf.train.MomentumOptimizer(learning_rate=lr, momentum=MOMENTUM)
train_op = slim.learning.create_train_op(total_loss, optimizer, global_step=global_step)
init_fn = slim.assign_from_checkpoint_fn("resnet_v1_50.ckpt", VARIABLES_TO_RESTORE)

final_loss = slim.learning.train( train_op, logdir=train_dir, log_every_n_steps=500, save_summaries_secs=25,  init_fn=init_fn, number_of_steps = NUM_STEPS)

我尝试使用 vanilla tensorflow 重写相同的代码以更好地控制训练过程,但由于某种原因,在使用所有相同的超参数(大写)和相同的预处理时,我无法获得相同的性能(10% 的性能下降)。不同之处在于图形定义:

        lr = tf.train.exponential_decay(LEARNING_RATE,  global_step, DECAY_STEPS, GAMMA)
        optimizer = tf.train.MomentumOptimizer(learning_rate=lr, momentum=MOMENTUM)
        full_train_op = optimizer.minimize(total_loss, global_step=global_step)

和培训:

for s in range(NUM_STEPS):
    sess.run(train_init_op) #Initializes dataset iterator
    while True:
        try:
            sess.run([full_train_op], feed_dict={is_training: True})                    
        except tf.errors.OutOfRangeError:
            break

slim train 函数是否在做一些其他的操作?我认为它可能使用了批处理规范化或其他我没有在我的代码版本上实现的东西。

是否可以在 tensorflow 中加载 slim resnet 模型并在没有 slim train 功能的情况下对其进行训练?我对覆盖 train_step_fn 不感兴趣。

【问题讨论】:

    标签: python tensorflow resnet tf-slim


    【解决方案1】:

    这可能是由于没有运行与 resnet 的批处理规范相关联的 update_ops

    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    optimizer = tf.train.MomentumOptimizer(learning_rate=lr, momentum=MOMENTUM)
    with tf.control_dependencies(update_ops):
        full_train_op = optimizer.minimize(total_loss, global_step)
    # same training loop
    

    【讨论】:

    • 感谢您的帮助,在验证期间我是否需要做任何额外的推理? ''' while True: try: sess.run(tf_metric_update, feed_dict={is_training: False}) except tf.errors.OutOfRangeError: break train_acc = sess.run(tf_metric, feed_dict={is_training: False}) ''' where tf_metric 在图中定义为 tf_metric, tf_metric_update = tf.metrics.accuracy(labels, predictions, name="accuracy_metric")
    • 不。更新操作仅在训练期间运行。只要is_training 为 False,它将使用现在在训练期间更新的值,而不是批量统计信息。在不运行更新操作评估的情况下使用初始移动平均值。
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2019-04-07
    • 2017-09-10
    • 2017-08-11
    • 2018-08-03
    • 2017-06-10
    • 2017-06-26
    • 2019-04-10
    相关资源
    最近更新 更多