web-dev-qa-db-fra.com

Aucune variable pour sauvegarder l'erreur dans Tensorflow

J'essaie de sauvegarder le modèle, puis de le réutiliser pour classer mes images, mais malheureusement, des erreurs se produisent lors de la restauration du modèle que j'ai sauvegardé.

Le code dans lequel le modèle a été créé :

# Deep Learning
# =============
# 
# Assignment 4
# ------------

# In[25]:

# These are all the modules we'll be using later. Make sure you can import them
# before proceeding further.
from __future__ import print_function
import numpy as np
import tensorflow as tf
from six.moves import cPickle as pickle
from six.moves import range


# In[37]:

pickle_file = 'notMNIST.pickle'

with open(pickle_file, 'rb') as f:
  save = pickle.load(f)
  train_dataset = save['train_dataset']
  train_labels = save['train_labels']
  valid_dataset = save['valid_dataset']
  valid_labels = save['valid_labels']
  test_dataset = save['test_dataset']
  test_labels = save['test_labels']
  del save  # hint to help gc free up memory
  print('Training set', train_dataset.shape, train_labels.shape)
  print('Validation set', valid_dataset.shape, valid_labels.shape)
  print('Test set', test_dataset.shape, test_labels.shape)
  print(test_labels)


# Reformat into a TensorFlow-friendly shape:
# - convolutions need the image data formatted as a cube (width by height by #channels)
# - labels as float 1-hot encodings.

# In[38]:

image_size = 28
num_labels = 10
num_channels = 1 # grayscale

import numpy as np

def reformat(dataset, labels):
  dataset = dataset.reshape(
    (-1, image_size, image_size, num_channels)).astype(np.float32)
  #print(np.arange(num_labels))
  labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)
  #print(labels[0,:])
  print(labels[0])
  return dataset, labels
train_dataset, train_labels = reformat(train_dataset, train_labels)
valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)
test_dataset, test_labels = reformat(test_dataset, test_labels)
print('Training set', train_dataset.shape, train_labels.shape)
print('Validation set', valid_dataset.shape, valid_labels.shape)
print('Test set', test_dataset.shape, test_labels.shape)
#print(labels[0])


# In[39]:

def accuracy(predictions, labels):
  return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))
          / predictions.shape[0])


# Let's build a small network with two convolutional layers, followed by one fully connected layer. Convolutional networks are more expensive computationally, so we'll limit its depth and number of fully connected nodes.

# In[47]:

batch_size = 16
patch_size = 5
depth = 16
num_hidden = 64

graph = tf.Graph()

with graph.as_default():

  # Input data.
  tf_train_dataset = tf.placeholder(
    tf.float32, shape=(batch_size, image_size, image_size, num_channels))
  tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
  tf_valid_dataset = tf.constant(valid_dataset)
  tf_test_dataset = tf.constant(test_dataset)

  # Variables.
  layer1_weights = tf.Variable(tf.truncated_normal(
      [patch_size, patch_size, num_channels, depth], stddev=0.1),name="layer1_weights")
  layer1_biases = tf.Variable(tf.zeros([depth]),name = "layer1_biases")
  layer2_weights = tf.Variable(tf.truncated_normal(
      [patch_size, patch_size, depth, depth], stddev=0.1),name = "layer2_weights")
  layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]),name ="layer2_biases")
  layer3_weights = tf.Variable(tf.truncated_normal(
      [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1),name="layer3_biases")
  layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]),name = "layer3_biases")
  layer4_weights = tf.Variable(tf.truncated_normal(
      [num_hidden, num_labels], stddev=0.1),name = "layer4_weights")
  layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]),name = "layer4_biases")

  # Model.
  def model(data):
    conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')
    hidden = tf.nn.relu(conv + layer1_biases)
    conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')
    hidden = tf.nn.relu(conv + layer2_biases)
    shape = hidden.get_shape().as_list()
    reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])
    hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)
    return tf.matmul(hidden, layer4_weights) + layer4_biases

  # Training computation.
  logits = model(tf_train_dataset)
  loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))

  # Optimizer.
  optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

  # Predictions for the training, validation, and test data.
  train_prediction = tf.nn.softmax(logits)
  valid_prediction = tf.nn.softmax(model(tf_valid_dataset))
  test_prediction = tf.nn.softmax(model(tf_test_dataset))


# In[48]:

num_steps = 1001
#saver = tf.train.Saver()
with tf.Session(graph=graph) as session:
  tf.initialize_all_variables().run()
  print('Initialized')
  for step in range(num_steps):
    offset = (step * batch_size) % (train_labels.shape[0] - batch_size)
    batch_data = train_dataset[offset:(offset + batch_size), :, :, :]
    batch_labels = train_labels[offset:(offset + batch_size), :]
    feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}
    _, l, predictions = session.run(
      [optimizer, loss, train_prediction], feed_dict=feed_dict)
    if (step % 50 == 0):
      print('Minibatch loss at step %d: %f' % (step, l))
      print('Minibatch accuracy: %.1f%%' % accuracy(predictions, batch_labels))
      print('Validation accuracy: %.1f%%' % accuracy(
        valid_prediction.eval(), valid_labels))
  print('Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels))
  save_path = tf.train.Saver().save(session, "/tmp/model.ckpt")
  print("Model saved in file: %s" % save_path)

Tout fonctionne bien et le modèle est stocké dans le dossier respectif.

J'ai créé un fichier python supplémentaire dans lequel j'ai essayé de restaurer le modèle mais d'obtenir une erreur

# In[1]:
from __future__ import print_function
import numpy as np
import tensorflow as tf
from six.moves import cPickle as pickle
from six.moves import range


# In[3]:

image_size = 28
num_labels = 10
num_channels = 1 # grayscale
import numpy as np


# In[4]:

def accuracy(predictions, labels):
  return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))
          / predictions.shape[0])


# In[8]:

batch_size = 16
patch_size = 5
depth = 16
num_hidden = 64

graph = tf.Graph()

with graph.as_default():

  '''# Input data.
  tf_train_dataset = tf.placeholder(
    tf.float32, shape=(batch_size, image_size, image_size, num_channels))
  tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
  tf_valid_dataset = tf.constant(valid_dataset)
  tf_test_dataset = tf.constant(test_dataset)'''

  # Variables.
  layer1_weights = tf.Variable(tf.truncated_normal(
      [patch_size, patch_size, num_channels, depth], stddev=0.1),name="layer1_weights")
  layer1_biases = tf.Variable(tf.zeros([depth]),name = "layer1_biases")
  layer2_weights = tf.Variable(tf.truncated_normal(
      [patch_size, patch_size, depth, depth], stddev=0.1),name = "layer2_weights")
  layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]),name ="layer2_biases")
  layer3_weights = tf.Variable(tf.truncated_normal(
      [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1),name="layer3_biases")
  layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]),name = "layer3_biases")
  layer4_weights = tf.Variable(tf.truncated_normal(
      [num_hidden, num_labels], stddev=0.1),name = "layer4_weights")
  layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]),name = "layer4_biases")

  # Model.
  def model(data):
    conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')
    hidden = tf.nn.relu(conv + layer1_biases)
    conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')
    hidden = tf.nn.relu(conv + layer2_biases)
    shape = hidden.get_shape().as_list()
    reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])
    hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)
    return tf.matmul(hidden, layer4_weights) + layer4_biases

  '''# Training computation.
  logits = model(tf_train_dataset)
  loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))

  # Optimizer.
  optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)'''

  # Predictions for the training, validation, and test data.
  #train_prediction = tf.nn.softmax(logits)
  #valid_prediction = tf.nn.softmax(model(tf_valid_dataset))
  #test_prediction = tf.nn.softmax(model(tf_test_dataset))

# In[17]:

#saver = tf.train.Saver()
with tf.Session() as sess:
  # Restore variables from disk.
  tf.train.Saver().restore(sess, "/tmp/model.ckpt")
  print("Model restored.")
  # Do some work with the model

l’erreur que j’obtiens est:

Aucune variable à sauvegarder 

Toute aide serait appréciée

19
kkk

L'erreur ici est assez subtile. Dans In[8], vous créez un tf.Graph appelé graph et le définissez par défaut pour le bloc with graph.as_default(): . Cela signifie que toutes les variables sont créées dans graph et si vous imprimez graph.all_variables(), vous devriez voir une liste de vos variables.

Cependant, vous quittez le bloc with avant de créer (i) le tf.Session , et (ii) le tf.train.Saver . Cela signifie que la session et l'économiseur sont créés dans un graphe different (le tf.Graph global utilisé par défaut lorsque vous n'en créez pas explicitement un et que vous le définissez par défaut), qui ne contient aucune variable ni aucun paramètre. nœuds du tout.

Il y a au moins deux solutions:

  1. Comme le suggère Yaroslav suggère , vous pouvez écrire votre programme sans utiliser le bloc with graph.as_default():, ce qui évite la confusion avec plusieurs graphiques. Toutefois, cela peut entraîner des conflits de noms entre différentes cellules de votre bloc-notes IPython, ce qui est fastidieux lorsque vous utilisez le tf.train.Saver, car il utilise la propriété name d'un tf.Variable comme clé dans le fichier de point de contrôle.

  2. Vous pouvez créer l'économiseur à l'intérieur le bloc with graph.as_default(): et créer le tf.Session avec un graphique explicite, comme suit:

    with graph.as_default():
        # [Variable and model creation goes here.]
    
        saver = tf.train.Saver()  # Gets all variables in `graph`.
    
    with tf.Session(graph=graph) as sess:
        saver.restore(sess)
        # Do some work with the model....
    

    Vous pouvez également créer le bloc tf.Session _ {inside} _ with graph.as_default():, auquel cas il utilisera graph pour toutes ses opérations.

34
mrry

Vous créez une nouvelle session dans In[17] qui efface vos variables. De plus, vous n'avez pas besoin d'utiliser des blocs with si vous ne disposez que d'un graphique par défaut et d'une session par défaut.

sess = tf.InteractiveSession()
layer1_weights = tf.Variable(tf.truncated_normal(
  [patch_size, patch_size, num_channels, depth], stddev=0.1),name="layer1_weights")
tf.train.Saver().restore(sess, "/tmp/model.ckpt")
1
Yaroslav Bulatov