在张量流中冻结神经网络的部分
Freeze parts of neural net in tensorflow
我有一个使用 slim 创建的完全连接层的深层网络。我想逐渐对网络进行训练——首先允许优化第一层,然后是第二层,依此类推。阅读时,我看到这可以使用 tf.stop_gradient 来完成,尽管尚不清楚如何做到这一点。
也许更好的方法是在 slim 调用中使用 trainable 标志——只需将除第一层以外的所有层都设置为 false。不幸的是,这将需要随着训练的进行逐渐将后续层设置为 true,从而改变图表。不确定这是否合法。
我的问题:
- 这些是我想做的合理方法吗?
- 谁能建议如何实施这两种方法?
常见的用法是这样的:
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>)
然后,在你的 运行ning 阶段,你将 运行 train_op1
和 train_op2
根据你的优化计划(例如第一层的循环和然后在第二层循环)
(P.S。None 阻止您仅对第一层使用两个不同的损失函数,然后对两个层使用。在这种情况下,优化器将仅针对这些变量进行最小化loss_function 取决于。)
稍后编辑: 在这种方法中,可能的更新方案可能是:
while <some condition>:
sess.run(train_op1)
sess.run(train_op2)
此过程将更新第一个操作var_list
中的变量train_op1
,然后它将使用这些更新的参数更新第二个操作var_list
中的变量train_op2
.
但是,有时您需要两个更新都使用两个变量的初始值来计算梯度,并且仅在之后将所有变量更新为新变量。这通常是必要的,当你对两组 variables.In 这种情况有不同的损失函数时,你必须在你的图形上放置一些依赖项:
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)
我有一个使用 slim 创建的完全连接层的深层网络。我想逐渐对网络进行训练——首先允许优化第一层,然后是第二层,依此类推。阅读时,我看到这可以使用 tf.stop_gradient 来完成,尽管尚不清楚如何做到这一点。 也许更好的方法是在 slim 调用中使用 trainable 标志——只需将除第一层以外的所有层都设置为 false。不幸的是,这将需要随着训练的进行逐渐将后续层设置为 true,从而改变图表。不确定这是否合法。
我的问题: - 这些是我想做的合理方法吗? - 谁能建议如何实施这两种方法?
常见的用法是这样的:
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>)
然后,在你的 运行ning 阶段,你将 运行 train_op1
和 train_op2
根据你的优化计划(例如第一层的循环和然后在第二层循环)
(P.S。None 阻止您仅对第一层使用两个不同的损失函数,然后对两个层使用。在这种情况下,优化器将仅针对这些变量进行最小化loss_function 取决于。)
稍后编辑: 在这种方法中,可能的更新方案可能是:
while <some condition>:
sess.run(train_op1)
sess.run(train_op2)
此过程将更新第一个操作var_list
中的变量train_op1
,然后它将使用这些更新的参数更新第二个操作var_list
中的变量train_op2
.
但是,有时您需要两个更新都使用两个变量的初始值来计算梯度,并且仅在之后将所有变量更新为新变量。这通常是必要的,当你对两组 variables.In 这种情况有不同的损失函数时,你必须在你的图形上放置一些依赖项:
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)