recognition - tensorflow object detection
¿Es posible hacer que una variable entrenable no sea entrenable? (2)
He creado una variable entrenable en un ámbito. Más tarde, reuse_variables
en el mismo ámbito, configuré el ámbito para reuse_variables
y usé get_variable
para recuperar la misma variable. Sin embargo, no puedo establecer la propiedad entrenable de la variable en False
. Mi línea get_variable
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 un indicador trainable
una variable compartida en False
usando get_variable
?
La razón por la que quiero hacer esto es que estoy tratando de reutilizar los filtros de bajo nivel entrenados previamente de VGG net en mi modelo, y quiero crear el gráfico como antes, recuperar la variable de pesos y asignar valores de filtro VGG a la variable de peso, y luego manténgalos fijos durante el siguiente paso de entrenamiento.
Cuando quiera entrenar u optimizar solo ciertas capas de una red pre-entrenada, esto es lo que necesita saber.
El método de minimize
de TensorFlow toma un argumento opcional var_list
, una lista de variables que se ajustarán mediante la propagación hacia atrás.
Si no especifica var_list
, el optimizador podría ajustar cualquier variable de TF en el gráfico. Cuando especifica 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 usado.
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 coloca en una lista y ejecuta el optimizador ADAM en ellas.
Puedes encontrar las respuestas relacionadas aquí en Quora
Después de ver la documentación y el código, no pude encontrar una manera de eliminar una Variable de las TRAINABLE_VARIABLES
.
Esto es lo que pasa:
- La primera vez que se
tf.get_variable(''weights'', trainable=True)
, la variable se agrega a la lista deTRAINABLE_VARIABLES
. - La segunda vez que llama
tf.get_variable(''weights'', trainable=False)
, obtiene la misma variable pero el argumentotrainable=False
no tiene ningún efecto ya que la variable ya está presente en la lista deTRAINABLE_VARIABLES
(y no hay manera de sacarlo de allí)
Primera solucion
Al llamar al método de 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 solucion
Puede usar un tf.train.Saver()
para guardar variables y restaurarlas más tarde (consulte este tutorial ).
- Primero entrenas tu modelo VGG completo 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 .
saver.restore(sess, "/path/to/dir/model.ckpt")
las variables previamente almacenadas consaver.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.