Я пытаюсь реализовать функцию потерь, которая должна оцениваться только на уровне партии.Есть 4 класса (c0, c1, c2, c3), но нейронная сеть будет иметь 10 выходов, потому что она не пытается выполнить классификацию.Цель состоит в том, чтобы оптимизировать gSs = (c1+c2-c3)/(2*sqrt(c2 + c0))
в каждой из 10 выходных категорий для каждой партии.Общая потеря составляет 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
Если вместо 10 классов я тренируюсь с 5, то теоретический предел должен быть -sqrt(5*(5**2)) = -8.66
, но я вижу, что потери выходят за пределы -9
, прежде чем стать nan
.Если я возьму среднее для всех категорий, то оно тренируется, но всегда предсказывает одну категорию около 1, а все остальные около 0 с почти идеальной потерей.
Также
assert y_true.shape[1] ==4
не удается.