Estoy usando Tensorflow v1.1 y he estado tratando de averiguar cómo utilizar mi EMA ed pesos para la inferencia, pero no importa lo que hago no me sale el error

No encontrado: Tecla W/ExponentialMovingAverage no se encuentra en el punto de control

a pesar de que cuando me bucle a través del e imprimir todos los tf.global_variables existe la clave

Aquí es reproducible script muy adaptado de Facenet del de la prueba de unidad:

import tensorflow as tf
import numpy as np
tf.reset_default_graph()
# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but TensorFlow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0), name='W')
b = tf.Variable(tf.zeros([1]), name='b')
y = W * x_data + b
# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
opt_op = optimizer.minimize(loss)
# Track the moving averages of all trainable variables.
ema = tf.train.ExponentialMovingAverage(decay=0.9999)
variables = tf.trainable_variables()
print(variables)
averages_op = ema.apply(tf.trainable_variables())
with tf.control_dependencies([opt_op]):
train_op = tf.group(averages_op)
# Before starting, initialize the variables.  We will 'run' this first.
init = tf.global_variables_initializer()
saver = tf.train.Saver(tf.trainable_variables())
# Launch the graph.
sess = tf.Session()
sess.run(init)
# Fit the line.
for _ in range(201):
sess.run(train_op)
w_reference = sess.run('W/ExponentialMovingAverage:0')
b_reference = sess.run('b/ExponentialMovingAverage:0')
saver.save(sess, os.path.join("model_ex1"))
tf.reset_default_graph()
tf.train.import_meta_graph("model_ex1.meta")
sess = tf.Session()
print('------------------------------------------------------')
for var in tf.global_variables():
print('all variables: ' + var.op.name)
for var in tf.trainable_variables():
print('normal variable: ' + var.op.name)
for var in tf.moving_average_variables():
print('ema variable: ' + var.op.name)
print('------------------------------------------------------')
mode = 1
restore_vars = {}
if mode == 0:
ema = tf.train.ExponentialMovingAverage(1.0)
for var in tf.trainable_variables():
print('%s: %s' % (ema.average_name(var), var.op.name))
restore_vars[ema.average_name(var)] = var
elif mode == 1:
for var in tf.trainable_variables():
ema_name = var.op.name + '/ExponentialMovingAverage'
print('%s: %s' % (ema_name, var.op.name))
restore_vars[ema_name] = var
saver = tf.train.Saver(restore_vars, name='ema_restore')
saver.restore(sess, os.path.join("model_ex1")) # error happens here!
w_restored = sess.run('W:0')
b_restored = sess.run('b:0')
print(w_reference)
print(w_restored)
print(b_reference)
print(b_restored)
InformationsquelleAutor YellowPillow | 2017-07-19

2 Comentarios

  1. 8

    La key not found in checkpoint de error significa que la variable existe en el modelo de la memoria, pero no en el serializado archivo de punto de control en el disco.

    Debe utilizar el inspect_checkpoint herramienta para entender lo que los tensores se guardan en su puesto de control, y por qué algunas medias móviles exponenciales no se guardan aquí.

    No está claro a partir de su repro ejemplo de la línea que se supone que es para desencadenar el error

    • Hola gracias, definitivamente, voy a echar un vistazo a que tuvo, también he actualizado mi pregunta!
    • Creo que puedo ver donde el error puede venir de. Usted está inicializando el protector con sólo el entrenable variables. Trate de un defecto-construido de ahorro. La media móvil de las variables no se aprende para no acabar en el punto de control.
    • ¿A qué te refieres por defecto, construido protector?
    • Hacer tf.train.Saver() en lugar de tf.train.Saver(tf.trainable_variables())
    • Para personas no familiarizadas con la mencionada herramienta. Una descripción puede encontrarse en el Tensorflow docs
  2. 5

    Me gustaría añadir un método a utilizar la formación de variables en el punto de control en el mejor.

    Tenga en cuenta que todas las variables en el protector de var_list debe estar contenida en el punto de control que se ha configurado. Usted puede comprobar aquellos en los saver por:

    print(restore_vars)

    y las variables en el punto de control por:

    vars_in_checkpoint = tf.train.list_variables(os.path.join("model_ex1"))

    en su caso.

    Si el restore_vars están todos incluidos en vars_in_checkpoint entonces no va a aumentar el error, de lo contrario inicializar todas las variables primero:

    all_variables = tf.get_collection_ref(tf.GraphKeys.GLOBAL_VARIABLES)
    sess.run(tf.variables_initializer(all_variables))

    Todas las variables se inicializan serán aquellas que estén o no en el puesto de control, a continuación, puede filtrar esas variables en restore_vars que no están incluidas en el punto de control(supongamos que todas las variables con ExponentialMovingAverage en sus nombres no están en el punto de control):

    temp_saver = tf.train.Saver(
    var_list=[v for v in all_variables if "ExponentialMovingAverage" not in v.name])
    ckpt_state = tf.train.get_checkpoint_state(os.path.join("model_ex1"), lastest_filename)
    print('Loading checkpoint %s' % ckpt_state.model_checkpoint_path)
    temp_saver.restore(sess, ckpt_state.model_checkpoint_path)

    Esto puede ahorrar algo de tiempo en comparación con el modelo de formación a partir de cero. (En mi caso la restaurada variables de hacer ninguna mejora significativa en comparación con el entrenamiento desde el principio en el principio, ya que todos los viejos optimizador de variables son abandonados. Pero puede acelerar el proceso de optimización significativamente, creo, porque es como la preformación de algunas variables)

    De todos modos, algunas de las variables son útiles para ser restaurado como incrustaciones y algunas capas y etc.

Dejar respuesta

Please enter your comment!
Please enter your name here