python - 如何获取y_true和y_pred之差的水平和垂直梯度?

标签 python tensorflow keras deep-learning loss-function

我想使用 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=-1np.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/

相关文章:

java - 从 Java 重新训练 Tensorflow inception v3 网络

machine-learning - 将复值图像输入神经网络( tensorflow )

python - 在急切执行期间不支持 session 关键字参数。您通过了 : {'learning_rate' : 1e-05}

python - keras/scikit-学习 : using fit_generator() with cross validation

Tensorflow Keras load_model 来自内存还是变量?

python - Matplotlib:更改绘图上两个 x 轴刻度线之间的距离

python - Django admin 如何以逗号分隔格式显示货币数字

python - 我对 Keras 中的batch_size理解正确吗?

python - 排序 OrderedDict 不起作用

python - 使用方法链接从同一数据帧中的多列中减去一列