¿Es posible hacer que una variable entrenable no entrenable?


He creado un entrenable variable en un ámbito. Más tarde, ingresé el mismo ámbito, establecí el ámbito en reuse_variables y usé get_variable para recuperar la misma variable. Sin embargo, no puedo establecer la propiedad trainable de la variable en False. Mi get_variable línea es como:

weight_var = tf.get_variable('weights', trainable = False)

Pero la variable 'weights' todavía está en la salida de tf.trainable_variables.

¿Puedo establecer la bandera trainable de una variable compartida en False usando get_variable?

La razón por la que quiero hacer esto es que estoy tratando de reutilizar el filtros de bajo nivel preentrenados desde VGG net en mi modelo, y quiero construir el gráfico como antes, recuperar la variable weights y asignar valores de filtro VGG a la variable weight, y luego mantenerlos fijos durante el siguiente paso de entrenamiento.

Author: nbro, 2016-05-19

2 answers

Después de mirar la documentación y el código, no pude encontrar una manera de eliminar una Variable de TRAINABLE_VARIABLES.

Esto es lo que sucede:{[17]]}
  • La primera vez que se llama tf.get_variable('weights', trainable=True), la variable se agrega a la lista de TRAINABLE_VARIABLES.
  • La segunda vez que llamas a tf.get_variable('weights', trainable=False), obtienes la misma variable, pero el argumento trainable=False no tiene efecto, ya que la variable ya está presente en la lista de TRAINABLE_VARIABLES (y no hay forma de eliminarla de allí)

Primera solución

Al llamar al método minimize del optimizador (ver doc.), puede pasar un var_list=[...] como argumento con las variables que desea optimizar.

Por ejemplo, si desea congelar todas las capas de VGG excepto las dos últimas, puede pasar los pesos de las dos últimas capas en var_list.

Segunda solución

Puede usar un tf.train.Saver() para guardar variables y restaurarlas más tarde (ver esto tutorial ).

  • Primero entrenas todo tu modelo VGG con todas las variables entrenables. Los guarda en un archivo de punto de control llamando a saver.save(sess, "/path/to/dir/model.ckpt").
  • Luego (en otro archivo) entrena la segunda versión con variables no entrenables. Carga las variables previamente almacenadas con saver.restore(sess, "/path/to/dir/model.ckpt").

Opcionalmente, puede decidir guardar solo algunas de las variables en su archivo de punto de control. Ver el doc para más información.

 22
Author: Olivier Moindrot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 18:46:24

Cuando desea entrenar u optimizar solo ciertas capas de una red preentrenada, esto es lo que necesita saber.

El método minimize de TensorFlow toma un argumento opcional var_list, una lista de variables a ajustar a través de la propagación inversa.

Si no especifica var_list, cualquier variable TF en el gráfico podría ser ajustada por el optimizador. Cuando se especifican algunas variables en var_list, TF mantiene constantes todas las demás variables.

Aquí hay un ejemplo de un script que jonbruner y su colaborador han utilizado.

tvars = tf.trainable_variables()
g_vars = [var for var in tvars if 'g_' in var.name]
g_trainer = tf.train.AdamOptimizer(0.0001).minimize(g_loss, var_list=g_vars)

Esto encuentra todas las variables que definieron anteriormente que tienen "g_" en el nombre de la variable, las pone en una lista y ejecuta el optimizador ADAM en ellas.

Puede encontrar las respuestas relacionadas aquí en Quora

 4
Author: rocksyne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-13 13:09:03