6 votos

Imponer una condición a la red neuronal

Estoy construyendo un modelo de red neuronal con TensorFlow y Keras en python. Mi modelo se está desempeñando bien en los datos no vistos en la forma que deseo y todo está bien. pero el problema que no tengo ninguna idea de cómo implementar una solución para ello es este: consideremos que mi red neuronal tiene la entrada así

Input = [i1, i2, i3, i4, i5]

y la salida de la red es un solo valor y la llamamos

Output = O

Quiero que la salida de la red neuronal sea mayor que el valor de entrada específico. aquí por ejemplo quiero que O > i3 . a pesar del muy buen desempeño de mi red neuronal en los Datos de Prueba (datos no vistos) pero en algunos casos la condición mencionada será violada y esto es un problema para mí.

13voto

user777 Puntos 10934

Una solución muy sencilla es añadir un término de regularización, de modo que la función de pérdida sea $\text{loss} + \lambda \text{ReLU} (i_3 - O)$ . Esto añade una penalización cada vez que se viola su desigualdad, por lo que el modelo tenderá a respetar la restricción.

Aunque esta solución es inexacta, será más difícil resolverla con exactitud porque la optimización restringida no es algo para lo que las bibliotecas NN estén diseñadas.

Algunas soluciones relacionadas:

Función de pérdida en el aprendizaje automático: ¿cómo limitarla?

9voto

Matt Puntos 6

¿Podría dejar la salida sin restricciones, y luego postprocesar haciendo algo como $O + i3$ ? Incluso puede poner esto directamente en su función de pérdida.

3voto

Inevitable Puntos 93

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.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X