如何获得y_true和y_pred之间差异的水平和垂直梯度?

时间:2018-10-01 16:10:05

标签: 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>

1 个答案:

答案 0 :(得分:0)

Tensorflow张量在执行时根本不是数组,它们仅是对正在构建的计算图的引用。您可能需要查看tutorial on how Tensorflow builds graphs

损失函数有两个问题:首先,在任一轴上塌缩都不会产生标量,因此不可能取导数;其次,np.gradient似乎不存在Tensorflow。

对于第一个问题,您可以通过沿gradient_ygradient_x的其余轴缩小来解决。我不知道您可能要使用哪个功能,因为我不知道您的应用程序。

第二个问题可以通过两种方式解决:

  1. 您可以使用py_func包装np.gradient,但是您打算将其用作损失函数,因此您将希望采用该函数的梯度并定义{{1 }}的通话是complicated
  2. 使用纯Tensorflow编写自己的py_func版本。

例如,这是张量流中的一维np.gradient unested ):

np.gradient