Пользовательская потеря уровня пакета с несколькими классами - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь реализовать функцию потерь, которая должна оцениваться только на уровне партии.Есть 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

не удается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...