尝试创建可解释“类距离”的自定义keras损失函数

时间:2019-10-31 06:40:17

标签: python tensorflow keras

我正在尝试编写一个ResNet,它可以获取数据图像并尝试从该事件中猜测一个连续变量(在这种情况下为能量)。为此,我有点搞错了类的定义:网络输出100个“类”的向量,这些向量实际上只是0-1000能量单位(MeV)中均匀分布的能量仓,因此每个能量仓的宽度为10 MeV。因此,我想编写一个自定义损失函数,使得即使网络在离正确能量仓较远的能量仓中输出高概率的情况下,也要比即使高概率能量仓更接近正确能量仓的情况下惩罚更严厉,即使在两种情况下,高概率垃圾箱都是“错误的”。这是我针对单个图像想到的第一个通过丢失功能:

Loss

在这里,带帽子的i表示真实能量箱。我在Keras背景中实现此功能时遇到了一些麻烦。具体来说,我找不到仅使用keras.backend函数来实现平方差平方的方法,尤其是在未知训练批次大小的情况下。在numpy / for循环语言中,如果M是已知的批次大小,而bin是网络输出中的能量仓(aka类)的数量,那么我将这样写:

def customLoss(yTrue,yPred):
    # yTrue and yPred have dimension (M,bins)
    trueBinVec = np.argmax(yTrue,axis=-1) # dimension (M)
    trueBinArr = np.ones((M,bins))
    binsArr = np.ones((M,bins))
    for m in range(M): 
        trueBinArr[m] *= trueBinVec[m]
        binsArr[m] = np.arange(bins)
    binDifTensor = (trueBinsArr - binsArr)**2
    finalTensor = np.multiply((yTrue-yPred)**2,binDifTensor)
    return np.mean(finalTensor,axis=-1) # this would return a tensor of shape (M) containing the loss for each image in the batch

问题是我无法预先获得批处理大小,因此难以创建binDifTensor,而我无法将其与keras后端中的传统均方误差张量进行元素化乘积。将感谢有关如何使用keras.backend函数实现此建议的任何建议!谢谢

0 个答案:

没有答案