Правильный способ потери функции - PullRequest
0 голосов
/ 11 мая 2018

Привет. Я пытался реализовать функцию потерь в керасе.Но я не смог придумать способ передать более 2 аргументов, кроме потерь (y_true, y_predict), поэтому я подумал об использовании лямбда-слоя в качестве последнего слоя и выполнении моих вычислений в его лямбда-слое и просто возвращал значение y_predictв такой функции потери

def loss_function(x):
    loss = some calculations
    return loss

def dummy_loss(y_true, y_pred):
    return y_pred

def primary_network():
    global prim_binary_tensor
    x = VGG16(weights='imagenet', include_top=True, input_shape=image_shape)
    last_layer = Dense(k_bit, activation='tanh', name='Dense11')(x.layers[-1].output)
    last_layer, x = basic_model()
    lambda_layer = Lambda(loss_function)([last_layer, prim_binary_tensor])
    model = Model(inputs=[x.input, prim_binary_tensor], outputs=[lambda_layer])
    model.compile(optimizer="adam", loss=dummy_loss,metrics=['accuracy'])
    return model

Итак, мой вопрос:

1) Правильно ли я делаю это, чтобы рассчитать потери?Гарантируется ли, что функция лямбда-слоя вызывается для каждого изображения (input_data)?

2) Может кто-нибудь подсказать мне, как передать несколько аргументов в функцию потерь?

3) Можетконечный результат функции потерь - скаляр или вектор или матрица?

1 Ответ

0 голосов
/ 11 мая 2018

Ответы на ваши вопросы:

  1. Я не знаю, работает ли ваш подход, но есть более простое решение.

  2. Вы можете передать несколько аргументов, определив частичную функцию.

  3. Выход функции потерь - скаляр.

Вот пример, который демонстрирует, как передать несколько аргументов в функцию потерь:

from keras.layers import Input, Dense
from keras.models import Model
import keras.backend as K


def custom_loss(arg1, arg2):
    def loss(y_true, y_pred):
        # Use arg1 and arg2 here as you wish and return loss
        # For example:
        return K.mean(y_true - y_pred) + arg1 + arg2
    return loss

x = Input(shape=(1,))
arg1 = Input(shape=(1,))
arg2 = Input(shape=(1,))
out = Dense(1)(x)
model = Model([x, arg1, arg2], out)
model.compile('sgd', custom_loss(arg1, arg2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...