常见的用法是这样的:
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_op1 和train_op2(例如,在第一层循环,然后在第二层循环)
(P.S. None 阻止您仅对第一层使用两个不同的损失函数,然后对两个层使用。在这种情况下,优化器将仅针对 loss_function 所依赖的那些变量最小化。)
稍后编辑:在这种方法中,可能的更新方案可能是:
while <some condition>:
sess.run(train_op1)
sess.run(train_op2)
此过程将更新第一次操作train_op1 的var_list 中的变量,然后它将使用这些更新的参数更新第二次操作train_op2 的var_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)