Created
May 9, 2018 05:00
-
-
Save svjan5/d9eb1c78c10d695f7c50245ce21795c5 to your computer and use it in GitHub Desktop.
TF bug for multiple unused placeholders
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" Bi-directional Recurrent Neural Network. | |
A Bi-directional Recurrent Neural Network (LSTM) implementation example using | |
TensorFlow library. This example is using the MNIST database of handwritten | |
digits (http://yann.lecun.com/exdb/mnist/) | |
Links: | |
[Long Short Term Memory](http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf) | |
[MNIST Dataset](http://yann.lecun.com/exdb/mnist/). | |
Author: Aymeric Damien | |
Project: https://github.com/aymericdamien/TensorFlow-Examples/ | |
""" | |
from __future__ import print_function | |
import tensorflow as tf | |
from tensorflow.contrib import rnn | |
import numpy as np, random | |
# Import MNIST data | |
from tensorflow.examples.tutorials.mnist import input_data | |
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) | |
''' | |
To classify images using a bidirectional recurrent neural network, we consider | |
every image row as a sequence of pixels. Because MNIST image shape is 28*28px, | |
we will then handle 28 sequences of 28 steps for every sample. | |
''' | |
# Training Parameters | |
learning_rate = 0.001 | |
training_steps = 10000 | |
batch_size = 128 | |
display_step = 200 | |
# Network Parameters | |
num_input = 28 # MNIST data input (img shape: 28*28) | |
timesteps = 28 # timesteps | |
num_hidden = 128 # hidden layer num of features | |
num_classes = 10 # MNIST total classes (0-9 digits) | |
tf.set_random_seed(1234) | |
random.seed(1234) | |
np.random.seed(1234) | |
# tf Graph input | |
X = tf.placeholder("float", [None, timesteps, num_input]) | |
Y = tf.placeholder("float", [None, num_classes]) | |
# Define weights | |
weights = { | |
# Hidden layer weights => 2*n_hidden because of forward + backward cells | |
'out': tf.Variable(tf.random_normal([2*num_hidden, num_classes])) | |
} | |
biases = { | |
'out': tf.Variable(tf.random_normal([num_classes])) | |
} | |
def BiRNN(x, weights, biases): | |
# Prepare data shape to match `rnn` function requirements | |
# Current data input shape: (batch_size, timesteps, n_input) | |
# Required shape: 'timesteps' tensors list of shape (batch_size, num_input) | |
# Unstack to get a list of 'timesteps' tensors of shape (batch_size, num_input) | |
x = tf.unstack(x, timesteps, 1) | |
# Define lstm cells with tensorflow | |
# Forward direction cell | |
lstm_fw_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0) | |
# Backward direction cell | |
lstm_bw_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0) | |
# Get lstm cell output | |
try: | |
outputs, _, _ = rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x, | |
dtype=tf.float32) | |
except Exception: # Old TensorFlow version only returns outputs not states | |
outputs = rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x, | |
dtype=tf.float32) | |
# Linear activation, using rnn inner loop last output | |
return tf.matmul(outputs[-1], weights['out']) + biases['out'] | |
logits = BiRNN(X, weights, biases) | |
prediction = tf.nn.softmax(logits) | |
# Define loss and optimizer | |
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits( | |
logits=logits, labels=Y)) | |
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) | |
train_op = optimizer.minimize(loss_op) | |
# Evaluate model (with test logits, for dropout to be disabled) | |
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1)) | |
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) | |
# Initialize the variables (i.e. assign their default value) | |
init = tf.global_variables_initializer() | |
# Start training | |
config = tf.ConfigProto() | |
config.gpu_options.allow_growth = True | |
with tf.Session(config = config) as sess: | |
# Run the initializer | |
sess.run(init) | |
for step in range(1, training_steps+1): | |
batch_x, batch_y = mnist.train.next_batch(batch_size) | |
# Reshape data to get 28 seq of 28 elements | |
batch_x = batch_x.reshape((batch_size, timesteps, num_input)) | |
# Run optimization op (backprop) | |
sess.run(train_op, feed_dict={X: batch_x, Y: batch_y}) | |
if step % display_step == 0 or step == 1: | |
# Calculate batch loss and accuracy | |
loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, | |
Y: batch_y}) | |
print("Step " + str(step) + ", Minibatch Loss= " + \ | |
"{:.4f}".format(loss) + ", Training Accuracy= " + \ | |
"{:.3f}".format(acc)) | |
print("Optimization Finished!") | |
# Calculate accuracy for 128 mnist test images | |
test_len = 128 | |
test_data = mnist.test.images[:test_len].reshape((-1, timesteps, num_input)) | |
test_label = mnist.test.labels[:test_len] | |
print("Testing Accuracy:", \ | |
sess.run(accuracy, feed_dict={X: test_data, Y: test_label})) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" Bi-directional Recurrent Neural Network. | |
A Bi-directional Recurrent Neural Network (LSTM) implementation example using | |
TensorFlow library. This example is using the MNIST database of handwritten | |
digits (http://yann.lecun.com/exdb/mnist/) | |
Links: | |
[Long Short Term Memory](http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf) | |
[MNIST Dataset](http://yann.lecun.com/exdb/mnist/). | |
Author: Aymeric Damien | |
Project: https://github.com/aymericdamien/TensorFlow-Examples/ | |
""" | |
from __future__ import print_function | |
import tensorflow as tf | |
from tensorflow.contrib import rnn | |
import numpy as np, random | |
# Import MNIST data | |
from tensorflow.examples.tutorials.mnist import input_data | |
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) | |
''' | |
To classify images using a bidirectional recurrent neural network, we consider | |
every image row as a sequence of pixels. Because MNIST image shape is 28*28px, | |
we will then handle 28 sequences of 28 steps for every sample. | |
''' | |
tf.set_random_seed(1234) | |
random.seed(1234) | |
np.random.seed(1234) | |
# Training Parameters | |
learning_rate = 0.001 | |
training_steps = 10000 | |
batch_size = 128 | |
display_step = 200 | |
# Network Parameters | |
num_input = 28 # MNIST data input (img shape: 28*28) | |
timesteps = 28 # timesteps | |
num_hidden = 128 # hidden layer num of features | |
num_classes = 10 # MNIST total classes (0-9 digits) | |
# tf Graph input | |
X = tf.placeholder("float", [None, timesteps, num_input]) | |
Y = tf.placeholder("float", [None, num_classes]) | |
X1 = tf.placeholder("float", [None, timesteps, num_input]) | |
Y1 = tf.placeholder("float", [None, num_classes]) | |
X2 = tf.placeholder("float", [None, timesteps, num_input]) | |
Y2 = tf.placeholder("float", [None, num_classes]) | |
X3 = tf.placeholder("float", [None, timesteps, num_input]) | |
Y3 = tf.placeholder("float", [None, num_classes]) | |
X4 = tf.placeholder("float", [None, timesteps, num_input]) | |
Y4 = tf.placeholder("float", [None, num_classes]) | |
# Define weights | |
weights = { | |
# Hidden layer weights => 2*n_hidden because of forward + backward cells | |
'out': tf.Variable(tf.random_normal([2*num_hidden, num_classes])) | |
} | |
biases = { | |
'out': tf.Variable(tf.random_normal([num_classes])) | |
} | |
def BiRNN(x, weights, biases): | |
# Prepare data shape to match `rnn` function requirements | |
# Current data input shape: (batch_size, timesteps, n_input) | |
# Required shape: 'timesteps' tensors list of shape (batch_size, num_input) | |
# Unstack to get a list of 'timesteps' tensors of shape (batch_size, num_input) | |
x = tf.unstack(x, timesteps, 1) | |
# Define lstm cells with tensorflow | |
# Forward direction cell | |
lstm_fw_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0) | |
# Backward direction cell | |
lstm_bw_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0) | |
# Get lstm cell output | |
try: | |
outputs, _, _ = rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x, | |
dtype=tf.float32) | |
except Exception: # Old TensorFlow version only returns outputs not states | |
outputs = rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x, | |
dtype=tf.float32) | |
# Linear activation, using rnn inner loop last output | |
return tf.matmul(outputs[-1], weights['out']) + biases['out'] | |
logits = BiRNN(X, weights, biases) | |
prediction = tf.nn.softmax(logits) | |
# Define loss and optimizer | |
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits( | |
logits=logits, labels=Y)) | |
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) | |
train_op = optimizer.minimize(loss_op) | |
# Evaluate model (with test logits, for dropout to be disabled) | |
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1)) | |
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) | |
# Initialize the variables (i.e. assign their default value) | |
init = tf.global_variables_initializer() | |
# Start training | |
config = tf.ConfigProto() | |
config.gpu_options.allow_growth = True | |
with tf.Session(config = config) as sess: | |
# Run the initializer | |
sess.run(init) | |
for step in range(1, training_steps+1): | |
batch_x, batch_y = mnist.train.next_batch(batch_size) | |
# Reshape data to get 28 seq of 28 elements | |
batch_x = batch_x.reshape((batch_size, timesteps, num_input)) | |
# Run optimization op (backprop) | |
sess.run(train_op, feed_dict={X: batch_x, Y: batch_y}) | |
if step % display_step == 0 or step == 1: | |
# Calculate batch loss and accuracy | |
loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, | |
Y: batch_y}) | |
print("Step " + str(step) + ", Minibatch Loss= " + \ | |
"{:.4f}".format(loss) + ", Training Accuracy= " + \ | |
"{:.3f}".format(acc)) | |
print("Optimization Finished!") | |
# Calculate accuracy for 128 mnist test images | |
test_len = 128 | |
test_data = mnist.test.images[:test_len].reshape((-1, timesteps, num_input)) | |
test_label = mnist.test.labels[:test_len] | |
print("Testing Accuracy:", \ | |
sess.run(accuracy, feed_dict={X: test_data, Y: test_label})) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment