当前位置:  开发笔记 > 编程语言 > 正文

训练时如何冻结张量流变量中的特定节点?

如何解决《训练时如何冻结张量流变量中的特定节点?》经验,为你挑选了1个好方法。

目前,我在使变量中的一些元素变为不可训练方面遇到麻烦。它意味着给定变量,例如x,

x= tf.Variable(tf.zeros([2,2]))

我希望只训练x [0,0]和x [1,1],同时在训练时保持x [0,1]和x [1.0]不变。

当前,tensorflow确实提供了使用trainable=False或使任何变量不可训练的选项tf.stop_gradient()。但是,这些方法将使所有元素x成为不可训练的。我的问题是如何获得这种选择性?



1> lejlot..:

到目前为止,没有选择性缺乏更新;但是,可以通过明确指定更新的变量来间接实现此效果。双方.minimize所有的梯度函数接受变量列表要优化过-只需创建一个列表省略其中的一些,例如

v1 = tf.Variable( ... ) # we want to freeze it in one op 
v2 = tf.Variable( ... ) # we want to freeze it in another op
v3 = tf.Variable( ... ) # we always want to train this one
loss = ...
optimizer = tf.train.GradientDescentOptimizer(0.1)

op1 = optimizer.minimize(loss, 
      var_list=[v for v in tf.get_collection(tf.TRAINABLE_VARIABLES) if v != v1])

op2 = optimizer.minimize(loss, 
      var_list=[v for v in tf.get_collection(tf.TRAINABLE_VARIABLES) if v != v2])

现在,只要您想培训wrt,就可以打电话给他们。变量子集。请注意,如果您使用的是Adam或其他方法来收集统计信息,则可能需要2个单独的优化器(最终每个优化器将获得单独的统计信息!)。但是,如果每次训练只有一组冻结变量,那么使用var_list可以很简单地完成所有工作。

但是,没有办法修复变量子集的训练。Tensorflow始终将变量视为单个单元。您必须以其他方式指定计算方式才能实现这一目标,其中一种方式是:

创建一个带有1的二进制掩码M,您要在其中停止X上的更新

创建单独的变量X',该变量不可训练,并将tf.x的值赋给它

输出X'* M +(1-M)* X

例如:

x = tf.Variable( ... )
xp= tf.Variable( ..., trainable=False)
m = tf.Constant( ... ) # mask
cp= tf.Assign(x, xp)
with tf.control_dependencies([cp]):
  x_frozen = m*xp + (1-m)*x

而您只使用x_frozen而不是x。请注意,我们需要控制依赖项,因为tf.assign可以异步执行,在这里我们要确保它始终具有最新的x值。

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有