Neural network 如何在Keras中为序列模型实现损失函数(联合交集)?

Neural network 如何在Keras中为序列模型实现损失函数(联合交集)?,neural-network,keras,deep-learning,conv-neural-network,Neural Network,Keras,Deep Learning,Conv Neural Network,IoU是一个损失函数,需要最大化而不是最小化。以下是我尝试过的,但无法访问max函数中的参数值: def bb_交叉点(boxA,boxB): #确定相交矩形的(x,y)-坐标 xA=最大值(boxA[0],boxB[0])#这些行中的错误 yA=最大值(框A[1],框B[1]) xB=最小值(框A[2],框B[2]) yB=min(框A[3],框B[3]) #计算相交矩形的面积 区间=最大值(0,xB-xA+1)*最大值(0,yB-yA+1) #计算预测面积和地面真实面积 #矩形 boxAAr

IoU是一个损失函数,需要最大化而不是最小化。以下是我尝试过的,但无法访问max函数中的参数值:

def bb_交叉点(boxA,boxB):
#确定相交矩形的(x,y)-坐标
xA=最大值(boxA[0],boxB[0])#这些行中的错误
yA=最大值(框A[1],框B[1])
xB=最小值(框A[2],框B[2])
yB=min(框A[3],框B[3])
#计算相交矩形的面积
区间=最大值(0,xB-xA+1)*最大值(0,yB-yA+1)
#计算预测面积和地面真实面积
#矩形
boxAArea=(boxA[2]-boxA[0]+1)*(boxA[3]-boxA[1]+1)
boxBArea=(boxB[2]-boxB[0]+1)*(boxB[3]-boxB[1]+1)
#通过获取交点计算并集上的交点
#面积并除以预测值+地面真实值之和
#面积-兴趣区
iou=区域间/浮动(boxAArea+boxBArea-区域间)
#返回与并集值的交点
归还欠条
这是我在网上找到的一个代码:(这行吗?看起来不像借条

将numpy导入为np
def计算(y_pred_批,y_true_批):
返回np.mean(np.asarray([像素精度(y_pred_批次[i],y_true_批次[i]))
对于范围内的i(len(y\u true\u batch))])
定义像素精度(y_pred,y_true):
y_pred=np.argmax(np.reformate)(y_pred,
[N_类\u PASCAL,img_行,img_列]),轴=0)
y_真=np.argmax(np.reformate)(y_真,
[N_类\u PASCAL,img_行,img_列]),轴=0)
y_pred=y_pred*(y_true>0)
返回1.0*np.sum((y_pred==y_true)*(y_true>0))/np.sum(y_true>0)

如果您对像素(不是框)进行预测,并且值介于0和1之间。(对于单个类,存在/不存在)

您的函数已调整(我不知道它是否正常工作,存在风险或没有梯度,因为交点=常数0)


如果您对像素(不是框)有预测,并且值介于0和1之间。(对于单个类,存在/不存在)

您的函数已调整(我不知道它是否正常工作,存在风险或没有梯度,因为交点=常数0)

def iou(true, pred):

    intersection = true * pred

    notTrue = 1 - true
    union = true + (notTrue * pred)

    return K.sum(intersection)/K.sum(union)
def iou(boxA,boxB):

    xA = K.stack([boxA[:,0], boxB[:,0]], axis=-1)
    yA = K.stack([boxA[:,1], boxB[:,1]], axis=-1)
    xB = K.stack([boxA[:,2], boxB[:,2]], axis=-1)
    yB = K.stack([boxA[:,3], boxB[:,3]], axis=-1)

    xA = K.max(xA, axis=-1)
    yA = K.max(yA, axis=-1)
    xB = K.min(xB, axis=-1)
    yB = K.min(yB, axis=-1)

    interX = K.zeros_like(xB)
    interY = K.zeros_like(yB)

    interX = K.stack([interX, xB-xA + 1], axis=-1)
    interY = K.stack([interY, yB-yA + 1], axis=-1)

    #because of these "max", interArea may be constant 0, without gradients, and you may have problems with no gradients. 
    interX = K.max(interX, axis=-1)
    interY = K.max(interY, axis=-1)
    interArea = interX * interY

    boxAArea = (boxA[:,2] - boxA[:,0] + 1) * (boxA[:,3] - boxA[:,1] + 1)    
    boxBArea = (boxB[:,2] - boxB[:,0] + 1) * (boxB[:,3] - boxB[:,1] + 1) 

    iou = interArea / (boxAArea + boxBArea - interArea)

    return iou