如何保存张量流模型

时间:2018-03-27 13:56:18

标签: tensorflow

我使用以下链接运行了有关构建CNN的tensorflow教程。

访问https://www.tensorflow.org/tutorials/layers

现在我要保存模型。

这是我的代码

import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)


def cnn_model_fn(features, labels, mode):
  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])

  conv1 = tf.layers.conv2d(
   inputs=input_layer,
   filters=32,
   kernel_size=[5, 5],
   padding="same",
   activation=tf.nn.relu)

  pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2],   
    strides=2)

  conv2 = tf.layers.conv2d(
   inputs=pool1,
   filters=64,
   kernel_size=[5, 5],
   padding="same",
   activation=tf.nn.relu)

   pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], 
    strides=2)

  pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])

 dense = tf.layers.dense(inputs=pool2_flat, units=1024, 
  activation=tf.nn.relu)


 dropout = tf.layers.dropout(
  inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
 logits = tf.layers.dense(inputs=dropout, units=10)

 predictions = {

  "classes": tf.argmax(input=logits, axis=1),
  "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
 }
if mode == tf.estimator.ModeKeys.PREDICT:
 return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, 
 logits=logits)


if mode == tf.estimator.ModeKeys.TRAIN:
 optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
 train_op = optimizer.minimize(
    loss=loss,
    global_step=tf.train.get_global_step())
 return tf.estimator.EstimatorSpec(mode=mode, loss=loss, 
  train_op=train_op)


 eval_metric_ops = {
  "accuracy": tf.metrics.accuracy(
      labels=labels, predictions=predictions["classes"])}
   return tf.estimator.EstimatorSpec(
   mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

with tf.Session() as sess:


 mnist = tf.contrib.learn.datasets.load_dataset("mnist")
 train_data = mnist.train.images  # Returns np.array
 train_labels = np.asarray(mnist.train.labels, dtype=np.int32)
 eval_data = mnist.test.images  # Returns np.array
 eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)


 mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="/home/checkmate/PycharmProjects 
    /Project1/myworks/tensorflow/CNN MNIST/mnist_convnet_model")

 tensors_to_log = {"probabilities": "softmax_tensor"}
 logging_hook = tf.train.LoggingTensorHook(
    tensors=tensors_to_log, every_n_iter=50)


 train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": train_data},
    y=train_labels,
    batch_size=100,
    num_epochs=None,
    shuffle=True)

  mnist_classifier.train(
    input_fn=train_input_fn,
    steps=2,
    hooks=[logging_hook])



   eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": eval_data},
    y=eval_labels,
    num_epochs=1,
    shuffle=False)
   eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)




  saver = tf.train.Saver()
  save_path = saver.save(sess, "/home/checkmate/PycharmProjects/Project1
  /myworks/tensorflow/CNN MNIST/savedmodel.ckpt")
  imprint("model saved in ", save_path)

但我收到错误“没有要保存的变量”。

我知道我遗漏了一些信息。有人可以让我知道如何保存这种模型。

由于

1 个答案:

答案 0 :(得分:0)

啊,我看到了你的错误,你忘了将会话传递给saver.save

以下是文档(https://www.tensorflow.org/programmers_guide/saved_model)中的示例:

# Create some variables.
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
v2 = tf.get_variable("v2", shape=[5], initializer = tf.zeros_initializer)

inc_v1 = v1.assign(v1+1)
dec_v2 = v2.assign(v2-1)

# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, and save the
# variables to disk.
with tf.Session() as sess:
  sess.run(init_op)
  # Do some work with the model.
  inc_v1.op.run()
  dec_v2.op.run()
  # Save the variables to disk.
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print("Model saved in path: %s" % save_path)

请注意,行save_path = saver.save(sess, "/tmp/model.ckpt")在会话中作为第一个参数传递,文件名作为第二个参数传递。

您的代码错误地只传递文件名:save_path = saver.save("/home/checkmate/PycharmProjects/Project1/myworks/tensorflow/CNN MNIST/savedmodel.ckpt")

相关问题