我想使用 Keras 定义一个自定义损失函数,其中包含 y_true 和 y_pred 之间差异的梯度。 我发现 numpy.gradient 可以帮助我获取数组的梯度。 所以我的损失函数代码的一部分如下所示:
def loss(y_true, y_pred):
d = y_true - y_pred
gradient_x = np.gradient(d, axis=0)
gradient_y = np.gradient(d, axis=1)
但事实证明d
是一个Tensorflow张量类,numpy.gradient
无法处理它。
我对 Keras 和 Tensorflow 有点陌生。
还有其他功能可以帮助我做到这一点吗?或者我必须自己计算梯度?</p>
最佳答案
我遇到了同样的问题,想要使用定义损失函数
np.gradient
。我编写了该函数的纯 tensorflow 版本来解决该问题。
这是我的版本:(它与带有 axis=-1
的 np.gradient
具有相同的行为。)如果您想让它适用于任意轴,你需要多尝试一下:
def my_gradient_tf(a):
rght = tf.concat((a[..., 1:], tf.expand_dims(a[..., -1], -1)), -1)
left = tf.concat((tf.expand_dims(a[...,0], -1), a[..., :-1]), -1)
ones = tf.ones_like(rght[..., 2:], tf.float64)
one = tf.expand_dims(ones[...,0], -1)
divi = tf.concat((one, ones*2, one), -1)
return (rght-left) / divi
关于python - 如何获取y_true和y_pred之差的水平和垂直梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594994/