Remove examples/tutorials. Examples have moved to their own repo.
PiperOrigin-RevId: 333794392 Change-Id: I5496b0d1673e8317660dbc2c5140c47220d4c468
This commit is contained in:
parent
94b6db8cc5
commit
42e122e6a0
@ -1,135 +0,0 @@
|
||||
# Description:
|
||||
# Example TensorFlow models for MNIST used in tutorials
|
||||
|
||||
load("//tensorflow:tensorflow.bzl", "tf_py_test")
|
||||
|
||||
package(
|
||||
licenses = ["notice"], # Apache 2.0
|
||||
)
|
||||
|
||||
exports_files(["LICENSE"])
|
||||
|
||||
py_library(
|
||||
name = "package",
|
||||
srcs = [
|
||||
"__init__.py",
|
||||
],
|
||||
srcs_version = "PY2AND3",
|
||||
visibility = ["//tensorflow:__subpackages__"],
|
||||
deps = [
|
||||
":input_data",
|
||||
":mnist",
|
||||
],
|
||||
)
|
||||
|
||||
py_library(
|
||||
name = "input_data",
|
||||
srcs = ["input_data.py"],
|
||||
srcs_version = "PY2AND3",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//tensorflow:tensorflow_py",
|
||||
"//third_party/py/numpy",
|
||||
"@six_archive//:six",
|
||||
],
|
||||
)
|
||||
|
||||
py_library(
|
||||
name = "mnist",
|
||||
srcs = [
|
||||
"mnist.py",
|
||||
],
|
||||
srcs_version = "PY2AND3",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//tensorflow:tensorflow_py",
|
||||
],
|
||||
)
|
||||
|
||||
py_binary(
|
||||
name = "fully_connected_feed",
|
||||
srcs = [
|
||||
"fully_connected_feed.py",
|
||||
],
|
||||
python_version = "PY3",
|
||||
srcs_version = "PY2AND3",
|
||||
tags = ["optonly"],
|
||||
deps = [
|
||||
":input_data",
|
||||
":mnist",
|
||||
"//tensorflow:tensorflow_py",
|
||||
],
|
||||
)
|
||||
|
||||
py_binary(
|
||||
name = "mnist_with_summaries",
|
||||
srcs = [
|
||||
"mnist_with_summaries.py",
|
||||
],
|
||||
python_version = "PY3",
|
||||
srcs_version = "PY2AND3",
|
||||
deps = [
|
||||
":input_data",
|
||||
"//tensorflow:tensorflow_py",
|
||||
],
|
||||
)
|
||||
|
||||
# Note: We need to set the evironment variable to use CPU JIT.
|
||||
# The way to achieve this is via setting the following:
|
||||
# TF_XLA_FLAGS='--tf_xla_cpu_global_jit=true'
|
||||
# before the run command. To use XLA, we also must build
|
||||
# with --define=with_xla_support=true flag.
|
||||
# Note (GPU): Add --config=cuda to the build command.
|
||||
py_binary(
|
||||
name = "mnist_softmax_xla",
|
||||
srcs = [
|
||||
"mnist_softmax_xla.py",
|
||||
],
|
||||
python_version = "PY3",
|
||||
srcs_version = "PY2AND3",
|
||||
deps = [
|
||||
":input_data",
|
||||
"//tensorflow:tensorflow_py",
|
||||
],
|
||||
)
|
||||
|
||||
tf_py_test(
|
||||
name = "fully_connected_feed_test",
|
||||
srcs = [
|
||||
"fully_connected_feed.py",
|
||||
],
|
||||
args = [
|
||||
"--fake_data",
|
||||
"--max_steps=10",
|
||||
],
|
||||
main = "fully_connected_feed.py",
|
||||
tags = ["no_pip"],
|
||||
deps = [
|
||||
":input_data",
|
||||
":mnist",
|
||||
"//tensorflow:tensorflow_py",
|
||||
],
|
||||
)
|
||||
|
||||
tf_py_test(
|
||||
name = "mnist_with_summaries_test",
|
||||
size = "small",
|
||||
srcs = [
|
||||
"mnist_with_summaries.py",
|
||||
],
|
||||
args = [
|
||||
"--fake_data",
|
||||
"--max_steps=10",
|
||||
"--learning_rate=0.00",
|
||||
],
|
||||
main = "mnist_with_summaries.py",
|
||||
tags = [
|
||||
"no_pip",
|
||||
"noasan", # http://b/146080738
|
||||
"notsan", # http://b/29184009
|
||||
],
|
||||
deps = [
|
||||
":input_data",
|
||||
"//tensorflow:tensorflow_py",
|
||||
],
|
||||
)
|
@ -1,22 +0,0 @@
|
||||
# Copyright 2015 The TensorFlow Authors. 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.apache.org/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.
|
||||
# ==============================================================================
|
||||
|
||||
"""Imports mnist tutorial libraries used by tutorial examples."""
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
from tensorflow.examples.tutorials.mnist import mnist
|
@ -1,279 +0,0 @@
|
||||
# Copyright 2015 The TensorFlow Authors. 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.apache.org/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."""
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
# pylint: disable=missing-docstring
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
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
|
||||
|
||||
# Basic model parameters as external flags.
|
||||
FLAGS = None
|
||||
|
||||
|
||||
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.compat.v1.placeholder(
|
||||
tf.float32, shape=(batch_size, mnist.IMAGE_PIXELS))
|
||||
labels_placeholder = tf.compat.v1.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 = float(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.input_data_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 Tensor based on the TF collection of Summaries.
|
||||
summary = tf.compat.v1.summary.merge_all()
|
||||
|
||||
# Add the variable initializer Op.
|
||||
init = tf.compat.v1.global_variables_initializer()
|
||||
|
||||
# Create a saver for writing training checkpoints.
|
||||
saver = tf.compat.v1.train.Saver()
|
||||
|
||||
# Create a session for running Ops on the Graph.
|
||||
sess = tf.compat.v1.Session()
|
||||
|
||||
# Instantiate a SummaryWriter to output summaries and the Graph.
|
||||
summary_writer = tf.compat.v1.summary.FileWriter(FLAGS.log_dir, sess.graph)
|
||||
|
||||
# And then after everything is built:
|
||||
|
||||
# Run the Op to initialize the variables.
|
||||
sess.run(init)
|
||||
|
||||
# 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, feed_dict=feed_dict)
|
||||
summary_writer.add_summary(summary_str, step)
|
||||
summary_writer.flush()
|
||||
|
||||
# Save a checkpoint and evaluate the model periodically.
|
||||
if (step + 1) % 1000 == 0 or (step + 1) == FLAGS.max_steps:
|
||||
checkpoint_file = os.path.join(FLAGS.log_dir, 'model.ckpt')
|
||||
saver.save(sess, checkpoint_file, 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(_):
|
||||
if tf.io.gfile.exists(FLAGS.log_dir):
|
||||
tf.io.gfile.rmtree(FLAGS.log_dir)
|
||||
tf.io.gfile.makedirs(FLAGS.log_dir)
|
||||
run_training()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'--learning_rate',
|
||||
type=float,
|
||||
default=0.01,
|
||||
help='Initial learning rate.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--max_steps',
|
||||
type=int,
|
||||
default=2000,
|
||||
help='Number of steps to run trainer.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--hidden1',
|
||||
type=int,
|
||||
default=128,
|
||||
help='Number of units in hidden layer 1.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--hidden2',
|
||||
type=int,
|
||||
default=32,
|
||||
help='Number of units in hidden layer 2.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--batch_size',
|
||||
type=int,
|
||||
default=100,
|
||||
help='Batch size. Must divide evenly into the dataset sizes.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--input_data_dir',
|
||||
type=str,
|
||||
default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),
|
||||
'tensorflow/mnist/input_data'),
|
||||
help='Directory to put the input data.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--log_dir',
|
||||
type=str,
|
||||
default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),
|
||||
'tensorflow/mnist/logs/fully_connected_feed'),
|
||||
help='Directory to put the log data.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--fake_data',
|
||||
default=False,
|
||||
help='If true, uses fake data for unit testing.',
|
||||
action='store_true'
|
||||
)
|
||||
|
||||
FLAGS, unparsed = parser.parse_known_args()
|
||||
tf.compat.v1.app.run(main=main, argv=[sys.argv[0]] + unparsed)
|
@ -1,148 +0,0 @@
|
||||
# Copyright 2015 The TensorFlow Authors. 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.apache.org/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.
|
||||
# ==============================================================================
|
||||
|
||||
"""Builds the MNIST network.
|
||||
|
||||
Implements the inference/loss/training pattern for model building.
|
||||
|
||||
1. inference() - Builds the model as far as required for running the network
|
||||
forward to make predictions.
|
||||
2. loss() - Adds to the inference model the layers required to generate loss.
|
||||
3. training() - Adds to the loss model the Ops required to generate and
|
||||
apply gradients.
|
||||
|
||||
This file is used by the various "fully_connected_*.py" files and not meant to
|
||||
be run.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
import math
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
# The MNIST dataset has 10 classes, representing the digits 0 through 9.
|
||||
NUM_CLASSES = 10
|
||||
|
||||
# The MNIST images are always 28x28 pixels.
|
||||
IMAGE_SIZE = 28
|
||||
IMAGE_PIXELS = IMAGE_SIZE * IMAGE_SIZE
|
||||
|
||||
|
||||
def inference(images, hidden1_units, hidden2_units):
|
||||
"""Build the MNIST model up to where it may be used for inference.
|
||||
|
||||
Args:
|
||||
images: Images placeholder, from inputs().
|
||||
hidden1_units: Size of the first hidden layer.
|
||||
hidden2_units: Size of the second hidden layer.
|
||||
|
||||
Returns:
|
||||
softmax_linear: Output tensor with the computed logits.
|
||||
"""
|
||||
# Hidden 1
|
||||
with tf.compat.v1.name_scope('hidden1'):
|
||||
weights = tf.Variable(
|
||||
tf.random.truncated_normal(
|
||||
[IMAGE_PIXELS, hidden1_units],
|
||||
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')
|
||||
biases = tf.Variable(tf.zeros([hidden1_units]),
|
||||
name='biases')
|
||||
hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
|
||||
# Hidden 2
|
||||
with tf.compat.v1.name_scope('hidden2'):
|
||||
weights = tf.Variable(
|
||||
tf.random.truncated_normal(
|
||||
[hidden1_units, hidden2_units],
|
||||
stddev=1.0 / math.sqrt(float(hidden1_units))), name='weights')
|
||||
biases = tf.Variable(tf.zeros([hidden2_units]),
|
||||
name='biases')
|
||||
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
|
||||
# Linear
|
||||
with tf.compat.v1.name_scope('softmax_linear'):
|
||||
weights = tf.Variable(
|
||||
tf.random.truncated_normal(
|
||||
[hidden2_units, NUM_CLASSES],
|
||||
stddev=1.0 / math.sqrt(float(hidden2_units))), name='weights')
|
||||
biases = tf.Variable(tf.zeros([NUM_CLASSES]),
|
||||
name='biases')
|
||||
logits = tf.matmul(hidden2, weights) + biases
|
||||
return logits
|
||||
|
||||
|
||||
def loss(logits, labels):
|
||||
"""Calculates the loss from the logits and the labels.
|
||||
|
||||
Args:
|
||||
logits: Logits tensor, float - [batch_size, NUM_CLASSES].
|
||||
labels: Labels tensor, int32 - [batch_size].
|
||||
|
||||
Returns:
|
||||
loss: Loss tensor of type float.
|
||||
"""
|
||||
labels = tf.cast(labels, dtype=tf.int64)
|
||||
return tf.compat.v1.losses.sparse_softmax_cross_entropy(
|
||||
labels=labels, logits=logits)
|
||||
|
||||
|
||||
def training(loss, learning_rate):
|
||||
"""Sets up the training Ops.
|
||||
|
||||
Creates a summarizer to track the loss over time in TensorBoard.
|
||||
|
||||
Creates an optimizer and applies the gradients to all trainable variables.
|
||||
|
||||
The Op returned by this function is what must be passed to the
|
||||
`sess.run()` call to cause the model to train.
|
||||
|
||||
Args:
|
||||
loss: Loss tensor, from loss().
|
||||
learning_rate: The learning rate to use for gradient descent.
|
||||
|
||||
Returns:
|
||||
train_op: The Op for training.
|
||||
"""
|
||||
# Add a scalar summary for the snapshot loss.
|
||||
tf.compat.v1.summary.scalar('loss', loss)
|
||||
# Create the gradient descent optimizer with the given learning rate.
|
||||
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate)
|
||||
# Create a variable to track the global step.
|
||||
global_step = tf.Variable(0, name='global_step', trainable=False)
|
||||
# Use the optimizer to apply the gradients that minimize the loss
|
||||
# (and also increment the global step counter) as a single training step.
|
||||
train_op = optimizer.minimize(loss, global_step=global_step)
|
||||
return train_op
|
||||
|
||||
|
||||
def evaluation(logits, labels):
|
||||
"""Evaluate the quality of the logits at predicting the label.
|
||||
|
||||
Args:
|
||||
logits: Logits tensor, float - [batch_size, NUM_CLASSES].
|
||||
labels: Labels tensor, int32 - [batch_size], with values in the
|
||||
range [0, NUM_CLASSES).
|
||||
|
||||
Returns:
|
||||
A scalar int32 tensor with the number of examples (out of batch_size)
|
||||
that were predicted correctly.
|
||||
"""
|
||||
# For a classifier model, we can use the in_top_k Op.
|
||||
# It returns a bool tensor with shape [batch_size] that is true for
|
||||
# the examples where the label is in the top k (here k=1)
|
||||
# of all logits for that example.
|
||||
correct = tf.nn.in_top_k(predictions=logits, targets=labels, k=1)
|
||||
# Return the number of true entries.
|
||||
return tf.reduce_sum(input_tensor=tf.cast(correct, tf.int32))
|
@ -1,107 +0,0 @@
|
||||
# Copyright 2015 The TensorFlow Authors. 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.apache.org/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.
|
||||
# ==============================================================================
|
||||
"""Simple MNIST classifier example with JIT XLA and timelines.
|
||||
|
||||
Note: Please see further comments in the BUILD file to invoke XLA.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
from tensorflow.python.client import timeline
|
||||
|
||||
FLAGS = None
|
||||
|
||||
|
||||
def main(_):
|
||||
# Import data
|
||||
mnist = input_data.read_data_sets(FLAGS.data_dir)
|
||||
|
||||
# Create the model
|
||||
x = tf.placeholder(tf.float32, [None, 784])
|
||||
w = tf.Variable(tf.zeros([784, 10]))
|
||||
b = tf.Variable(tf.zeros([10]))
|
||||
y = tf.matmul(x, w) + b
|
||||
|
||||
# Define loss and optimizer
|
||||
y_ = tf.placeholder(tf.int64, [None])
|
||||
|
||||
# The raw formulation of cross-entropy,
|
||||
#
|
||||
# tf.reduce_mean(-tf.reduce_sum(y_ * tf.math.log(tf.nn.softmax(y)),
|
||||
# reduction_indices=[1]))
|
||||
#
|
||||
# can be numerically unstable.
|
||||
#
|
||||
# So here we use tf.compat.v1.losses.sparse_softmax_cross_entropy on the raw
|
||||
# logit outputs of 'y', and then average across the batch.
|
||||
cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)
|
||||
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
|
||||
|
||||
config = tf.ConfigProto()
|
||||
jit_level = 0
|
||||
if FLAGS.xla:
|
||||
# Turns on XLA JIT compilation.
|
||||
jit_level = tf.OptimizerOptions.ON_1
|
||||
|
||||
config.graph_options.optimizer_options.global_jit_level = jit_level
|
||||
run_metadata = tf.RunMetadata()
|
||||
sess = tf.compat.v1.Session(config=config)
|
||||
tf.global_variables_initializer().run(session=sess)
|
||||
# Train
|
||||
train_loops = 1000
|
||||
for i in range(train_loops):
|
||||
batch_xs, batch_ys = mnist.train.next_batch(100)
|
||||
|
||||
# Create a timeline for the last loop and export to json to view with
|
||||
# chrome://tracing/.
|
||||
if i == train_loops - 1:
|
||||
sess.run(train_step,
|
||||
feed_dict={x: batch_xs,
|
||||
y_: batch_ys},
|
||||
options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE),
|
||||
run_metadata=run_metadata)
|
||||
trace = timeline.Timeline(step_stats=run_metadata.step_stats)
|
||||
with open('/tmp/timeline.ctf.json', 'w') as trace_file:
|
||||
trace_file.write(trace.generate_chrome_trace_format())
|
||||
else:
|
||||
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
|
||||
|
||||
# Test trained model
|
||||
correct_prediction = tf.equal(tf.argmax(y, 1), y_)
|
||||
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
|
||||
print(sess.run(accuracy,
|
||||
feed_dict={x: mnist.test.images,
|
||||
y_: mnist.test.labels}))
|
||||
sess.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'--data_dir',
|
||||
type=str,
|
||||
default='/tmp/tensorflow/mnist/input_data',
|
||||
help='Directory for storing input data')
|
||||
parser.add_argument(
|
||||
'--xla', type=bool, default=True, help='Turn xla via JIT on')
|
||||
FLAGS, unparsed = parser.parse_known_args()
|
||||
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
|
@ -1,217 +0,0 @@
|
||||
# Copyright 2015 The TensorFlow Authors. 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.apache.org/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 simple MNIST classifier which displays summaries in TensorBoard.
|
||||
|
||||
This is an unimpressive MNIST model, but it is a good example of using
|
||||
tf.name_scope to make a graph legible in the TensorBoard graph explorer, and of
|
||||
naming summary tags so that they are grouped meaningfully in TensorBoard.
|
||||
|
||||
It demonstrates the functionality of every TensorBoard dashboard.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
import tensorflow as tf
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
|
||||
FLAGS = None
|
||||
|
||||
|
||||
def train():
|
||||
# Import data
|
||||
mnist = input_data.read_data_sets(FLAGS.data_dir,
|
||||
fake_data=FLAGS.fake_data)
|
||||
|
||||
sess = tf.compat.v1.InteractiveSession()
|
||||
# Create a multilayer model.
|
||||
|
||||
# Input placeholders
|
||||
with tf.compat.v1.name_scope('input'):
|
||||
x = tf.compat.v1.placeholder(tf.float32, [None, 784], name='x-input')
|
||||
y_ = tf.compat.v1.placeholder(tf.int64, [None], name='y-input')
|
||||
|
||||
with tf.compat.v1.name_scope('input_reshape'):
|
||||
image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
|
||||
tf.compat.v1.summary.image('input', image_shaped_input, 10)
|
||||
|
||||
# We can't initialize these variables to 0 - the network will get stuck.
|
||||
def weight_variable(shape):
|
||||
"""Create a weight variable with appropriate initialization."""
|
||||
initial = tf.random.truncated_normal(shape, stddev=0.1)
|
||||
return tf.Variable(initial)
|
||||
|
||||
def bias_variable(shape):
|
||||
"""Create a bias variable with appropriate initialization."""
|
||||
initial = tf.constant(0.1, shape=shape)
|
||||
return tf.Variable(initial)
|
||||
|
||||
def variable_summaries(var):
|
||||
"""Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
|
||||
with tf.compat.v1.name_scope('summaries'):
|
||||
mean = tf.reduce_mean(input_tensor=var)
|
||||
tf.compat.v1.summary.scalar('mean', mean)
|
||||
with tf.compat.v1.name_scope('stddev'):
|
||||
stddev = tf.sqrt(tf.reduce_mean(input_tensor=tf.square(var - mean)))
|
||||
tf.compat.v1.summary.scalar('stddev', stddev)
|
||||
tf.compat.v1.summary.scalar('max', tf.reduce_max(input_tensor=var))
|
||||
tf.compat.v1.summary.scalar('min', tf.reduce_min(input_tensor=var))
|
||||
tf.compat.v1.summary.histogram('histogram', var)
|
||||
|
||||
def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
|
||||
"""Reusable code for making a simple neural net layer.
|
||||
|
||||
It does a matrix multiply, bias add, and then uses ReLU to nonlinearize.
|
||||
It also sets up name scoping so that the resultant graph is easy to read,
|
||||
and adds a number of summary ops.
|
||||
"""
|
||||
# Adding a name scope ensures logical grouping of the layers in the graph.
|
||||
with tf.compat.v1.name_scope(layer_name):
|
||||
# This Variable will hold the state of the weights for the layer
|
||||
with tf.compat.v1.name_scope('weights'):
|
||||
weights = weight_variable([input_dim, output_dim])
|
||||
variable_summaries(weights)
|
||||
with tf.compat.v1.name_scope('biases'):
|
||||
biases = bias_variable([output_dim])
|
||||
variable_summaries(biases)
|
||||
with tf.compat.v1.name_scope('Wx_plus_b'):
|
||||
preactivate = tf.matmul(input_tensor, weights) + biases
|
||||
tf.compat.v1.summary.histogram('pre_activations', preactivate)
|
||||
activations = act(preactivate, name='activation')
|
||||
tf.compat.v1.summary.histogram('activations', activations)
|
||||
return activations
|
||||
|
||||
hidden1 = nn_layer(x, 784, 500, 'layer1')
|
||||
|
||||
with tf.compat.v1.name_scope('dropout'):
|
||||
keep_prob = tf.compat.v1.placeholder(tf.float32)
|
||||
tf.compat.v1.summary.scalar('dropout_keep_probability', keep_prob)
|
||||
dropped = tf.nn.dropout(hidden1, rate=(1 - keep_prob))
|
||||
|
||||
# Do not apply softmax activation yet, see below.
|
||||
y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)
|
||||
|
||||
with tf.compat.v1.name_scope('cross_entropy'):
|
||||
# The raw formulation of cross-entropy,
|
||||
#
|
||||
# tf.reduce_mean(-tf.reduce_sum(y_ * tf.math.log(tf.softmax(y)),
|
||||
# reduction_indices=[1]))
|
||||
#
|
||||
# can be numerically unstable.
|
||||
#
|
||||
# So here we use tf.compat.v1.losses.sparse_softmax_cross_entropy on the
|
||||
# raw logit outputs of the nn_layer above, and then average across
|
||||
# the batch.
|
||||
with tf.compat.v1.name_scope('total'):
|
||||
cross_entropy = tf.compat.v1.losses.sparse_softmax_cross_entropy(
|
||||
labels=y_, logits=y)
|
||||
tf.compat.v1.summary.scalar('cross_entropy', cross_entropy)
|
||||
|
||||
with tf.compat.v1.name_scope('train'):
|
||||
train_step = tf.compat.v1.train.AdamOptimizer(FLAGS.learning_rate).minimize(
|
||||
cross_entropy)
|
||||
|
||||
with tf.compat.v1.name_scope('accuracy'):
|
||||
with tf.compat.v1.name_scope('correct_prediction'):
|
||||
correct_prediction = tf.equal(tf.argmax(input=y, axis=1), y_)
|
||||
with tf.compat.v1.name_scope('accuracy'):
|
||||
accuracy = tf.reduce_mean(input_tensor=tf.cast(correct_prediction,
|
||||
tf.float32))
|
||||
tf.compat.v1.summary.scalar('accuracy', accuracy)
|
||||
|
||||
# Merge all the summaries and write them out to
|
||||
# /tmp/tensorflow/mnist/logs/mnist_with_summaries (by default)
|
||||
merged = tf.compat.v1.summary.merge_all()
|
||||
train_writer = tf.compat.v1.summary.FileWriter(FLAGS.log_dir + '/train',
|
||||
sess.graph)
|
||||
test_writer = tf.compat.v1.summary.FileWriter(FLAGS.log_dir + '/test')
|
||||
tf.compat.v1.global_variables_initializer().run()
|
||||
|
||||
# Train the model, and also write summaries.
|
||||
# Every 10th step, measure test-set accuracy, and write test summaries
|
||||
# All other steps, run train_step on training data, & add training summaries
|
||||
|
||||
def feed_dict(train):
|
||||
"""Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
|
||||
if train or FLAGS.fake_data:
|
||||
xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
|
||||
k = FLAGS.dropout
|
||||
else:
|
||||
xs, ys = mnist.test.images, mnist.test.labels
|
||||
k = 1.0
|
||||
return {x: xs, y_: ys, keep_prob: k}
|
||||
|
||||
for i in range(FLAGS.max_steps):
|
||||
if i % 10 == 0: # Record summaries and test-set accuracy
|
||||
summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
|
||||
test_writer.add_summary(summary, i)
|
||||
print('Accuracy at step %s: %s' % (i, acc))
|
||||
else: # Record train set summaries, and train
|
||||
if i % 100 == 99: # Record execution stats
|
||||
run_options = tf.compat.v1.RunOptions(
|
||||
trace_level=tf.compat.v1.RunOptions.FULL_TRACE)
|
||||
run_metadata = tf.compat.v1.RunMetadata()
|
||||
summary, _ = sess.run([merged, train_step],
|
||||
feed_dict=feed_dict(True),
|
||||
options=run_options,
|
||||
run_metadata=run_metadata)
|
||||
train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
|
||||
train_writer.add_summary(summary, i)
|
||||
print('Adding run metadata for', i)
|
||||
else: # Record a summary
|
||||
summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
|
||||
train_writer.add_summary(summary, i)
|
||||
train_writer.close()
|
||||
test_writer.close()
|
||||
|
||||
|
||||
def main(_):
|
||||
if tf.io.gfile.exists(FLAGS.log_dir):
|
||||
tf.io.gfile.rmtree(FLAGS.log_dir)
|
||||
tf.io.gfile.makedirs(FLAGS.log_dir)
|
||||
with tf.Graph().as_default():
|
||||
train()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--fake_data', nargs='?', const=True, type=bool,
|
||||
default=False,
|
||||
help='If true, uses fake data for unit testing.')
|
||||
parser.add_argument('--max_steps', type=int, default=1000,
|
||||
help='Number of steps to run trainer.')
|
||||
parser.add_argument('--learning_rate', type=float, default=0.001,
|
||||
help='Initial learning rate')
|
||||
parser.add_argument('--dropout', type=float, default=0.9,
|
||||
help='Keep probability for training dropout.')
|
||||
parser.add_argument(
|
||||
'--data_dir',
|
||||
type=str,
|
||||
default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),
|
||||
'tensorflow/mnist/input_data'),
|
||||
help='Directory for storing input data')
|
||||
parser.add_argument(
|
||||
'--log_dir',
|
||||
type=str,
|
||||
default=os.path.join(os.getenv('TEST_TMPDIR', '/tmp'),
|
||||
'tensorflow/mnist/logs/mnist_with_summaries'),
|
||||
help='Summaries log directory')
|
||||
FLAGS, unparsed = parser.parse_known_args()
|
||||
tf.compat.v1.app.run(main=main, argv=[sys.argv[0]] + unparsed)
|
@ -1,25 +0,0 @@
|
||||
# Description:
|
||||
# TensorFlow model for word2vec
|
||||
|
||||
package(
|
||||
default_visibility = ["//tensorflow:internal"],
|
||||
licenses = ["notice"], # Apache 2.0
|
||||
)
|
||||
|
||||
exports_files(["LICENSE"])
|
||||
|
||||
py_binary(
|
||||
name = "word2vec_basic",
|
||||
srcs = [
|
||||
"word2vec_basic.py",
|
||||
],
|
||||
python_version = "PY3",
|
||||
srcs_version = "PY2AND3",
|
||||
tags = [
|
||||
"no-internal-py3",
|
||||
],
|
||||
deps = [
|
||||
"//tensorflow:tensorflow_py",
|
||||
"//third_party/py/numpy",
|
||||
],
|
||||
)
|
@ -1,376 +0,0 @@
|
||||
# Copyright 2015 The TensorFlow Authors. 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.apache.org/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.
|
||||
# ==============================================================================
|
||||
"""Basic word2vec example."""
|
||||
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import collections
|
||||
import hashlib
|
||||
import math
|
||||
import os
|
||||
import random
|
||||
import sys
|
||||
from tempfile import gettempdir
|
||||
import zipfile
|
||||
|
||||
import numpy as np
|
||||
from six.moves import urllib
|
||||
from six.moves import xrange # pylint: disable=redefined-builtin
|
||||
import tensorflow as tf
|
||||
|
||||
from tensorflow.contrib.tensorboard.plugins import projector
|
||||
|
||||
data_index = 0
|
||||
|
||||
|
||||
def _hash_file(fpath):
|
||||
hasher = hashlib.sha256()
|
||||
with open(fpath, 'rb') as fpath_file:
|
||||
for chunk in iter(lambda: fpath_file.read(65535), b''):
|
||||
hasher.update(chunk)
|
||||
return hasher.hexdigest()
|
||||
|
||||
|
||||
def word2vec_basic(log_dir):
|
||||
"""Example of building, training and visualizing a word2vec model."""
|
||||
# Create the directory for TensorBoard variables if there is not.
|
||||
if not os.path.exists(log_dir):
|
||||
os.makedirs(log_dir)
|
||||
|
||||
# Step 1: Download the data.
|
||||
# Note: Source website does not support HTTPS right now.
|
||||
url = 'http://mattmahoney.net/dc/'
|
||||
|
||||
# pylint: disable=redefined-outer-name
|
||||
def maybe_download(filename, expected_bytes, sha256=None):
|
||||
"""Download a file if not present, and make sure it's the right size."""
|
||||
local_filename = os.path.join(gettempdir(), filename)
|
||||
if not os.path.exists(local_filename):
|
||||
local_filename, _ = urllib.request.urlretrieve(url + filename,
|
||||
local_filename)
|
||||
statinfo = os.stat(local_filename)
|
||||
|
||||
if sha256 and _hash_file(local_filename) != sha256:
|
||||
raise Exception('Failed to verify ' + local_filename + ' due to hash '
|
||||
'mismatch. Can you get to it with a browser?')
|
||||
|
||||
if statinfo.st_size == expected_bytes:
|
||||
print('Found and verified', filename)
|
||||
else:
|
||||
print(statinfo.st_size)
|
||||
raise Exception('Failed to verify ' + local_filename +
|
||||
'. Can you get to it with a browser?')
|
||||
return local_filename
|
||||
|
||||
filename = maybe_download(
|
||||
'text8.zip',
|
||||
31344016,
|
||||
sha256='a6640522afe85d1963ad56c05b0ede0a0c000dddc9671758a6cc09b7a38e5232')
|
||||
|
||||
# Read the data into a list of strings.
|
||||
def read_data(filename):
|
||||
"""Extract the first file enclosed in a zip file as a list of words."""
|
||||
with zipfile.ZipFile(filename) as f:
|
||||
data = tf.compat.as_str(f.read(f.namelist()[0])).split()
|
||||
return data
|
||||
|
||||
vocabulary = read_data(filename)
|
||||
print('Data size', len(vocabulary))
|
||||
|
||||
# Step 2: Build the dictionary and replace rare words with UNK token.
|
||||
vocabulary_size = 50000
|
||||
|
||||
def build_dataset(words, n_words):
|
||||
"""Process raw inputs into a dataset."""
|
||||
count = [['UNK', -1]]
|
||||
count.extend(collections.Counter(words).most_common(n_words - 1))
|
||||
dictionary = {word: index for index, (word, _) in enumerate(count)}
|
||||
data = []
|
||||
unk_count = 0
|
||||
for word in words:
|
||||
index = dictionary.get(word, 0)
|
||||
if index == 0: # dictionary['UNK']
|
||||
unk_count += 1
|
||||
data.append(index)
|
||||
count[0][1] = unk_count
|
||||
reversed_dictionary = dict(zip(dictionary.values(), dictionary.keys()))
|
||||
return data, count, dictionary, reversed_dictionary
|
||||
|
||||
# Filling 4 global variables:
|
||||
# data - list of codes (integers from 0 to vocabulary_size-1).
|
||||
# This is the original text but words are replaced by their codes
|
||||
# count - map of words(strings) to count of occurrences
|
||||
# dictionary - map of words(strings) to their codes(integers)
|
||||
# reverse_dictionary - map of codes(integers) to words(strings)
|
||||
data, count, unused_dictionary, reverse_dictionary = build_dataset(
|
||||
vocabulary, vocabulary_size)
|
||||
del vocabulary # Hint to reduce memory.
|
||||
print('Most common words (+UNK)', count[:5])
|
||||
print('Sample data', data[:10], [reverse_dictionary[i] for i in data[:10]])
|
||||
|
||||
# Step 3: Function to generate a training batch for the skip-gram model.
|
||||
def generate_batch(batch_size, num_skips, skip_window):
|
||||
global data_index
|
||||
assert batch_size % num_skips == 0
|
||||
assert num_skips <= 2 * skip_window
|
||||
batch = np.ndarray(shape=(batch_size), dtype=np.int32)
|
||||
labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)
|
||||
span = 2 * skip_window + 1 # [ skip_window target skip_window ]
|
||||
buffer = collections.deque(maxlen=span) # pylint: disable=redefined-builtin
|
||||
if data_index + span > len(data):
|
||||
data_index = 0
|
||||
buffer.extend(data[data_index:data_index + span])
|
||||
data_index += span
|
||||
for i in range(batch_size // num_skips):
|
||||
context_words = [w for w in range(span) if w != skip_window]
|
||||
words_to_use = random.sample(context_words, num_skips)
|
||||
for j, context_word in enumerate(words_to_use):
|
||||
batch[i * num_skips + j] = buffer[skip_window]
|
||||
labels[i * num_skips + j, 0] = buffer[context_word]
|
||||
if data_index == len(data):
|
||||
buffer.extend(data[0:span])
|
||||
data_index = span
|
||||
else:
|
||||
buffer.append(data[data_index])
|
||||
data_index += 1
|
||||
# Backtrack a little bit to avoid skipping words in the end of a batch
|
||||
data_index = (data_index - span) % len(data)
|
||||
return batch, labels
|
||||
|
||||
batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)
|
||||
for i in range(8):
|
||||
print(batch[i], reverse_dictionary[batch[i]], '->', labels[i, 0],
|
||||
reverse_dictionary[labels[i, 0]])
|
||||
|
||||
# Step 4: Build and train a skip-gram model.
|
||||
|
||||
batch_size = 128
|
||||
embedding_size = 128 # Dimension of the embedding vector.
|
||||
skip_window = 1 # How many words to consider left and right.
|
||||
num_skips = 2 # How many times to reuse an input to generate a label.
|
||||
num_sampled = 64 # Number of negative examples to sample.
|
||||
|
||||
# We pick a random validation set to sample nearest neighbors. Here we limit
|
||||
# the validation samples to the words that have a low numeric ID, which by
|
||||
# construction are also the most frequent. These 3 variables are used only for
|
||||
# displaying model accuracy, they don't affect calculation.
|
||||
valid_size = 16 # Random set of words to evaluate similarity on.
|
||||
valid_window = 100 # Only pick dev samples in the head of the distribution.
|
||||
valid_examples = np.random.choice(valid_window, valid_size, replace=False)
|
||||
|
||||
graph = tf.Graph()
|
||||
|
||||
with graph.as_default():
|
||||
|
||||
# Input data.
|
||||
with tf.name_scope('inputs'):
|
||||
train_inputs = tf.placeholder(tf.int32, shape=[batch_size])
|
||||
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
|
||||
valid_dataset = tf.constant(valid_examples, dtype=tf.int32)
|
||||
|
||||
# Ops and variables pinned to the CPU because of missing GPU implementation
|
||||
with tf.device('/cpu:0'):
|
||||
# Look up embeddings for inputs.
|
||||
with tf.name_scope('embeddings'):
|
||||
embeddings = tf.Variable(
|
||||
tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
|
||||
embed = tf.nn.embedding_lookup(embeddings, train_inputs)
|
||||
|
||||
# Construct the variables for the NCE loss
|
||||
with tf.name_scope('weights'):
|
||||
nce_weights = tf.Variable(
|
||||
tf.truncated_normal([vocabulary_size, embedding_size],
|
||||
stddev=1.0 / math.sqrt(embedding_size)))
|
||||
with tf.name_scope('biases'):
|
||||
nce_biases = tf.Variable(tf.zeros([vocabulary_size]))
|
||||
|
||||
# Compute the average NCE loss for the batch.
|
||||
# tf.nce_loss automatically draws a new sample of the negative labels each
|
||||
# time we evaluate the loss.
|
||||
# Explanation of the meaning of NCE loss and why choosing NCE over tf.nn.sampled_softmax_loss:
|
||||
# http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
|
||||
# http://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf
|
||||
with tf.name_scope('loss'):
|
||||
loss = tf.reduce_mean(
|
||||
tf.nn.nce_loss(
|
||||
weights=nce_weights,
|
||||
biases=nce_biases,
|
||||
labels=train_labels,
|
||||
inputs=embed,
|
||||
num_sampled=num_sampled,
|
||||
num_classes=vocabulary_size))
|
||||
|
||||
# Add the loss value as a scalar to summary.
|
||||
tf.summary.scalar('loss', loss)
|
||||
|
||||
# Construct the SGD optimizer using a learning rate of 1.0.
|
||||
with tf.name_scope('optimizer'):
|
||||
optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
|
||||
|
||||
# Compute the cosine similarity between minibatch examples and all
|
||||
# embeddings.
|
||||
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keepdims=True))
|
||||
normalized_embeddings = embeddings / norm
|
||||
valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings,
|
||||
valid_dataset)
|
||||
similarity = tf.matmul(
|
||||
valid_embeddings, normalized_embeddings, transpose_b=True)
|
||||
|
||||
# Merge all summaries.
|
||||
merged = tf.summary.merge_all()
|
||||
|
||||
# Add variable initializer.
|
||||
init = tf.global_variables_initializer()
|
||||
|
||||
# Create a saver.
|
||||
saver = tf.train.Saver()
|
||||
|
||||
# Step 5: Begin training.
|
||||
num_steps = 100001
|
||||
|
||||
with tf.compat.v1.Session(graph=graph) as session:
|
||||
# Open a writer to write summaries.
|
||||
writer = tf.summary.FileWriter(log_dir, session.graph)
|
||||
|
||||
# We must initialize all variables before we use them.
|
||||
init.run()
|
||||
print('Initialized')
|
||||
|
||||
average_loss = 0
|
||||
for step in xrange(num_steps):
|
||||
batch_inputs, batch_labels = generate_batch(batch_size, num_skips,
|
||||
skip_window)
|
||||
feed_dict = {train_inputs: batch_inputs, train_labels: batch_labels}
|
||||
|
||||
# Define metadata variable.
|
||||
run_metadata = tf.RunMetadata()
|
||||
|
||||
# We perform one update step by evaluating the optimizer op (including it
|
||||
# in the list of returned values for session.run()
|
||||
# Also, evaluate the merged op to get all summaries from the returned
|
||||
# "summary" variable. Feed metadata variable to session for visualizing
|
||||
# the graph in TensorBoard.
|
||||
_, summary, loss_val = session.run([optimizer, merged, loss],
|
||||
feed_dict=feed_dict,
|
||||
run_metadata=run_metadata)
|
||||
average_loss += loss_val
|
||||
|
||||
# Add returned summaries to writer in each step.
|
||||
writer.add_summary(summary, step)
|
||||
# Add metadata to visualize the graph for the last run.
|
||||
if step == (num_steps - 1):
|
||||
writer.add_run_metadata(run_metadata, 'step%d' % step)
|
||||
|
||||
if step % 2000 == 0:
|
||||
if step > 0:
|
||||
average_loss /= 2000
|
||||
# The average loss is an estimate of the loss over the last 2000
|
||||
# batches.
|
||||
print('Average loss at step ', step, ': ', average_loss)
|
||||
average_loss = 0
|
||||
|
||||
# Note that this is expensive (~20% slowdown if computed every 500 steps)
|
||||
if step % 10000 == 0:
|
||||
sim = similarity.eval()
|
||||
for i in xrange(valid_size):
|
||||
valid_word = reverse_dictionary[valid_examples[i]]
|
||||
top_k = 8 # number of nearest neighbors
|
||||
nearest = (-sim[i, :]).argsort()[1:top_k + 1]
|
||||
log_str = 'Nearest to %s:' % valid_word
|
||||
|
||||
print(
|
||||
log_str,
|
||||
', '.join([reverse_dictionary[nearest[k]] for k in range(top_k)]))
|
||||
final_embeddings = normalized_embeddings.eval()
|
||||
|
||||
# Write corresponding labels for the embeddings.
|
||||
with open(log_dir + '/metadata.tsv', 'w') as f:
|
||||
for i in xrange(vocabulary_size):
|
||||
f.write(reverse_dictionary[i] + '\n')
|
||||
|
||||
# Save the model for checkpoints.
|
||||
saver.save(session, os.path.join(log_dir, 'model.ckpt'))
|
||||
|
||||
# Create a configuration for visualizing embeddings with the labels in
|
||||
# TensorBoard.
|
||||
config = projector.ProjectorConfig()
|
||||
embedding_conf = config.embeddings.add()
|
||||
embedding_conf.tensor_name = embeddings.name
|
||||
embedding_conf.metadata_path = os.path.join(log_dir, 'metadata.tsv')
|
||||
projector.visualize_embeddings(writer, config)
|
||||
|
||||
writer.close()
|
||||
|
||||
# Step 6: Visualize the embeddings.
|
||||
|
||||
# pylint: disable=missing-docstring
|
||||
# Function to draw visualization of distance between embeddings.
|
||||
def plot_with_labels(low_dim_embs, labels, filename):
|
||||
assert low_dim_embs.shape[0] >= len(labels), 'More labels than embeddings'
|
||||
plt.figure(figsize=(18, 18)) # in inches
|
||||
for i, label in enumerate(labels):
|
||||
x, y = low_dim_embs[i, :]
|
||||
plt.scatter(x, y)
|
||||
plt.annotate(
|
||||
label,
|
||||
xy=(x, y),
|
||||
xytext=(5, 2),
|
||||
textcoords='offset points',
|
||||
ha='right',
|
||||
va='bottom')
|
||||
|
||||
plt.savefig(filename)
|
||||
|
||||
try:
|
||||
# pylint: disable=g-import-not-at-top
|
||||
from sklearn.manifold import TSNE
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
tsne = TSNE(
|
||||
perplexity=30, n_components=2, init='pca', n_iter=5000, method='exact')
|
||||
plot_only = 500
|
||||
low_dim_embs = tsne.fit_transform(final_embeddings[:plot_only, :])
|
||||
labels = [reverse_dictionary[i] for i in xrange(plot_only)]
|
||||
plot_with_labels(low_dim_embs, labels, os.path.join(gettempdir(),
|
||||
'tsne.png'))
|
||||
|
||||
except ImportError as ex:
|
||||
print('Please install sklearn, matplotlib, and scipy to show embeddings.')
|
||||
print(ex)
|
||||
|
||||
|
||||
# All functionality is run after tf.compat.v1.app.run() (b/122547914). This
|
||||
# could be split up but the methods are laid sequentially with their usage for
|
||||
# clarity.
|
||||
def main(unused_argv):
|
||||
# Give a folder path as an argument with '--log_dir' to save
|
||||
# TensorBoard summaries. Default is a log folder in current directory.
|
||||
current_path = os.path.dirname(os.path.realpath(sys.argv[0]))
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'--log_dir',
|
||||
type=str,
|
||||
default=os.path.join(current_path, 'log'),
|
||||
help='The log directory for TensorBoard summaries.')
|
||||
flags, unused_flags = parser.parse_known_args()
|
||||
word2vec_basic(flags.log_dir)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
tf.app.run()
|
@ -5,6 +5,19 @@ package(
|
||||
licenses = ["notice"], # Apache 2.0
|
||||
)
|
||||
|
||||
py_library(
|
||||
name = "input_data",
|
||||
srcs = ["input_data.py"],
|
||||
srcs_version = "PY2AND3",
|
||||
visibility = ["//visibility:private"],
|
||||
deps = [
|
||||
"//tensorflow/python:framework",
|
||||
"//tensorflow/python:platform",
|
||||
"//third_party/py/numpy",
|
||||
"@six_archive//:six",
|
||||
],
|
||||
)
|
||||
|
||||
py_library(
|
||||
name = "rnn",
|
||||
srcs = ["rnn.py"],
|
||||
@ -44,10 +57,10 @@ py_test(
|
||||
"no_pip",
|
||||
],
|
||||
deps = [
|
||||
":input_data",
|
||||
":rnn",
|
||||
":rnn_cell",
|
||||
"//tensorflow:tensorflow_py",
|
||||
"//tensorflow/examples/tutorials/mnist:input_data",
|
||||
"//tensorflow/lite/python:lite",
|
||||
"//tensorflow/python:framework",
|
||||
"//tensorflow/python:platform",
|
||||
@ -67,10 +80,10 @@ py_test(
|
||||
"no_pip",
|
||||
],
|
||||
deps = [
|
||||
":input_data",
|
||||
":rnn",
|
||||
":rnn_cell",
|
||||
"//tensorflow:tensorflow_py",
|
||||
"//tensorflow/examples/tutorials/mnist:input_data",
|
||||
"//tensorflow/lite/python:lite",
|
||||
"//tensorflow/python:framework_test_lib",
|
||||
"//tensorflow/python:platform",
|
||||
@ -90,10 +103,10 @@ py_test(
|
||||
"no_pip",
|
||||
],
|
||||
deps = [
|
||||
":input_data",
|
||||
":rnn",
|
||||
":rnn_cell",
|
||||
"//tensorflow:tensorflow_py",
|
||||
"//tensorflow/examples/tutorials/mnist:input_data",
|
||||
"//tensorflow/lite/python:lite",
|
||||
"//tensorflow/python:framework_test_lib",
|
||||
"//tensorflow/python:platform",
|
||||
@ -113,10 +126,10 @@ py_test(
|
||||
"no_pip",
|
||||
],
|
||||
deps = [
|
||||
":input_data",
|
||||
":rnn",
|
||||
":rnn_cell",
|
||||
"//tensorflow:tensorflow_py",
|
||||
"//tensorflow/examples/tutorials/mnist:input_data",
|
||||
"//tensorflow/lite/python:lite",
|
||||
"//tensorflow/python:framework_test_lib",
|
||||
"//tensorflow/python:platform",
|
||||
|
@ -22,7 +22,7 @@ import numpy as np
|
||||
from six.moves import range
|
||||
import tensorflow.compat.v1 as tf
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
from tensorflow.lite.experimental.examples.lstm import input_data
|
||||
from tensorflow.lite.experimental.examples.lstm.rnn import bidirectional_dynamic_rnn
|
||||
from tensorflow.python.framework import test_util
|
||||
from tensorflow.python.platform import test
|
||||
|
@ -22,7 +22,7 @@ import numpy as np
|
||||
from six.moves import range
|
||||
import tensorflow.compat.v1 as tf
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
from tensorflow.lite.experimental.examples.lstm import input_data
|
||||
from tensorflow.lite.experimental.examples.lstm.rnn import bidirectional_dynamic_rnn
|
||||
from tensorflow.python.framework import test_util
|
||||
from tensorflow.python.platform import test
|
||||
|
@ -25,6 +25,7 @@ import collections
|
||||
import gzip
|
||||
import os
|
||||
|
||||
|
||||
import numpy
|
||||
from six.moves import urllib
|
||||
from six.moves import xrange # pylint: disable=redefined-builtin
|
||||
@ -138,7 +139,7 @@ class _DataSet(object):
|
||||
Args:
|
||||
images: The images
|
||||
labels: The labels
|
||||
fake_data: Ignore images and labels, use fake data.
|
||||
fake_data: Ignore inages and labels, use fake data.
|
||||
one_hot: Bool, return the labels as one hot vectors (if True) or ints (if
|
||||
False).
|
||||
dtype: Output image dtype. One of [uint8, float32]. `uint8` output has
|
||||
@ -330,3 +331,4 @@ def read_data_sets(train_dir,
|
||||
test = _DataSet(test_images, test_labels, **options)
|
||||
|
||||
return _Datasets(train=train, validation=validation, test=test)
|
||||
|
@ -22,7 +22,7 @@ import numpy as np
|
||||
from six.moves import range
|
||||
import tensorflow.compat.v1 as tf
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
from tensorflow.lite.experimental.examples.lstm import input_data
|
||||
from tensorflow.python.framework import test_util
|
||||
from tensorflow.python.platform import test
|
||||
|
||||
|
@ -22,7 +22,7 @@ import numpy as np
|
||||
from six.moves import range
|
||||
import tensorflow.compat.v1 as tf
|
||||
|
||||
from tensorflow.examples.tutorials.mnist import input_data
|
||||
from tensorflow.lite.experimental.examples.lstm import input_data
|
||||
from tensorflow.python.framework import test_util
|
||||
from tensorflow.python.platform import test
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user