我想使用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>
答案 0 :(得分:0)
Tensorflow张量在执行时根本不是数组,它们仅是对正在构建的计算图的引用。您可能需要查看tutorial on how Tensorflow builds graphs。
损失函数有两个问题:首先,在任一轴上塌缩都不会产生标量,因此不可能取导数;其次,np.gradient
似乎不存在Tensorflow。
对于第一个问题,您可以通过沿gradient_y
或gradient_x
的其余轴缩小来解决。我不知道您可能要使用哪个功能,因为我不知道您的应用程序。
第二个问题可以通过两种方式解决:
py_func
包装np.gradient
,但是您打算将其用作损失函数,因此您将希望采用该函数的梯度并定义{{1 }}的通话是complicated。py_func
版本。例如,这是张量流中的一维np.gradient
( unested ):
np.gradient