Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将代码从Tensorflow 1迁移到Tensorflow 2时,如何处理属性错误:';亚当';对象没有属性';计算梯度';?_Python_Tensorflow - Fatal编程技术网

Python 将代码从Tensorflow 1迁移到Tensorflow 2时,如何处理属性错误:';亚当';对象没有属性';计算梯度';?

Python 将代码从Tensorflow 1迁移到Tensorflow 2时,如何处理属性错误:';亚当';对象没有属性';计算梯度';?,python,tensorflow,Python,Tensorflow,我正在使用Tensorflow,并且正在使用已经为Tensorflow 1()实现的代码。在将代码迁移到tensorflow 2时,我能够使用在线提供的文献进行大部分更改。但是,我无法找到第145行的合适替代方案: gradients = optimizer.compute_gradients(objective, var_list=var_list) 它抛出了一个错误 Attribute Error: 'Adam' object has no attribute 'compute_gradi

我正在使用Tensorflow,并且正在使用已经为Tensorflow 1()实现的代码。在将代码迁移到tensorflow 2时,我能够使用在线提供的文献进行大部分更改。但是,我无法找到第145行的合适替代方案:

gradients = optimizer.compute_gradients(objective, var_list=var_list)
它抛出了一个错误

Attribute Error: 'Adam' object has no attribute 'compute_gradient'
既然这个函数已经不存在了,我可以使用哪些替代方案?我已经读到可以使用以下功能来代替:

gradients = optimizer.get_gradients(objective, var_list)
这会抛出一个值错误

ValueError: Variable <tf.Variable 'agent_0/q_func/fully_connected/weights:0' shape=(9, 64) 
dtype=float32> has `None` for gradient. Please make sure that all of your ops have a 
gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, 
K.round, K.eval.

您应该使用
tf.GradientTape
来执行此操作。大概是这样的:

with tf.GradientTape() as tape:
    y_pred = my_obj_function(w, b, x)
    loss = my_loss(y_pred, y)

dw, db = tape.gradient(loss, [w, b])
optimizer.apply_gradients(zip([dw, db], [w, b]))
梯度在磁带内部,因为这个物体在观察变量(
w
b
)和损失函数相对于这些变量的梯度。然后,您可以将变量及其梯度传递给优化器,以执行优化的迭代。 上述示例的目标函数和损失函数:

def my_loss(y_pred, y_true):
    return tf.abs(y_pred - y_true)


def my_obj_function(w, b, x):
    return w * x + b
更新 正如我在评论中提到的,确保var列表中的所有元素都是
TF变量
。如果其中一些没有,只需使用以下方法将其隐藏:

var_list = [tf.variable(var) for var in var_list]
然后,您可以将坡度计算为休耕:

with tf.GradientTape() as tape:
    cost = objective(target, the_inputs)
gradients = tape.gradient(cost, var_list)
输入是使用
目标
功能计算
成本
的必要值。
磁带
仅监视定义为
TF变量的值
,并且只能计算它们的梯度。有了梯度,您可以简单地使用优化器来降低迭代中的成本:

optimizer.apply_gradients(zip(gradients, var_list))

tf.GradientTape
可以使用。看这里:

lst_var = [tf.variable(var) for var in var_list]
现在您可以计算它:

with tf.GradientTape() as tp:
    cost = objective(target, inputs)
    gradients = tp.gradient(cost, lst_var)

您好,在TensorFlow 2.x中,您可以使用GradientTap安装来代替以前使用的方法。因为这个方法基本上是在TensorFlow 1.x中使用的,而且在某些问题上TensorFlow的两个版本都有冲突。我在链接中提供的代码使用的是一个变量列表,并且至少有一些从tape.gradient返回的对象是不可iterable的非类型对象。你能提供一个如何为这段代码重新构造的例子吗?@Maximillius确保你传递给渐变的变量是TF变量,而不是TP常量或任何其他类型。您只需打印出变量即可检查。@Maximillius我也更新了我的帖子。
with tf.GradientTape() as tp:
    cost = objective(target, inputs)
    gradients = tp.gradient(cost, lst_var)