【发布时间】:2019-07-24 17:30:14
【问题描述】:
我正在使用现有的张量流模型。
对于网络的一部分,我想设置与其余网络不同的学习率。假设all_variables 由variables_1 和variables_2 组成,那么我想更改variables_2 变量的学习率。
用于设置优化器、计算和应用渐变的现有代码基本上如下所示:
optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9)
grads_and_vars = optimizer.compute_gradients(loss, all_variables)
grads_updates = optimizer.apply_gradients(grads_and_vars, global_step)
我已经尝试按照这个方案创建第二个优化器。但是,对于调试,我将两个学习率设置为相等,并且正则化损失的减少非常不同。
是否可以创建第二个优化器optimizer_new,并仅在variables_1 和variables_2 的相应grads_and_vars 上应用apply_gradients? IE。而不是这一行
grads_updates = optimizer.apply_gradients(grads_and_vars, global_step)
可以使用
grads_updates = optimizer.apply_gradients(grads_and_vars['variables_1'], global_step)
grads_updates_new = optimizer_new.apply_gradients(grads_and_vars['variables_2'], global_step)
最后,train_op = tf.group(grads_updates, grads_updates_new)。
但是,正则化损失行为仍然存在。
【问题讨论】:
-
为了进行苹果对苹果的比较,您还需要为第二个 compute_gradients 提供 grad_loss 参数,这应该是激活张量的梯度(您可以尝试在图形操作中找到类似的张量并发送它在 vars 列表中选择 1)介于 vars1 和 vars2 之间。
-
另外,您能否计算所有步骤的 grads,然后在将它们发送到 apply_gradietns 之前为相应的 var 集缩放 grads?
-
我不确定我是否完全理解你。执行compute_gradients(loss, all_variables),然后只提取与variable_2的变量对应的grads_and_vars,然后在这些上使用optimizer_new.apply_gradients,得到相同的结果
-
这是关于我的第二条评论:grads = opt.compute_grads(loss, all_vars); g1, g2 = _split(grads) g2 = [x*lr2/lr1 for x in g2] opt.apply_grads(g1+g2)
-
我在拆分 g1、g2 时遇到不支持的项目分配问题。你的第一个答案的 grad_loss 是什么意思?
标签: python tensorflow slim