Пользовательская функция потерь в Keras на основе входных данных - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь создать пользовательскую функцию потерь, используя Keras.Я хочу вычислить функцию потерь на основе входных данных и прогнозируемых выходных данных нейронной сети.

Я пытался использовать функцию customloss в Keras.Я думаю, что y_true - это вывод, который мы даем для обучения, а y_pred - это прогнозируемый вывод нейронной сети.Приведенная ниже функция потерь аналогична потере "mean_squared_error" в Keras.

def customloss(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

Я хотел бы использовать вход в нейронную сеть также для вычисления пользовательской функции потерь в дополнение к mean_squared_error loss.Есть ли способ отправить вход в нейронную сеть в качестве аргумента функции customloss.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Я нашел 2 решения поставленного вами вопроса.

  1. Вы можете передать свой входной тензор в качестве аргумента пользовательской функции оболочки потерь.
    def custom_loss(i):

        def loss(y_true, y_pred):
            return K.mean(K.square(y_pred - y_true), axis=-1) + something with i...
        return loss

    def baseline_model():
        # create model
        i = Input(shape=(5,))
        x = Dense(5, kernel_initializer='glorot_uniform', activation='linear')(i)
        o = Dense(1, kernel_initializer='normal', activation='linear')(x)
        model = Model(i, o)
        model.compile(loss=custom_loss(i), optimizer=Adam(lr=0.0005))
        return model

Это решение также упоминается в принятом ответе здесь

Вы можете дополнить свою метку дополнительными столбцами данных из ввода и записать пользовательские потери.Это полезно, если вы просто хотите, чтобы один / несколько столбцов функций были введены из вашего ввода.
    def custom_loss(data, y_pred):

        y_true = data[:, 0]
        i = data[:, 1]
        return K.mean(K.square(y_pred - y_true), axis=-1) + something with i...


    def baseline_model():
        # create model
        i = Input(shape=(5,))
        x = Dense(5, kernel_initializer='glorot_uniform', activation='linear')(i)
        o = Dense(1, kernel_initializer='normal', activation='linear')(x)
        model = Model(i, o)
        model.compile(loss=custom_loss, optimizer=Adam(lr=0.0005))
        return model


    model.fit(X, np.append(Y_true, X[:, 0], axis =1), batch_size = batch_size, epochs=90, shuffle=True, verbose=1)

Это решение также можно найти здесь, в этой теме .

Я использовал 2-й метод, только когда мне пришлось использовать входные столбцы объектов в потере.Я использовал первый метод со скалярными аргументами;но я верю, что тензорный ввод тоже работает.

1 голос
/ 01 апреля 2019

Вы можете обернуть свой пользовательский убыток другой функцией, которая принимает входной тензор в качестве аргумента:

def customloss(x):
    def loss(y_true, y_pred):
        # Use x here as you wish
        err = K.mean(K.square(y_pred - y_true), axis=-1)
        return err

    return loss

, а затем скомпилировать свою модель следующим образом:

model.compile('sgd', customloss(x))

где x - ваш входной тензор.

ПРИМЕЧАНИЕ : не тестировалось.

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