我正在尝试实现仅在批处理级别评估的损失函数。有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
失败。