2016-11-07 97 views
0
grads_and_vars = [] 
for var in tf.trainable_variables(): 
    if 'synthetic' in var.name: 
     grads_and_vars.append(self.optim.compute_gradients(self.grad_total_loss, var_list=[var])[0]) 
    else: 
     for k in self.grad_output.keys(): 
      if k in var.name: 
       grads = tf.gradients(self.layer_out[k], var, self.grad_output[k])[0] 
       grads_and_vars.append((grads,var)) 
# minimize the gradient loss and only change the dni module 
self.train_op = self.optim.apply_gradients(grads_and_vars, global_step=self.global_step) 

我读到别人的代码,任何人都可以向我解释什么是他们在做同样的事情张量流这两种方法的梯度计算有什么不同?

grads_and_vars.append(self.optim.compute_gradients(self.grad_total_loss, var_list=[var])[0]) 

grads = tf.gradients(self.layer_out[k], var, self.grad_output[k])[0] 
grads_and_vars.append((grads,var)) 

之间的区别?

回答

0

很难说没有这个人的全部代码,但基本上是:

  • 第一个从亏损self.grad_total_loss
  • 第二个应用适用标准梯度的变量,即梯度一个特定的梯度,这里梯度self.layer_out[k]相对于var,当我们知道梯度self.layer_out[k]self.grad_output[k]

换一种方式,我们backpropagate self.grad_output[k]self.layer_out[k]var