Python tf.keras.backend.clip未给出正确的结果
tf.keras.backend.clip未剪裁张量 当我在这个函数中使用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
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)
可以我得到了它!我犯了一个严重的错误!