在张量流中冻结神经网络的部分

时间:2017-05-31 01:35:18

标签: tensorflow gradients

我有一个使用slim创建的完全连接层的深层网络。我想逐步训练网络 - 首先允许第一层优化,然后第二层等等。阅读,我看到这可能是使用tf.stop_gradient完成的,尽管如何做到这一点并不清楚。  也许更好的方法是在细长调用中使用可训练标志 - 只需设置除第一层之外的所有标志都是假的。不幸的是,这需要在训练进行时逐渐将后续层设置为true,从而更改图形。不确定这是否合法。

我的问题: - 这些合理的方法是我想做的吗? - 任何人都可以建议如何实施这两种方法吗?

1 个答案:

答案 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_op1train_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