作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道是否有一种方法可以对不同的层使用不同的学习率,例如 Caffe 中的方法。我正在尝试修改预训练模型并将其用于其他任务。我想要的是加快新添加层的训练,并使训练后的层保持低学习率,以防止它们被扭曲。例如,我有一个 5 层的预训练模型。现在我添加一个新的卷积层并对其进行微调。前 5 层的学习率为 0.00001,最后一层的学习率为 0.001。知道如何实现这一目标吗?
最佳答案
使用 2 个优化器可以很容易地实现:
var_list1 = [variables from first 5 layers]
var_list2 = [the rest of variables]
train_op1 = GradientDescentOptimizer(0.00001).minimize(loss, var_list=var_list1)
train_op2 = GradientDescentOptimizer(0.0001).minimize(loss, var_list=var_list2)
train_op = tf.group(train_op1, train_op2)
这种实现的一个缺点是它在优化器中计算 tf.gradients(.) 两次,因此它在执行速度方面可能不是最优的。这可以通过显式调用 tf.gradients(.)、将列表拆分为 2 并将相应的梯度传递给两个优化器来缓解。
相关问题:Holding variables constant during optimizer
编辑:添加了更高效但更长的实现:
var_list1 = [variables from first 5 layers]
var_list2 = [the rest of variables]
opt1 = tf.train.GradientDescentOptimizer(0.00001)
opt2 = tf.train.GradientDescentOptimizer(0.0001)
grads = tf.gradients(loss, var_list1 + var_list2)
grads1 = grads[:len(var_list1)]
grads2 = grads[len(var_list1):]
tran_op1 = opt1.apply_gradients(zip(grads1, var_list1))
train_op2 = opt2.apply_gradients(zip(grads2, var_list2))
train_op = tf.group(train_op1, train_op2)
您可以使用 tf.trainable_variables()
来获取所有训练变量并决定从中进行选择。不同之处在于,在第一个实现中,tf.gradients(.)
在优化器中被调用了两次。这可能会导致执行一些冗余操作(例如,第一层的梯度可以重用一些计算来用于后续层的梯度)。
关于python - 如何在 Tensorflow 中设置分层学习率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945554/
我是一名优秀的程序员,十分优秀!