Quiero cargar un modelo pre-entrenado (optimizado por AdadeltaOptimizer) y continuar entrenando con SGD (GradientDescentOptimizer). Los modelos se guardan y cargan con tensorlayer API:

Guardar modelo:

import tensorlayer as tl
tl.files.save_npz(network.all_params,
                  name=model_dir + "model-%d.npz" % global_step)

Modelo de carga:

load_params = tl.files.load_npz(path=resume_dir + '/', name=model_name)
tl.files.assign_params(sess, load_params, network)

Si continúo entrenando con adadelta, la pérdida de entrenamiento (entropía cruzada) se ve normal (comience en un valor cercano como el modelo cargado). Sin embargo, si cambio el optimizador a SGD, la pérdida de entrenamiento sería tan grande como un modelo recién inicializado.

Eché un vistazo al archivo model-xxx.npz de tl.files.save_npz. Solo guarda todos los parámetros del modelo como ndarray. No estoy seguro de cómo está involucrado el optimizador o la tasa de aprendizaje aquí.

4
Irene W. 23 jun. 2017 a las 02:19

3 respuestas

La mejor respuesta

Probablemente tendría que importar el tensor en una variable que es la función de pérdida / entropía cruzada que alimenta su Adam Optimizer anteriormente . Ahora, solo alimente a través de su optimizador SGD.

saver = tf.train.import_meta_graph('filename.meta')
saver.restore(sess,tf.train.latest_checkpoint('./'))
graph = tf.get_default_graph()
cross_entropy = graph.get_tensor_by_name("entropy:0") #Tensor to import

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

En este caso, he etiquetado el Tensor de entropía cruzada antes de entrenar mi modelo de preentrenamiento con el nombre entropy, como tal

tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv), name = 'entropy')

Si no puede realizar cambios en su modelo de preentrenamiento, puede obtener la lista de tensores en su modelo (después de haberlo importado) de graph y deducir qué tensor necesita. No tengo experiencia con Tensorlayer, por lo que esta guía es para proporcionar una mayor comprensión. Puede echar un vistazo a Tensorlayer-Layers, deberían explicar cómo para obtener su tensor. Como Tensorlayer está construido sobre Tensorflow, la mayoría de las funciones aún deberían estar disponibles.

2
Joshua Lim 27 jun. 2017 a las 02:26

https://tensorlayer.readthedocs.io/en/latest/user/get_start_advance.html#pre-trained-cnn

vgg = tl.models.vgg16(pretrained=True)
img = tl.vis.read_image('data/tiger.jpeg')
img = tl.prepro.imresize(img, (224, 224)).astype(np.float32) / 255
output = vgg(img, is_train=False)

Para la versión 2.0, use esto

0
zsdh 8 ago. 2019 a las 03:19

Puede especificar los parámetros que desea guardar en su archivo de punto de control.

save_npz([save_list, name, sess])

En save_list solo especifica los parámetros de red que no contienen los parámetros del optimizador, por lo tanto, no hay tasa de aprendizaje ni ningún otro parámetro del optimizador.

Si desea guardar la tasa de aprendizaje actual (para usar la misma tasa de aprendizaje exacta cuando restaure el modelo) debe agregarla a save_list, así:

save_npz(network.all_params.extend([learning_rate])

(Supongo que all_params es una matriz, supongo que mi suposición es correcta.

Como desea cambiar el optimizador, le sugiero que guarde learning_rate solo como parámetro del optimizador y no cualquier otra variable que el optimizador cree. De esa manera, podrá cambiar el optimizador y restaurar el modelo; de lo contrario (si coloca en su punto de control cualquier otra variable), el gráfico que intentará restaurar no encontrará las variables en las que colocará el valor guardado y no podrás cambiarlo.

1
nessuno 23 jun. 2017 a las 07:18