我想知道是否有一种方法可以像 Caffe 中那样对不同的层使用不同的学习率。我正在尝试修改预训练模型并将其用于其他任务。我想要的是加快新添加层的训练,并使训练后的层保持低学习率,以防止它们被扭曲。例如,我有一个 5-conv-layer 预训练模型。现在我添加一个新的转换层并对其进行微调。前 5 层的学习率为 0.00001,最后一层为 0.001。知道如何实现这一目标吗?
原文由 Tong Shen 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想知道是否有一种方法可以像 Caffe 中那样对不同的层使用不同的学习率。我正在尝试修改预训练模型并将其用于其他任务。我想要的是加快新添加层的训练,并使训练后的层保持低学习率,以防止它们被扭曲。例如,我有一个 5-conv-layer 预训练模型。现在我添加一个新的转换层并对其进行微调。前 5 层的学习率为 0.00001,最后一层为 0.001。知道如何实现这一目标吗?
原文由 Tong Shen 发布,翻译遵循 CC BY-SA 4.0 许可协议
Tensorflow 1.7 引入了 tf.custom_gradient
大大简化了学习率乘数的设置,其方式现在与任何优化器兼容,包括那些累积梯度统计的优化器。例如,
import tensorflow as tf
def lr_mult(alpha):
@tf.custom_gradient
def _lr_mult(x):
def grad(dy):
return dy * alpha * tf.ones_like(x)
return x, grad
return _lr_mult
x0 = tf.Variable(1.)
x1 = tf.Variable(1.)
loss = tf.square(x0) + tf.square(lr_mult(0.1)(x1))
step = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.local_variables_initializer().run()
for _ in range(5):
sess.run([step])
print(sess.run([x0, x1, loss]))
原文由 P-Gn 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
2 回答859 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
使用 2 个优化器可以很容易地实现它:
这种实现的一个缺点是它在优化器内部计算了两次 tf.gradients(.) ,因此它在执行速度方面可能不是最优的。这可以通过显式调用 tf.gradients(.) 来缓解,将列表分成 2 并将相应的梯度传递给两个优化器。
相关问题: 在优化器期间保持变量不变
编辑:添加了更高效但更长的实现:
您可以使用
tf.trainable_variables()
获取所有训练变量并决定从中进行选择。不同之处在于,在第一个实现中tf.gradients(.)
在优化器中被调用了两次。这可能会导致执行一些冗余操作(例如,第一层上的梯度可以为后续层的梯度重用一些计算)。