keras中的自定义损失函数会忽略框外模型的预测值

时间:2019-04-15 16:16:10

标签: python tensorflow keras deep-learning

我正在使用U-Net样式神经网络进行定义的分割和骰子损失工作

def dice_loss(y_true, y_pred):
    smooth = 1.
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = y_true_f * y_pred_f
    score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
    return 1. - score

但是,我只想在地面真实分割周围的像素上训练该模型。一种方法是在分割上放置一个框,然后从分割中制作出新图像,然后使用此类图像进行训练。但是,在这种情况下会丢失很多背景上下文。更好的方法是形成一个损失函数,该函数仅对拟合在真实情况下的框周围的预测进行惩罚,而忽略该框外的网络给我们提供的值。为此,我尝试了以下损失函数,但不适用于张量。以下是我未成功的尝试。有什么方法可以调整它以使其正常工作吗?

def getbound(a):
        min_x=10000
        min_y=10000
        max_x=-1
        max_y=-1
        rows=a.shape[0]
        cols=a.shape[1]
        for y in range(0, rows):
                for x in range(0, cols):
                        if(a[y,x]>0):
                                if(x>max_x):
                                        max_x=x
                                if(y>max_y):
                                        max_y=y
                                if(x<min_x):
                                        min_x=x
                                if(y<min_y):
                                        min_y=y
        return[min_x,min_y,max_x,max_y]

def box_dice_loss(y_true, y_pred):
    smooth = 1.
    padding=32
    print(y_true.shape)
    [min_x,min_y,max_x,max_y]=getbound(y_true)
    min_x-=padding
    min_y-=padding
    max_x+=padding
    max_y+=padding
    rows=y_true.shape[0]
    cols=y_true.shape[1]
    for y in range(0, rows):
        for x in range(0, cols):
            if(y<min_y or y>max_y or x<min_x or x>max_x):
                y_pred[y,x]=y_true[y,x]
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = y_true_f * y_pred_f
    score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
    return 1. - score

当前错误是当网络初始化张量时,没有任何定义的形状,所以我得到了这个输出

使用TensorFlow后端。 (?,?,?,?)在getbound中     对于范围(0行)中的y:TypeError:索引返回了非int(类型NoneType)

0 个答案:

没有答案