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

xxx*_*222 5 machine-learning deep-learning tensorflow

我编写的以下代码失败 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)
Run Code Online (Sandbox Code Playgroud)

带着警告,

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

但是,当我将该行更改为时tf.gradients(self.output,all_variables),代码工作正常,至少没有报告警告。我想念哪里,因为我认为这两种方法实际上是在执行同一件事,所以返回的是(梯度,变量)对的列表。

Dav*_*ong 5

optimizer.compute_gradients包装tf.gradients(),如您在此处所见。它会执行其他断言(这将解释您的错误)。


ami*_*rfi 5

我想通过引用一个简单的观点来补充上面的答案。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))
Run Code Online (Sandbox Code Playgroud)