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)
,代码工作正常,至少没有报告警告。我想念哪里,因为我认为这两种方法实际上是在执行同一件事,所以返回的是(梯度,变量)对的列表。
我想通过引用一个简单的观点来补充上面的答案。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)
归档时间: |
|
查看次数: |
4775 次 |
最近记录: |