4

I wrote a convolutional neural network in tensorflow to perform on the mnist dataset. Everything works just fine, but i want to save the model with the tf.train.Saver(). How am i gonna do it? Here is my code:

from __future__ import print_function

import tensorflow as tf

# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

# Parameters
learning_rate = 0.001
training_iters = 200000
batch_size = 128
display_step = 10

# Network Parameters
n_input = 784 # MNIST data input (img shape: 28*28)
n_classes = 10 # MNIST total classes (0-9 digits)
dropout = 0.75 # Dropout, probability to keep units

# tf Graph input
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
keep_prob = tf.placeholder(tf.float32) #dropout (keep probability)


# Create some wrappers for simplicity
def conv2d(x, W, b, strides=1):
    # Conv2D wrapper, with bias and relu activation
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    return tf.nn.relu(x)


def maxpool2d(x, k=2):
    # MaxPool2D wrapper
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],
                      padding='SAME')


# Create model
def conv_net(x, weights, biases, dropout):
    # Reshape input picture
    x = tf.reshape(x, shape=[-1, 28, 28, 1])

    # Convolution Layer
    conv1 = conv2d(x, weights['wc1'], biases['bc1'])
    # Max Pooling (down-sampling)
    conv1 = maxpool2d(conv1, k=2)

    # Convolution Layer
    conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])
    # Max Pooling (down-sampling)
    conv2 = maxpool2d(conv2, k=2)

    # Fully connected layer
    # Reshape conv2 output to fit fully connected layer input
    fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])
    fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
    fc1 = tf.nn.relu(fc1)
    # Apply Dropout
    fc1 = tf.nn.dropout(fc1, dropout)

    # Output, class prediction
    out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])
    return out

# Store layers weight & bias
weights = {
    # 5x5 conv, 1 input, 32 outputs
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
    # 5x5 conv, 32 inputs, 64 outputs
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
    # fully connected, 7*7*64 inputs, 1024 outputs
    'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])),
    # 1024 inputs, 10 outputs (class prediction)
    'out': tf.Variable(tf.random_normal([1024, n_classes]))
}

biases = {
    'bc1': tf.Variable(tf.random_normal([32])),
    'bc2': tf.Variable(tf.random_normal([64])),
    'bd1': tf.Variable(tf.random_normal([1024])),
    'out': tf.Variable(tf.random_normal([n_classes]))
}

# Construct model
pred = conv_net(x, weights, biases, keep_prob)

# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, 
labels=y))
optimizer = 
tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

# Evaluate model
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initializing the variables
init = tf.initialize_all_variables()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)
    step = 1
    # Keep training until reach max iterations
    while step * batch_size < training_iters:
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        # Run optimization op (backprop)
        sess.run(optimizer, feed_dict={x: batch_x, y: batch_y,
                                       keep_prob: dropout})
        if step % display_step == 0:
            # Calculate batch loss and accuracy
            loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x,
                                                              y: batch_y,
                                                             keep_prob: 1.})
            print("Iter " + str(step*batch_size) + ", Minibatch Loss= " + \
                  "{:.6f}".format(loss) + ", Training Accuracy= " + \
                  "{:.5f}".format(acc))
        step += 1
    print("Optimization Finished!")

    # Calculate accuracy for 256 mnist test images
    print("Testing Accuracy:", \
        sess.run(accuracy, feed_dict={x: mnist.test.images[:256],
                                      y: mnist.test.labels[:256],
                                      keep_prob: 1.}))
Jonas Stepanik
  • 135
  • 4
  • 11
  • I think this has been answered here. Does it work for you? https://stackoverflow.com/questions/33759623/tensorflow-how-to-save-restore-a-model?rq=1 – Aditya Lahiri May 26 '17 at 13:05

2 Answers2

9

Simplest way to save and restore:

To save:

saver = tf.train.Saver(max_to_keep=1) 
with tf.Session() as sess:
    # train your model, then:
    savePath = saver.save(sess, 'someDir/my_model.ckpt')

To restore:

with tf.Session() as sess:
    saver = tf.train.import_meta_graph('someDir/my_model.ckpt.meta')
    saver.restore(sess, pathModel + 'someDir/my_model.ckpt')
    # access a variable from the saved Graph, and so on:
    someVar = sess.run('varName:0')

This should do it

VS_FF
  • 2,353
  • 3
  • 16
  • 34
  • I have 2 questions: if i loaded the checkpoint do i need to call sess.run(init) again? – Jonas Stepanik May 26 '17 at 13:42
  • and what does this 0 mean in 'varName:0'? – Jonas Stepanik May 26 '17 at 13:44
  • Be careful with doing init, because it will probably reset all your trained variables (weights/biases). If you need to initialize something, do it before loading this. If i'm not mistaken the 0's in variable names have something to do with how many times your graph was saved? I could be wrong on that. Notice that in the code above there is max_to_keep=1. Maybe if you play around with that, then there'll be more than one version of each var? I never tried myself as I only save the final version once full training is done – VS_FF May 26 '17 at 14:41
  • 1
    Because the idea is that you can have multiple check-points of the same model at different stages of training. So you can have intermediate versions of the varialbes that have been trained less or more than in some later/earlier versions... – VS_FF May 26 '17 at 14:42
1

Consider saving results of Neural Network training to database.

The root of the idea is described here:

A neural network scoring engine in PL/SQL for recognizing handwritten digits

https://db-blog.web.cern.ch/blog/luca-canali/2016-07-neural-network-scoring-engine-plsql-recognizing-handwritten-digits

The code repository for this example is located here:

https://github.com/LucaCanali/Miscellaneous/tree/master/PLSQL_Neural_Network

By doing so it's possible to train the network once and then use database procedures to use it.

pmi
  • 341
  • 3
  • 6