Touche <variable_name> pas trouvé de point de contrôle Tensorflow
Je suis en utilisant Tensorflow v1.1 et j'ai été à essayer de comprendre comment utiliser mon EMA ed poids pour l'inférence, mais peu importe ce que je fais, je reçois l'erreur
Pas trouvé: Touche W/ExponentialMovingAverage pas trouvé de point de contrôle
même si, quand j'parcourir et d'imprimer tous les tf.global_variables
la clé existe
Ici est reproductible script fortement adapté à partir de Facenet de l' de test de l'unité:
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)
OriginalL'auteur YellowPillow | 2017-07-19
Vous devez vous connecter pour publier un commentaire.
La
key not found in checkpoint
d'erreur signifie que la variable existe dans votre modèle dans la mémoire, mais pas dans le sérialisé fichier de point de contrôle sur le disque.Vous devez utiliser le inspect_checkpoint outil de comprendre ce que les tenseurs sont enregistrées dans votre point de contrôle, et pourquoi certains moyennes mobiles exponentielles ne sont pas enregistrées ici.
Il n'est pas clair à partir de votre repro exemple qui ligne est censé déclencher l'erreur
Je crois que je vois où votre erreur peut venir de la. Vous êtes à l'initialisation de la veille avec seulement les moyens variables. Essayez un défaut construit de veille. La moyenne mobile des valeurs des variables ne sont pas aptes à la formation ne sont donc pas à finir dans votre point de contrôle.
Qu'entendez-vous par défaut construit de veille?
Ne
tf.train.Saver()
au lieu detf.train.Saver(tf.trainable_variables())
Pour quiconque est familier avec le mentionné outil. Une description peut être trouvée dans le Tensorflow docs
OriginalL'auteur Alexandre Passos
Je voudrais ajouter une méthode à utiliser l'formés variables dans le point de contrôle au mieux.
Gardez à l'esprit que toutes les variables de l'économiseur d'var_list doit être contenue dans le point de contrôle que vous avez configuré. Vous pouvez le vérifier ceux de la veille par:
et ces variables dans le point de contrôle par:
dans votre cas.
Si le restore_vars sont tous inclus dans vars_in_checkpoint alors il ne soulèvera pas l'erreur, sinon initialiser toutes les variables d'abord:
Toutes les variables sont initialisées celles ou pas dans le point de contrôle, vous pouvez filtrer ces variables dans restore_vars qui ne sont pas inclus dans le point de contrôle(à supposer que toutes les variables avec ExponentialMovingAverage dans leurs noms ne sont pas dans le point de contrôle):
Cela peut faire gagner du temps par rapport à la formation du modèle à partir de zéro. (Dans mon scénario de la restauration de variables rendent pas d'amélioration significative par rapport à la formation à partir de zéro au début, car tous les anciens optimiseur de variables sont abandonnés. Mais il peut accélérer le processus d'optimisation de manière significative, je pense, parce que c'est comme préformation certaines variables)
De toute façon, certaines variables sont utiles à la restauration comme les incorporations et quelques couches et etc.
OriginalL'auteur Lerner Zhang