Después de dedicar un buen tiempo, finalmente encontré como implementar la solución en la librería keras/tensorflow teniendo en cuenta las respuestas útiles anteriores a mi pregunta. En primer lugar si queremos implementar una función de pérdida de keras traje con algunos parámetros y también el acceso a las entradas que tenemos que definir:
def custom_loss(alpha):
def loss(data, y_pred):
y_true = tf.reshape(data[:, 0], (-1, 1))
input = tf.reshape(data[:, 1], (-1, 1))
diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true), K.epsilon(),
None))
return 100. * K.mean(diff, axis=-1) +
K.mean(alpha*tf.keras.activations.relu(input - y_pred))
aquí he rellenado las entradas en el lado derecho del tensor de salida y luego dentro de la función la he reempaquetado para acceder a las entradas. aquí he utilizado el error porcentual medio absoluto como función de pérdida base y luego he añadido la condición deseada con la ayuda del parámetro alfa como parámetro de regularización y la función Relu. ten en cuenta que debes utilizar la columna derecha de tus datos de entrada en esta función entonces si queremos construir un modelo de red neural hay que usar los siguientes códigos. primero rellenamos la entrada a nuestra salida fácilmente como sigue:
output_train = np.append(y_train, x_train, axis =1)
output_valid = np.append(y_valid, x_valid, axis =1)
en la función de compilación:
model.compile(loss = custom_loss(alpha=10000))
aquí usé 10000 como alfa y es obvio que se puede cambiar según el caso. ahora podemos ajustar el modelo en nuestros datos. pero hay otro problema cuando queremos cargar el modelo guardado. si queremos cargar el modelo tenemos que usar el siguiente código
model = keras.models.load_model(model_save_address, custom_objects={'loss': custom_loss(10000)})
ahora todo está bien y podemos ejecutar nuestro modelo y entrenarlo y probarlo fácilmente en nuestros datos.
NOTA : En primer lugar agradezco a todas las personas que me ayudaron a resolver el problema. Creo que vale la pena señalar que antes de resolver el problema a pesar de tener el buen modelo que funciona bien con un error muy bajo en mis datos, en el 50% de los casos mi condición deseada había sido violada y que era un problema para mí. pero después de la aplicación de esta solución, sólo en 0,5% de los casos la condición no se satisface y espero encontrar otra solución para reducir aún más.