¿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.
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
tf.get_variable('weights', trainable=True)
, la variable se agrega a la lista de TRAINABLE_VARIABLES
.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í)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.
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
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