首页 > 解决方案 > TypeError: tuple - keras 自定义错误上的元组

问题描述

我想制作一个自定义损失函数,使用 Keras 比较两个图像之间的梯度。所以我做了一个像这样的代码:

def mean_gradient_error(y_true,y_pred):
    alpha = 0.6
    if not B.is_tensor(y_pred):
        y_pred = B.constant(y_pred)
    y_true = B.cast(y_true, y_pred.dtype)
    yt_grad = B_.tf.image.image_gradients(y_true)
    yp_grad = B_.tf.image.image_gradients(y_pred)
    dotprod = B.mean(1-B.sum(y_pred*y_true,axis=-1))
    grad_diff = (yt_grad-yp_grad)
    gerr = B.mean(grad_diff**2,axis=-1)
    return (1-alpha)*dotprod+alpha*gerr

此处 dotprod 运行良好,但 grad_diff 输出如下错误消息:

TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'

我认为 keras 说我应该更改 yp_grad 和 yt_grad 的类型,但我没有得到我应该做的。

我应该添加哪个代码?

标签: pythontensorflowkerasdeep-learning

解决方案


国家的文件tf.image.image_gradients

返回 一对张量 (dy, dx) 持有垂直和水平图像梯度(1 步有限差分)。

该函数返回一个元组。你不能减去元组。

一种可能性是计算 x 和 y 的差异,然后将两个误差相加。

yt_grad = B_.tf.image.image_gradients(y_true)
yp_grad = B_.tf.image.image_gradients(y_pred)
grad_diff_x = (yt_grad[0]-yp_grad[0])
grad_diff_y = (yt_grad[1]-yp_grad[1])
gerr = B.mean(grad_diff_x**2,axis=-1) + B.mean(grad_diff_y**2,axis=-1)

推荐阅读