Estoy entrenando 2 codificadores automáticos con 2 rutas de entrada separadas en conjunto y me gustaría establecer aleatoriamente una de las rutas de entrada en cero.
Uso tensorflow con keras backend (API funcional).
Estoy calculando una pérdida conjunta (suma de dos pérdidas) para retropropagación.
A -> A' & B ->B'
pérdida => l2(A,A')+l2(B,B')
Las redes que toman A y B están conectadas en el espacio latente. Me gustaría establecer aleatoriamente A o B en cero y calcular la pérdida solo en la ruta correspondiente, lo que significa que si la ruta de entrada A se establece en cero, la pérdida se calculará solo usando las salidas de la ruta B y viceversa; p.ej:
0 -> A' & B ->B'
pérdida: l2(B,B')
¿Cómo configuro aleatoriamente la ruta de entrada a cero? ¿Cómo escribo una devolución de llamada que hace esto?
Tal vez intente lo siguiente:
import random def decision(probability): return random.random() < probabilityDefina un método que tome una decisión aleatoria basada en una cierta probabilidad x y haga que su cálculo de pérdida dependa de esta decisión.
if current_epoch == random.choice(epochs): keep_mask = tf.ones_like(A.input, dtype=float32) throw_mask = tf.zeros_like(A.input, dtype=float32) if decision(probability=0.5): total_loss = tf.reduce_sum(reconstruction_loss_a * keep_mask + reconstruction_loss_b * throw_mask) else: total_loss = tf.reduce_sum(reconstruction_loss_a * throw_mask + reconstruction_loss_b * keep_mask) else: total_loss = tf.reduce_sum(reconstruction_loss_a + reconstruction_loss_b) Supongo que no desea establecer una de las rutas en cero cada vez que actualice los parámetros de su modelo, ya que existe el riesgo de que uno o incluso ambos modelos no estén suficientemente capacitados. También tenga en cuenta que uso la entrada de A para crear tensores zero_like y one_like ya que asumo que ambas entradas tienen la misma forma; si este no es el caso, se puede ajustar fácilmente.
Dependiendo de cuál sea su objetivo, también puede considerar reemplazar su entrada de A o B con un tensor aleatorio, por ejemplo, tf.random.normal basado en una decisión aleatoria. Esto crea ruido en su modelo, lo que puede ser deseable, ya que su modelo se vería obligado a buscar en el espacio latente para intentar reconstruir su entrada original. Esto significa precisamente que aún calcula su pérdida de reconstrucción con A.input y A.output , pero en realidad su modelo nunca recibió A.input , sino el tensor aleatorio.
Tenga en cuenta que esta respuesta sirve como un ejemplo conceptual simple. Puede encontrar un ejemplo de trabajo con Tensorflow aquí .
Puede establecer una entrada en 0 simplemente:
A = A*random.choice([0,1])Este código se puede utilizar dentro de una función de pérdida