¿Cómo congelar dinámicamente pesos después de comstackr el modelo en Keras?

Me gustaría entrenar un GAN en Keras. Mi objective final es BEGAN, pero estoy empezando por el más simple. Entender cómo congelar pesos adecuadamente es necesario aquí y con eso estoy luchando.

Durante el tiempo de entrenamiento del generador, los pesos discriminadores pueden no actualizarse. Me gustaría congelar y descongelar el discriminador alternativamente para el generador de entrenamiento y el discriminador alternativamente. El problema es que establecer el parámetro entrenable en falso en el modelo discriminador o incluso en sus ‘pesos’ no detiene el modelo para entrenar (y los pesos para actualizar). Por otro lado, cuando compilo el modelo después de establecerlo en Falso, las ponderaciones se vuelven inestables . No puedo comstackr el modelo después de cada iteración porque eso niega la idea de un entrenamiento completo.

Debido a ese problema, parece que muchas implementaciones de Keras tienen errores o funcionan debido a algún truco no intuitivo en una versión anterior o algo así.

He probado este código de ejemplo hace un par de meses y funcionó: https://github.com/fchollet/keras/blob/master/examples/mnist_acgan.py

No es la forma más simple de GAN, pero por lo que recuerdo, no es demasiado difícil eliminar la pérdida de clasificación y convertir el modelo en un GAN.

No es necesario activar / desactivar la propiedad entrenable del discriminador y recomstackrla. Simplemente cree y compile dos objetos modelo, uno con trainable=True ( discriminator en el código) y otro con trainable=False ( combined en el código).

Cuando actualice el discriminador, llame a discriminator.train_on_batch() . Cuando esté actualizando el generador, llame a combined.train_on_batch() .

¿Se puede usar tf.stop_gradient para congelar condicionalmente los pesos?

Tal vez su red adversarial (generador más discriminador) esté escrita en ‘Modelo’. Sin embargo, incluso si configura d.trainable = False , la red d independiente se establece como no entrenable, pero la d en toda la red de confrontación aún es entrenable.

Puede usar d_on_g.summary () antes de esa fecha, después de establecer d.trainable = False y sabría a qué me refiero (preste atención a las variables entrenables).