2016-03-29 10 views
11

मैं मॉडल को सहेजने की कोशिश कर रहा हूं और फिर इसे अपनी छवियों को वर्गीकृत करने के लिए पुन: उपयोग कर रहा हूं लेकिन दुर्भाग्य से मुझे सहेजे गए मॉडल को बहाल करने में त्रुटियां मिल रही हैं।Tensorflow में त्रुटि को बचाने के लिए कोई चर नहीं

कोड, जिसमें मॉडल बना दिया गया है:

# 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) 

सब कुछ ठीक काम करता है और मॉडल संबंधित फ़ोल्डर में संग्रहित है।

मैं एक और अजगर फ़ाइल जहां मैं मॉडल को बहाल लेकिन वहां एक त्रुटि

# 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 

त्रुटि है कि मैं हो रही हो रही है की कोशिश की है बनाया है है:

कोई चर सहेजें करने के लिए

किसी भी मदद की सराहना की जाएगी

उत्तर

22

यहाँ त्रुटि काफी सूक्ष्म है की तरह कुछ कर सकते हैं। In[8] में आप tf.Graph नामक बनाते हैं और with graph.as_default(): ब्लॉक के लिए इसे डिफ़ॉल्ट के रूप में सेट करते हैं। इसका अर्थ है कि सभी चर में बनाए गए हैं, और यदि आप graph.all_variables() प्रिंट करते हैं तो आपको अपने चरों की एक सूची देखना चाहिए।

हालांकि, आप (i) tf.Session बनाने से पहले with ब्लॉक से बाहर निकलें, और (ii) tf.train.Saver। इसका मतलब है कि सत्र और सेवर में अलग-अलग ग्राफ (वैश्विक डिफ़ॉल्ट tf.Graph का उपयोग किया जाता है जिसका उपयोग तब किया जाता है जब आप स्पष्ट रूप से एक नहीं बनाते हैं और इसे डिफ़ॉल्ट रूप से सेट करते हैं), जिसमें कोई चर नहीं है — या किसी भी नोड्स सब।

  1. Yaroslav suggests रूप में, आप with graph.as_default(): ब्लॉक, जो कई रेखांकन के साथ भ्रम से बचा जाता है का उपयोग किए बिना अपने कार्यक्रम लिख सकते हैं:

    कम से कम दो समाधान कर रहे हैं। हालांकि, इससे आपकी आईपीथॉन नोटबुक में विभिन्न सेल्स के बीच टकराव हो सकता है, जो tf.train.Saver का उपयोग करते समय अजीब है, क्योंकि यह nametf.Variable की चेकपॉइंट फ़ाइल में कुंजी के रूप में उपयोग करता है।

  2. आप इस प्रकार सेवर अंदर with graph.as_default(): ब्लॉक बना सकते हैं, और एक स्पष्ट ग्राफ साथ tf.Session बनाते हैं, तो:

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

    वैकल्पिक रूप से, आप tf.Sessionअंदरwith graph.as_default(): ब्लॉक बना सकते हैं, इस मामले में यह अपने सभी परिचालनों के लिए का उपयोग करेगा।

+0

आपके उत्तर के लिए धन्यवाद मैरी, अब मैं अपनी छवि को इस मॉडल में कैसे पास कर सकता हूं जो मेरी छवि को वर्गीकृत करता है, क्या वह कोड है जिसे मैंने दूसरी पायथन फ़ाइल में लिखने की कोशिश की है (फ़ाइल जिसमें मैं अपने चर को बहाल कर रहा था) सही है या क्या इसे – kkk

+0

करने के लिए संशोधन की आवश्यकता है आप छवि डेटा को 'tf_valid_dataset' पर फ़ीड करने और 'valid_prediction' लाने का प्रयास कर सकते हैं। (यह आसान होगा यदि 'tf_valid_dataset' एक tf.placeholder()' था, तो आप उस टेंसर पर किसी भी आकार के इनपुट को फ़ीड कर सकते हैं।) – mrry

+0

क्या आप इसके लिए एक कोड स्निपेट प्रदान कर सकते हैं, असल में मैं टेंसफोर्लो के लिए बिल्कुल नया हूं और इस तरह इन छोटी कठिनाइयों का सामना करना पड़ रहा है। – kkk

1

आप In[17] में एक नया सत्र बना रहे हैं जो आपके चर को मिटा देता है। इसके अलावा, आप यदि आप केवल एक डिफ़ॉल्ट ग्राफ और एक डिफ़ॉल्ट सत्र है with ब्लॉक का उपयोग करने की जरूरत नहीं है, आप के बजाय इस

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") 
+0

आपके उत्तर यारोस्लाव के लिए धन्यवाद। – kkk

संबंधित मुद्दे