【问题标题】:Freeze parts of neural net in tensorflow在张量流中冻结部分神经网络
【发布时间】:2017-05-31 01:35:18
【问题描述】:

我有一个使用 slim 创建的完全连接层的深度网络。我想逐渐对网络进行训练——首先允许优化第一层,然后是第二层,依此类推。阅读时,我发现这可以使用 tf.stop_gradient 来完成,尽管尚不清楚如何做到这一点。 也许更好的方法是在 slim 调用中使用 trainable 标志 - 只需将除第一层之外的所有层设置为 false。不幸的是,这需要随着训练的进行逐渐将后续层设置为 true,从而更改图形。不确定这是否合法。

我的问题: - 这些是我想做的合理方法吗? - 谁能建议如何实施这两种方法?

【问题讨论】:

  • 我有这个问题的more general version,但还没有答案。希望您将问题限制为渐进式、分层学习这一事实可以使解决方案更容易。

标签: tensorflow gradient


【解决方案1】:

常见的用法是这样的:

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train_op = optimizer.minimize(loss_function)

现在,您可以向minimize 提供另一个参数var_list,这是您要更改的变量列表,以最小化您的损失函数。

因此,您可以只优化所有变量的一个子集,即冻结所有其他变量。

因此,假设您有一个图表,您想先优化一层,然后再优化另一层。然后,你可以使用这样的东西:

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train_op1 = optimizer.minimize(loss_function, var_list=<list of first layer variables>)
train_op2 = optimizer.minimize(loss_function, var_list=<list of second layer variables>)

然后,在运行阶段,您将根据优化计划运行train_op1train_op2(例如,在第一层循环,然后在第二层循环)

(P.S. None 阻止您仅对第一层使用两个不同的损失函数,然后对两个层使用。在这种情况下,优化器将仅针对 loss_function 所依赖的那些变量最小化。)

稍后编辑:在这种方法中,可能的更新方案可能是:

while <some condition>:
    sess.run(train_op1)
    sess.run(train_op2)

此过程将更新第一次操作train_op1var_list 中的变量,然后它将使用这些更新的参数更新第二次操作train_op2var_list 中的变量。

但是,有时您需要两次更新都使用两个变量的初始值来计算梯度,然后才将所有变量更新为新变量。当您对两组变量有不同的损失函数时,这通常是必要的。在这种情况下,您必须在图上放置一些依赖项:

grad_var1 = optimizer.compute_gradients(loss_function1, var_list=<list of first layer variables>)
grad_var2 = optimizer.compute_gradients(loss_function2, var_list=<list of second layer variables>)
with tf.control_dependencies([grad_var1, grad_var2]):
    train_op1 = optimizer.apply_gradients(grad_var1)
    train_op2 = optimizer.apply_gradients(grad_var2)
train_op = tf.group(train_op1, train_op2)

【讨论】:

  • 这看起来很有趣...我会尽快尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多