Python 将代码从Tensorflow 1迁移到Tensorflow 2时,如何处理属性错误:';亚当';对象没有属性';计算梯度';?
我正在使用Tensorflow,并且正在使用已经为Tensorflow 1()实现的代码。在将代码迁移到tensorflow 2时,我能够使用在线提供的文献进行大部分更改。但是,我无法找到第145行的合适替代方案: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
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)