gpt4 book ai didi

python - 如何根据keras中的条件替换张量的某些部分?

转载 作者:行者123 更新时间:2023-12-02 05:41:23 25 4
gpt4 key购买 nike

我想在带有tensorflow后端的keras张量上执行类似于np.where的操作。这意味着我有两个张量:diff 和 sum。我将这些向量划分为:

rel_dev = diff / sum

对于 np.arrays 我会写:

rel_dev = np.where((diff == 0.0) & (sum == 0.0), 0.0, rel_dev)
rel_dev = np.where((diff != 0.0) & (sum == 0.0), np.sign(diff), rel_dev)

也就是说,例如如果 diff 和 sum 都为零,我希望不会得到 np.Inf,而是将 rel_dev 设置为零。现在在带有张量的 keras 中它不起作用。我尝试过 K.switch、K.set_value 等。据我了解,它适用于整个张量,但不适用于单独的部分,对吧?尽管它无需设置这些条件即可工作,但我不知道在哪里实际发生了什么。我还没有调试成功。

您能告诉我如何在 Keras 中编写 rel_dev 的两个条件吗?

最佳答案

您可以在 Keras 中执行此操作,如下所示:

import keras.backend as K

diff = K.constant([0, 1, 2, -2, 3, 0])
sum = K.constant([2, 4, 1, 0, 5, 0])
rel_dev = diff / sum
d0 = K.equal(diff, 0)
s0 = K.equal(sum, 0)
rel_dev = K.switch(d0 & s0, K.zeros_like(rel_dev), rel_dev)
rel_dev = K.switch(~d0 & s0, K.sign(diff), rel_dev)
print(K.eval(rel_dev))
# [ 0. 0.25 2. -1. 0.6 0. ]

编辑:上面的公式有一个潜在的问题,即即使结果是正确的,nan值也会通过梯度传播回来(即因为除以零给出inf nan,并将 infnan 乘以零得到 nan)。事实上,如果你检查梯度:

gd, gs = K.gradients(rel_dev, (diff, sum))
print(K.eval(gd))
# [0.5 0.25 1. nan 0.2 nan]
print(K.eval(gs))
# [-0. -0.0625 -2. nan -0.12 nan]

可以用来避免这种情况的技巧是以不影响结果但阻止 nan 值的方式更改除法中的 sum,例如这个:

import keras.backend as K

diff = K.constant([0, 1, 2, -2, 3, 0])
sum = K.constant([2, 4, 1, 0, 5, 0])
d0 = K.equal(diff, 0)
s0 = K.equal(sum, 0)
# sum zeros are replaced by ones on division
rel_dev = diff / K.switch(s0, K.ones_like(sum), sum)
rel_dev = K.switch(d0 & s0, K.zeros_like(rel_dev), rel_dev)
rel_dev = K.switch(~d0 & s0, K.sign(diff), rel_dev)
print(K.eval(rel_dev))
# [ 0. 0.25 2. -1. 0.6 0. ]
gd, gs = K.gradients(rel_dev, (diff, sum))
print(K.eval(gd))
# [0.5 0.25 1. 0. 0.2 0. ]
print(K.eval(gs))
# [-0. -0.0625 -2. 0. -0.12 0. ]

关于python - 如何根据keras中的条件替换张量的某些部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58931078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com