research recognition examples tensorflow pre-trained-model

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 de TRAINABLE_VARIABLES .
  • La segunda vez que llama tf.get_variable(''weights'', trainable=False) , obtiene la misma variable pero el argumento trainable=False no tiene ningún efecto ya que la variable ya está presente en la lista de TRAINABLE_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 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.