# Key <variable_name> no se encuentra en el punto de control Tensorflow

2
1

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

``````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))
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 Kommentare

1. 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. 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)