2016-11-07 95 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