tensorflow中的optimizer.compute_gradient()和tf.gradients()有什么区别?

时间:2016-11-11 01:44:55

标签: machine-learning tensorflow deep-learning

我编写的以下代码在self.optimizer.compute_gradients(self.output,all_variables)

处失败
import tensorflow as tf
import tensorlayer as tl
from tensorflow.python.framework import ops
import numpy as np

class Network1():


def __init__(self):
    ops.reset_default_graph()
    tl.layers.clear_layers_name()

    self.sess = tf.Session()
    self.optimizer = tf.train.AdamOptimizer(learning_rate=0.1)

    self.input_x = tf.placeholder(tf.float32, shape=[None, 784],name="input")  

    input_layer = tl.layers.InputLayer(self.input_x)        

    relu1 = tl.layers.DenseLayer(input_layer, n_units=800, act = tf.nn.relu, name="relu1")
    relu2 = tl.layers.DenseLayer(relu1, n_units=500, act = tf.nn.relu, name="relu2")

    self.output = relu2.all_layers[-1]
    all_variables = relu2.all_layers

    self.gradient = self.optimizer.compute_gradients(self.output,all_variables)

    init_op = tf.initialize_all_variables()
    self.sess.run(init_op)

警告,

  

TypeError:参数不是tf.Variable:Tensor(“relu1 / Relu:0”,   shape =(?,800),dtype = float32)

然而,当我将该行更改为tf.gradients(self.output,all_variables)时,代码工作正常,至少没有报告警告。我在哪里错过了,因为我认为这两种方法实际上都在执行相同的操作,即返回(渐变,变量)对的列表。

2 个答案:

答案 0 :(得分:5)

optimizer.compute_gradients包裹tf.gradients(),正如您所见here。它会执行其他断言(这可以解释您的错误)。

答案 1 :(得分:0)

我想通过提及一个简单的观点来补充上面的答案。 optimizer.compute_gradients返回一个元组列表,以(grads,vars)对组成。变量始终存在,但渐变可能为“无”。这是有道理的,因为针对loss中的某些变量计算特定var_list的梯度可以为None。它说没有依赖性。

另一方面,tf.gradients仅返回每个变量的sum(dy/dx)列表。必须附有变量列表才能应用渐变更新。

此后,以下两种方法可以互换使用:

        ### Approach 1 ###
        variable_list = desired_list_of_variables
        gradients = optimizer.compute_gradients(loss,var_list=variable_list)
        optimizer.apply_gradients(gradients)

        # ### Approach 2 ###
        variable_list = desired_list_of_variables
        gradients = tf.gradients(loss, var_list=variable_list)
        optimizer.apply_gradients(zip(gradients, variable_list))