具有多个类别的自定义批次级别损失

时间:2019-05-28 18:27:38

标签: tensorflow keras

我正在尝试实现仅在批处理级别评估的损失函数。有4个类别(c0,c1,c2,c3),但是神经网络将有10个输出,因为它没有尝试进行分类。目的是针对每个批次在10个输出类别的每个类别中优化gSs = (c1+c2-c3)/(2*sqrt(c2 + c0))。总损失为sqrt( gSs_0**2 + gSs_1 **2 + ... + gSs_9**2)

BatchSize为2048

def gS_loss(y_true, y_pred):
    # y_true is (batchSize,4), y_pred is (batchSize, 10)
    c1 = K.sum(K.transpose(K.transpose(y_pred) * y_true[:,1]), axis=0) # sum over all samples in batch
    c2 = K.sum(K.transpose(K.transpose(y_pred) * y_true[:,2]), axis=0) # outshape should be (10)
    c3 = K.sum(K.transpose(K.transpose(y_pred) * y_true[:,3]), axis=0)
    c0 = K.sum(K.transpose(K.transpose(y_pred) * y_true[:,0]), axis=0)
    gSs = (c1+c2-c3)/(2*K.sqrt(c2 + c0) + 0.001)
    gSs = K.clip(gSs, min_value=-5, max_value=5)
    gSs_sqr = K.square(gSs)
    gSs_sqr_sum = K.sum(gSs_sqr) #outshape should be()
    gSsSum = K.sqrt(gSs_sqr_sum)

    return -gSsSum

目前,经过一些训练,它只会给nan造成损失。但是它的损失可能低于理论极限。对于10个目标,理论极限应为-sqrt(10*(5**2)) = -15.81如果我训练的不是5个课,而不是10个班,则理论极限应为-sqrt(5*(5**2)) = -8.66,但我发现损失在成为{{1 }}。 如果我取所有类别的均值,那么它将进行训练,但始终会预测一个类别接近1,其他所有类别接近0,且损失几乎完全。

-9

失败。

0 个答案:

没有答案