一、TensorFlow運(yùn)作方式入門(mén)
fully_connected_feed.py
- # Copyright 2015 Google Inc. All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www./licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- # ==============================================================================
-
- """Trains and Evaluates the MNIST network using a feed dictionary."""
- # pylint: disable=missing-docstring
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
-
- import os.path
- import time
-
- import tensorflow.python.platform
- import numpy
- from six.moves import xrange # pylint: disable=redefined-builtin
- import tensorflow as tf
-
- #from tensorflow.examples.tutorials.mnist import input_data
- #from tensorflow.examples.tutorials.mnist import mnist
- import input_data, mnist
-
- # Basic model parameters as external flags.
- flags = tf.app.flags
- FLAGS = flags.FLAGS
- flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
- flags.DEFINE_integer('max_steps', 2000, 'Number of steps to run trainer.')
- flags.DEFINE_integer('hidden1', 128, 'Number of units in hidden layer 1.')
- flags.DEFINE_integer('hidden2', 32, 'Number of units in hidden layer 2.')
- flags.DEFINE_integer('batch_size', 100, 'Batch size. '
- 'Must divide evenly into the dataset sizes.')
- flags.DEFINE_string('train_dir', 'Mnist_data/', 'Directory to put the training data.')
- flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
- 'for unit testing.')
-
-
- def placeholder_inputs(batch_size):
- """Generate placeholder variables to represent the input tensors.
-
- These placeholders are used as inputs by the rest of the model building
- code and will be fed from the downloaded data in the .run() loop, below.
-
- Args:
- batch_size: The batch size will be baked into both placeholders.
-
- Returns:
- images_placeholder: Images placeholder.
- labels_placeholder: Labels placeholder.
- """
- # Note that the shapes of the placeholders match the shapes of the full
- # image and label tensors, except the first dimension is now batch_size
- # rather than the full size of the train or test data sets.
- images_placeholder = tf.placeholder(tf.float32, shape=(batch_size,
- mnist.IMAGE_PIXELS))
- labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))
- return images_placeholder, labels_placeholder
-
-
- def fill_feed_dict(data_set, images_pl, labels_pl):
- """Fills the feed_dict for training the given step.
-
- A feed_dict takes the form of:
- feed_dict = {
- <placeholder>: <tensor of values to be passed for placeholder>,
- ....
- }
-
- Args:
- data_set: The set of images and labels, from input_data.read_data_sets()
- images_pl: The images placeholder, from placeholder_inputs().
- labels_pl: The labels placeholder, from placeholder_inputs().
-
- Returns:
- feed_dict: The feed dictionary mapping from placeholders to values.
- """
- # Create the feed_dict for the placeholders filled with the next
- # `batch size ` examples.
- images_feed, labels_feed = data_set.next_batch(FLAGS.batch_size,
- FLAGS.fake_data)
- feed_dict = {
- images_pl: images_feed,
- labels_pl: labels_feed,
- }
- return feed_dict
-
-
- def do_eval(sess,
- eval_correct,
- images_placeholder,
- labels_placeholder,
- data_set):
- """Runs one evaluation against the full epoch of data.
-
- Args:
- sess: The session in which the model has been trained.
- eval_correct: The Tensor that returns the number of correct predictions.
- images_placeholder: The images placeholder.
- labels_placeholder: The labels placeholder.
- data_set: The set of images and labels to evaluate, from
- input_data.read_data_sets().
- """
- # And run one epoch of eval.
- true_count = 0 # Counts the number of correct predictions.
- steps_per_epoch = data_set.num_examples // FLAGS.batch_size
- num_examples = steps_per_epoch * FLAGS.batch_size
- for step in xrange(steps_per_epoch):
- feed_dict = fill_feed_dict(data_set,
- images_placeholder,
- labels_placeholder)
- true_count += sess.run(eval_correct, feed_dict=feed_dict)
- precision = true_count / num_examples
- print(' Num examples: %d Num correct: %d Precision @ 1: %0.04f' %
- (num_examples, true_count, precision))
-
-
- def run_training():
- """Train MNIST for a number of steps."""
- # Get the sets of images and labels for training, validation, and
- # test on MNIST.
- data_sets = input_data.read_data_sets(FLAGS.train_dir, FLAGS.fake_data)
-
- # Tell TensorFlow that the model will be built into the default Graph.
- with tf.Graph().as_default():
- # Generate placeholders for the images and labels.
- images_placeholder, labels_placeholder = placeholder_inputs(
- FLAGS.batch_size)
-
- # Build a Graph that computes predictions from the inference model.
- logits = mnist.inference(images_placeholder,
- FLAGS.hidden1,
- FLAGS.hidden2)
-
- # Add to the Graph the Ops for loss calculation.
- loss = mnist.loss(logits, labels_placeholder)
-
- # Add to the Graph the Ops that calculate and apply gradients.
- train_op = mnist.training(loss, FLAGS.learning_rate)
-
- # Add the Op to compare the logits to the labels during evaluation.
- eval_correct = mnist.evaluation(logits, labels_placeholder)
-
- # Build the summary operation based on the TF collection of Summaries.
- summary_op = tf.merge_all_summaries()
-
- # Create a saver for writing training checkpoints.
- saver = tf.train.Saver()
-
- # Create a session for running Ops on the Graph.
- sess = tf.Session()
-
- # Run the Op to initialize the variables.
- init = tf.initialize_all_variables()
- sess.run(init)
-
- # Instantiate a SummaryWriter to output summaries and the Graph.
- summary_writer = tf.train.SummaryWriter(FLAGS.train_dir,
- graph_def=sess.graph_def)
-
- # And then after everything is built, start the training loop.
- for step in xrange(FLAGS.max_steps):
- start_time = time.time()
-
- # Fill a feed dictionary with the actual set of images and labels
- # for this particular training step.
- feed_dict = fill_feed_dict(data_sets.train,
- images_placeholder,
- labels_placeholder)
-
- # Run one step of the model. The return values are the activations
- # from the `train_op` (which is discarded) and the `loss` Op. To
- # inspect the values of your Ops or variables, you may include them
- # in the list passed to sess.run() and the value tensors will be
- # returned in the tuple from the call.
- _, loss_value = sess.run([train_op, loss],
- feed_dict=feed_dict)
-
- duration = time.time() - start_time
-
- # Write the summaries and print an overview fairly often.
- if step % 100 == 0:
- # Print status to stdout.
- print('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value, duration))
- # Update the events file.
- summary_str = sess.run(summary_op, feed_dict=feed_dict)
- summary_writer.add_summary(summary_str, step)
-
- # Save a checkpoint and evaluate the model periodically.
- if (step + 1) % 1000 == 0 or (step + 1) == FLAGS.max_steps:
- saver.save(sess, FLAGS.train_dir, global_step=step)
- # Evaluate against the training set.
- print('Training Data Eval:')
- do_eval(sess,
- eval_correct,
- images_placeholder,
- labels_placeholder,
- data_sets.train)
- # Evaluate against the validation set.
- print('Validation Data Eval:')
- do_eval(sess,
- eval_correct,
- images_placeholder,
- labels_placeholder,
- data_sets.validation)
- # Evaluate against the test set.
- print('Test Data Eval:')
- do_eval(sess,
- eval_correct,
- images_placeholder,
- labels_placeholder,
- data_sets.test)
-
-
- def main(_):
- run_training()
-
-
- if __name__ == '__main__':
- tf.app.run()
**`fully_connected_feed.py`**的運(yùn)行結(jié)果如下(本人電腦為2 CPU,沒(méi)有使用GPU):
```
Extracting Mnist_data/train-images-idx3-ubyte.gz
Extracting Mnist_data/train-labels-idx1-ubyte.gz
Extracting Mnist_data/t10k-images-idx3-ubyte.gz
Extracting Mnist_data/t10k-labels-idx1-ubyte.gz
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 2
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 2
Step 0: loss = 2.33 (0.023 sec)
Step 100: loss = 2.09 (0.007 sec)
Step 200: loss = 1.76 (0.009 sec)
Step 300: loss = 1.36 (0.007 sec)
Step 400: loss = 1.12 (0.007 sec)
Step 500: loss = 0.74 (0.008 sec)
Step 600: loss = 0.78 (0.006 sec)
Step 700: loss = 0.69 (0.007 sec)
Step 800: loss = 0.67 (0.007 sec)
Step 900: loss = 0.52 (0.010 sec)
Training Data Eval:
Num examples: 55000 Num correct: 47532 Precision @ 1: 0.8642
Validation Data Eval:
Num examples: 5000 Num correct: 4360 Precision @ 1: 0.8720
Test Data Eval:
Num examples: 10000 Num correct: 8705 Precision @ 1: 0.8705
Step 1000: loss = 0.56 (0.013 sec)
Step 1100: loss = 0.50 (0.145 sec)
Step 1200: loss = 0.33 (0.007 sec)
Step 1300: loss = 0.44 (0.006 sec)
Step 1400: loss = 0.39 (0.006 sec)
Step 1500: loss = 0.33 (0.009 sec)
Step 1600: loss = 0.56 (0.008 sec)
Step 1700: loss = 0.50 (0.007 sec)
Step 1800: loss = 0.42 (0.006 sec)
Step 1900: loss = 0.41 (0.006 sec)
Training Data Eval:
Num examples: 55000 Num correct: 49220 Precision @ 1: 0.8949
Validation Data Eval:
Num examples: 5000 Num correct: 4520 Precision @ 1: 0.9040
Test Data Eval:
Num examples: 10000 Num correct: 9014 Precision @ 1: 0.9014
[Finished in 22.8s]
二、 Tensorboard訓(xùn)練過(guò)程可視化
mnist_with_summaries.py
- # Copyright 2015 Google Inc. All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www./licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- # ==============================================================================
-
- """A very simple MNIST classifier, modified to display data in TensorBoard.
-
- See extensive documentation for the original model at
- http:///tutorials/mnist/beginners/index.md
-
- See documentation on the TensorBoard specific pieces at
- http:///how_tos/summaries_and_tensorboard/index.md
-
- If you modify this file, please update the exerpt in
- how_tos/summaries_and_tensorboard/index.md.
-
- """
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
-
- import tensorflow.python.platform
- #from tensorflow.examples.tutorials.mnist import input_data
- import input_data
- import tensorflow as tf
-
- flags = tf.app.flags
- FLAGS = flags.FLAGS
- flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
- 'for unit testing.')
- flags.DEFINE_integer('max_steps', 1000, 'Number of steps to run trainer.')
- flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
-
-
- def main(_):
- # Import data
- mnist = input_data.read_data_sets('Mnist_data/', one_hot=True,
- fake_data=FLAGS.fake_data)
-
- sess = tf.InteractiveSession()
-
- # Create the model
- x = tf.placeholder(tf.float32, [None, 784], name='x-input')
- W = tf.Variable(tf.zeros([784, 10]), name='weights')
- b = tf.Variable(tf.zeros([10], name='bias'))
-
- # Use a name scope to organize nodes in the graph visualizer
- with tf.name_scope('Wx_b'):
- y = tf.nn.softmax(tf.matmul(x, W) + b)
-
- # Add summary ops to collect data
- _ = tf.histogram_summary('weights', W)
- _ = tf.histogram_summary('biases', b)
- _ = tf.histogram_summary('y', y)
-
- # Define loss and optimizer
- y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')
- # More name scopes will clean up the graph representation
- with tf.name_scope('xent'):
- cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
- _ = tf.scalar_summary('cross entropy', cross_entropy)
- with tf.name_scope('train'):
- train_step = tf.train.GradientDescentOptimizer(
- FLAGS.learning_rate).minimize(cross_entropy)
-
- with tf.name_scope('test'):
- correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
- accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
- _ = tf.scalar_summary('accuracy', accuracy)
-
- # Merge all the summaries and write them out to /tmp/mnist_logs
- merged = tf.merge_all_summaries()
- writer = tf.train.SummaryWriter('/tmp/mnist_logs', sess.graph_def)
- tf.initialize_all_variables().run()
-
- # Train the model, and feed in test data and record summaries every 10 steps
-
- for i in range(FLAGS.max_steps):
- if i % 10 == 0: # Record summary data and the accuracy
- if FLAGS.fake_data:
- batch_xs, batch_ys = mnist.train.next_batch(
- 100, fake_data=FLAGS.fake_data)
- feed = {x: batch_xs, y_: batch_ys}
- else:
- feed = {x: mnist.test.images, y_: mnist.test.labels}
- result = sess.run([merged, accuracy], feed_dict=feed)
- summary_str = result[0]
- acc = result[1]
- writer.add_summary(summary_str, i)
- print('Accuracy at step %s: %s' % (i, acc))
- else:
- batch_xs, batch_ys = mnist.train.next_batch(
- 100, fake_data=FLAGS.fake_data)
- feed = {x: batch_xs, y_: batch_ys}
- sess.run(train_step, feed_dict=feed)
-
- if __name__ == '__main__':
- tf.app.run()
**`mnist_with_summaries.py`**主要提供了一種在Tensorboard可視化方法,首先,編譯運(yùn)行代碼:
運(yùn)行完畢后,打開(kāi)終端`Terminal`,輸入`tensorboard --logdir=/tmp/mnist_logs`,就會(huì)運(yùn)行出:`Starting TensorBoard on port 6006 (You can navigate to http://localhost:6006)`
然后,打開(kāi)瀏覽器,輸入鏈接`http://localhost:6006`:
其中,有一些選項(xiàng),例如菜單欄里包括`EVENTS, IMAGES, GRAPH, HISTOGRAMS`,都可以一一點(diǎn)開(kāi)查看~
另外,此時(shí)如果不關(guān)閉該終端,是無(wú)法在其他終端中重新生成可視化結(jié)果的,會(huì)出現(xiàn)端口占用的錯(cuò)誤。
|