2016-03-29 23 views
11

Tôi đang cố gắng lưu mô hình và sau đó sử dụng lại nó để phân loại hình ảnh của tôi nhưng tiếc là tôi đang gặp lỗi khi khôi phục mô hình mà tôi đã lưu.Không có biến nào để lưu lỗi trong Tensorflow

Mã, trong đó mô hình đã được tạo:

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

Tất cả mọi thứ hoạt động tốt và mô hình được lưu trữ trong thư mục tương ứng.

Tôi đã tạo ra một file python nhiều nơi mà tôi đã cố gắng khôi phục lại các mô hình nhưng nhận được một lỗi có

# 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ỗi mà tôi đang nhận được:

Không biến để lưu

Bất kỳ trợ giúp nào sẽ được đánh giá

Trả lời

22

Lỗi ở đây là khá tinh tế. Trong In[8] bạn tạo một tf.Graph được gọi là và đặt làm mặc định cho khối with graph.as_default():. Điều này có nghĩa là tất cả các biến được tạo trong và nếu bạn in graph.all_variables() bạn sẽ thấy danh sách các biến của mình.

Tuy nhiên, bạn thoát khỏi khối with trước khi tạo (i) tf.Session, và (ii) tf.train.Saver. Điều này có nghĩa là phiên và trình tiết kiệm được tạo trong một biểu đồ khác nhau khác nhau (mặc định toàn cầu tf.Graph được sử dụng khi bạn không tạo một cách rõ ràng và đặt làm mặc định), không chứa bất kỳ biến nào — hoặc bất kỳ nút nào tại tất cả các.

Có ít nhất hai giải pháp:

  1. Như Yaroslav suggests, bạn có thể viết chương trình của bạn mà không sử dụng with graph.as_default(): khối, mà tránh sự nhầm lẫn với nhiều đồ thị. Tuy nhiên, điều này có thể dẫn đến va chạm tên giữa các ô khác nhau trong sổ ghi chép IPython của bạn, điều này thật khó xử khi sử dụng tf.train.Saver, vì nó sử dụng thuộc tính name của một tf.Variable làm khóa trong tệp điểm kiểm tra.

  2. Bạn có thể tạo các trình bảo vệ bên các with graph.as_default(): khối, và tạo ra các tf.Session với một đồ thị rõ ràng, như sau:

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

    Ngoài ra, bạn có thể tạo các tf.Sessionbên các with graph.as_default(): khối, trong trường hợp này, nó sẽ sử dụng cho tất cả các hoạt động của nó.

+0

Cảm ơn mrry cho câu trả lời của bạn, Làm thế nào tôi có thể vượt qua hình ảnh của tôi để mô hình này mà do đó phân loại hình ảnh của tôi, mã tôi đã cố gắng để viết trong tập tin python thứ hai (tập tin trong đó tôi đã khôi phục lại biến của tôi) là chính xác hoặc hiện nó cần sửa đổi để được thực hiện – kkk

+0

Bạn có thể thử cho ăn dữ liệu hình ảnh để 'tf_valid_dataset' và lấy' valid_prediction'. (Sẽ dễ hơn nếu 'tf_valid_dataset' là' tf.placeholder() 'để bạn có thể nạp dữ liệu đầu vào của bất kỳ kích thước nào cho tensor đó.) – mrry

+0

bạn có thể cung cấp đoạn mã cho cùng, Thực ra tôi hoàn toàn mới với Tensorflow và do đó phải đối mặt với những khó khăn nhỏ này. – kkk

1

Bạn đang tạo phiên mới trong In[17] để xóa biến của bạn. Ngoài ra, bạn không cần phải sử dụng with khối nếu bạn chỉ có một đồ thị mặc định và một phiên mặc định, bạn có thể thay vì làm một cái gì đó như thế này

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

Cảm ơn câu trả lời của bạn. – kkk

Các vấn đề liên quan