炼丹技巧

1. 无脑Adam

 它的默认初始学习率是0.001,但是发现设置为0.0002效果很好    注意记录loss的时候最好把cross-entropy和regularization的loss分来记录,同时对比,最好是刚开始时两个方面的loss都在下降,不要说一开始一直都是regularization loss在下降,分类loss不变,这样很容易rloss全变成0从而loss不下降了 

❤发现lr越小,cross-entropy loss下降得更快些, lr越大越容易让regularization loss降到0,之后就训练不了了【基于Adam】❤

1 lr = tf.Variable(FLAGS.initial_lr, trainable=False, name="learning_rate")
2 tf.summary.scalar("learning_rate",lr)
3 training_op = tf.train.AdamOptimizer(lr).minimize(total_loss,global_step)

2. lr 衰减

   之前都是用tf.train.piecewise_constant()   但是自己定义这个衰减距离不是很科学,那就用一个变量记住当前validation的最好结果,然后用一个count记录下validation的结果小于best的次数,如果这个次数大于某个阈值,就对learning_rate进行衰减操作,一般这个阈值设置为一个epoch的大小,也就是 count_to_patience = batches_per_epoch/validation_frequency       一个epoch有多少个batch /  隔多少个batch进行validation    例:1500/300 = 5

 1 best_validation_score = 0.0
 2 patience = 5
 3 count_to_patience = 0
 4 
 5 if step % 300 == 0:
 6     accuracy = validation()
 7     if accuracy > best_validation_score:
 8         best_validation_score = accuracy
 9     else:
10         count_to_patience += 1
11     if count_to_patience == patience:
12         count_to_patience = 0
13         lr /= 10

3. batch_size

   对于我们穷人来说是尽量在卡上能多大就多大,之前有人不提倡说batch_size很大,但是我们的条件也大不到哪儿去,能用64就不要用32   论文中常用的是256一个batch

4. weights 初始化方法

 都说 LSUV > He > Xavier > Guassian   没有用过LSUV【论文All you need is a good init 】,在tensorflow里使用He init或者说是MSRA init很方便,有现有函数,使用着挺好的【论文: Delve into ..... Kaiming He】

1 with slim.arg_scope([slim.conv2d],
2                     weights_initializer=slim.variance_scaling_initializer())    

5. nvidia-smi  多卡情况下特别慢

sudo nvidia-persistenced --persistence-mode    这个命令之后就会很快

6. 一个具体调参例子  from: Karparthy

原文地址:https://www.cnblogs.com/lainey/p/8308821.html