Python tf.keras.backend.clip未给出正确的结果

Python tf.keras.backend.clip未给出正确的结果,python,tensorflow,keras,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow2.0,tf.keras.backend.clip未剪裁张量 当我在这个函数中使用tf.keras.backend.clip时 def grads_ds(model_ds, ds_inputs,y_true,cw): print(y_true) with tf.GradientTape() as ds_tape: y_pred = model_ds(ds_inputs) print(y_pred.numpy()) logits_1 = -1

tf.keras.backend.clip未剪裁张量

当我在这个函数中使用tf.keras.backend.clip时

def grads_ds(model_ds, ds_inputs,y_true,cw):
    print(y_true)
    with tf.GradientTape() as ds_tape:
        y_pred = model_ds(ds_inputs)
        print(y_pred.numpy())
        logits_1 = -1*y_true*K.log(y_pred)*cw[:,0]
        logits_0 = -1*(1-y_true)*K.log(1-y_pred)*cw[:,1]
        loss = logits_1 + logits_0
        loss_value_ds = K.sum(loss)

    ds_grads = ds_tape.gradient(loss_value_ds,model_ds.trainable_variables,unconnected_gradients=tf.UnconnectedGradients.NONE)
    for g in ds_grads:
        g = tf.keras.backend.clip(g,min_grad,max_grad)
    return loss_value_ds, ds_grads
未剪裁时,渐变的值保持不变

当我在自定义训练循环中使用tf.keras.backend.clip时,也是这样

for g in ds_grads:
    g = tf.keras.backend.clip(g,min_grad,max_grad)
它不起作用。应用于变量的梯度不会被剪裁

但是,如果我在循环中打印g,那么它将显示剪裁的值

无法理解问题所在。

这是因为示例中的g是对列表中的值的引用。当你给它赋值时,你只是在改变它指向的值,即你没有修改它指向的当前值。 考虑这个例子,我想把LST中的所有值设置为5。猜猜运行此代码示例时会发生什么

lst=[1,2,3,4] 对于lst中的ele: ele=5 printlst 没什么!你会得到完全相同的列表。然而,在循环中,您将看到ele现在是5,正如您在案例中已经发现的那样。在这种情况下,列表中的值是不可变的,张量是不可变的

但是,可以在位修改可变对象:

lst=[[2],[2],[2]] 对于lst中的ele: 附录3 printlst 上述代码将使每个元素[2,3]符合预期

解决问题的一种方法是:

lst = [1,2,3,4]
for itr in range(len(lst)):
    lst[itr] = 5
print(lst)

可以我得到了它!我犯了一个严重的错误!