我有一个使用slim创建的完全连接层的深层网络。我想逐步训练网络 - 首先允许第一层优化,然后第二层等等。阅读,我看到这可能是使用tf.stop_gradient完成的,尽管如何做到这一点并不清楚。 也许更好的方法是在细长调用中使用可训练标志 - 只需设置除第一层之外的所有标志都是假的。不幸的是,这需要在训练进行时逐渐将后续层设置为true,从而更改图形。不确定这是否合法。
我的问题: - 这些合理的方法是我想做的吗? - 任何人都可以建议如何实施这两种方法吗?
答案 0 :(得分:2)
常见用法是这样的:
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train_op = optimizer.minimize(loss_function)
现在,您可以向minimize
提供另一个var_list
参数,这是一个您想要更改的变量列表,以便最大限度地减少您的loss_fuction。
因此,您只能优化所有变量的一部分,即冻结所有其余变量。
因此,假设您想要首先优化图层然后再优化另一个图层。然后,您可以使用以下内容:
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_op1
和train_op2
(例如,第一层上的循环,然后是第二层上的循环)
(P.S.None阻止您仅对第一层使用两个不同的损失函数,然后对两个图层使用。在这种情况下,优化器将仅针对loss_function所依赖的那些变量进行最小化。)
一段时间后编辑:在这种方法中,可能的更新方案可能是:
while <some condition>:
sess.run(train_op1)
sess.run(train_op2)
此过程将更新第一个操作var_list
的{{1}}中的变量,然后它将使用这些更新的参数更新第二个操作train_op1
中的变量{{ 1}}。
但是,有时你需要两个更新都使用两个变量的初始值来计算渐变,然后才将所有变量更新为新的变量。当你为这两组变量设置不同的损失函数时,通常需要这样做。在这种情况下,你必须在你的图上加上一些依赖:
var_list