炼丹技巧
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