Умножьте выходы пользовательские функции потерь - PullRequest
0 голосов
/ 27 сентября 2019

Итак, мой вопрос, если у меня есть что-то вроде:

model = Model(inputs = input, outputs = [y1,y2])

model.compile(loss = my_loss ...) 

Я видел только my_loss в качестве словаря независимых потерь, и тогда окончательная потеря определяется как сумма этих,Но могу ли я определить в многозадачной модели функцию потерь, которая принимает все прогнозируемые / истинные значения, а затем я могу умножить их (например)?

Это потеря, которую я пытаюсь определить:

def my_loss(y_true1, y_true2, y_pred1, y_pred2):
   final_loss = binary_crossentropy(y_true1, y_pred1) + y_true1 * categorical_crossentropy(y_true2, y_pred2)
   return final_loss

Обычно ваши параметры имеют значение y_true, y_pred в функции потерь, где y_pred равно y1 или y2.Но теперь мне нужно и то, и другое вычислить потери, так как я могу определить эту функцию потерь и передать все параметры этой функции: y_true1, y_true2, y_pred1, y_pred2.

Моя текущая модель, в которой я хочу изменить свою потерю:

x = Input(shape=(n, ))
shared = Dense(32)(x)
sub1 = Dense(16)(shared)
sub2 = Dense(16)(shared)
y1 = Dense(1)(sub1, activation='sigmoid')
y2 = Dense(4)(sub2, activation='softmax')

model = Model(inputs = input, outputs = [y1,y2])

model.compile(loss = ['binary_crossentropy', 'categorical_crossentropy'] ...) #THIS LINE I WANT TO CHANGE IT

Спасибо!

1 Ответ

0 голосов
/ 27 сентября 2019

Я не уверен, правильно ли я понимаю, но попробую.

Функция потерь должна содержать как прогнозируемые, так и фактические данные - это способ измерить ошибку между тем, чтоваша модель предсказывает и достоверные данные.Однако прогнозируемые и фактические данные не обязательно должны быть одномерными.Вы можете сделать y_pred тензором, который содержит y_pred1 и y_pred2.Аналогично, y_true может быть тензором, который содержит y_true1 и y_true2.

Насколько я знаю, функции потерь должны возвращать одно число.Вот почему функции потерь часто имеют среднее значение или сумму для суммирования всех потерь для отдельных точек данных.

Вот пример среднеквадратичной ошибки, которая будет работать более чем на 1D:

import keras.backend as K

def my_loss(y_true, y_pred):
    # this example is mean squared error
    # works if if y_pred and y_true are greater than 1D
    return K.mean(K.square(y_pred - y_true))

Вот еще один пример функции потерь, которая, я думаю, ближе к вашему вопросу (хотя я не могу прокомментировать, является ли она хорошей функцией потерь):

def my_loss(y_true, y_pred):
    # calculate mean(abs(y_pred1*y_pred2 - y_true1*ytrue2)) 
    # this will work for 2D inputs of y_pred and y_true
    return K.mean(K.abs(K.prod(y_pred, axis = 1) - K.prod(y_true, axis = 1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...