Forma correcta de la función de pérdida

Hola, he estado tratando de implementar una función de pérdida en keras. Pero no pude encontrar una manera de pasar más de 2 argumentos distintos a la pérdida (y_true, y_predict), así que pensé en usar una capa lambda como la última capa y hacer mi cálculo en la capa lambda y simplemente devolver el valor de y_predict en función de pérdida como esta

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 

Así que mi pregunta es:

1) ¿Lo estoy haciendo de la manera correcta para calcular la pérdida? ¿Se garantiza que se llame a la función de capa lambda para todas y cada una de las imágenes (input_data)?

2) ¿Puede alguien sugerirme cómo pasar múltiples argumentos a una función de pérdida?

3) ¿El resultado final de una función de pérdida puede ser un escalar o tiene que ser un vector o una matriz?

Respuestas a tus preguntas:

  1. No sé si su enfoque funciona, pero hay una solución más fácil.

  2. Puedes pasar varios argumentos definiendo una función parcial.

  3. La salida de una función de pérdida es un escalar.

Aquí hay un ejemplo que muestra cómo pasar múltiples argumentos a una función de pérdida:

 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))