我编写的以下代码在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)
时,代码工作正常,至少没有报告警告。我在哪里错过了,因为我认为这两种方法实际上都在执行相同的操作,即返回(渐变,变量)对的列表。
答案 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))