Skip to content

Instantly share code, notes, and snippets.

@hadifar
Created January 20, 2019 10:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hadifar/3154270878b82ec99e059384d1cd5849 to your computer and use it in GitHub Desktop.
Save hadifar/3154270878b82ec99e059384d1cd5849 to your computer and use it in GitHub Desktop.
import tensorflow as tf
vocabulary_size = 10000
embedding_size = 64
rnn_size = 64
batch_size = 512
# download dataset
(train_data, train_labels), (test_data, test_labels) = tf.keras.datasets.imdb.load_data(num_words=vocabulary_size)
# add zero padding to our data
train_data = tf.keras.preprocessing.sequence.pad_sequences(train_data, maxlen=256)
test_data = tf.keras.preprocessing.sequence.pad_sequences(test_data, maxlen=256)
# convert our np.data to tf.data.Dataset and create two iterators for test & train
training_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels)).repeat(5).shuffle(1024).batch(
batch_size)
test_dataset = tf.data.Dataset.from_tensor_slices((test_data, test_labels)).repeat(1).batch(batch_size)
iterator = tf.data.Iterator.from_structure(training_dataset.output_types,
training_dataset.output_shapes)
train_init_op = iterator.make_initializer(training_dataset)
test_init_op = iterator.make_initializer(test_dataset)
# Input data
x, y = iterator.get_next()
# it is a counter
global_step = tf.Variable(0, trainable=False)
# embedding matrix
embeddings_matrix = tf.get_variable("embedding", [vocabulary_size, embedding_size])
embed = tf.nn.embedding_lookup(embeddings_matrix, x) # batch x seq x embed_size
# our RNN variables
Wx = tf.get_variable(name='Wx', shape=[embedding_size, rnn_size])
Wh = tf.get_variable(name='Wh', shape=[rnn_size, rnn_size])
bias_rnn = tf.get_variable(name='brnn', initializer=tf.zeros([rnn_size]))
# single step in RNN
def rnn_step(prev_hidden_state, x):
return tf.tanh(tf.matmul(x, Wx) + tf.matmul(prev_hidden_state, Wh) + bias_rnn)
# our unroll function
# notice that our inputs should be transpose
hidden_states = tf.scan(fn=rnn_step,
elems=tf.transpose(embed, perm=[1, 0, 2]),
initializer=tf.zeros([batch_size, rnn_size]))
# covert to previous shape
outputs = tf.transpose(hidden_states, perm=[1, 0, 2])
# extract last hidden
last_rnn_output = outputs[:, -1, :]
# dense layers variables
Wd1 = tf.get_variable(name='dense1', shape=(rnn_size, 16))
Wd2 = tf.get_variable(name='dense2', shape=(rnn_size, 2))
dense1 = tf.nn.relu(tf.matmul(last_rnn_output, Wd1))
logit = tf.matmul(last_rnn_output, Wd2)
pred = tf.nn.softmax(logit)
# calculate accuracy
correct_pred = tf.equal(tf.argmax(pred, 1), y)
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# define optimizer, cost, and training step
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logit))
optimizer = tf.train.AdamOptimizer()
train_step = optimizer.minimize(cost, global_step=global_step)
# training and testing loop
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(train_init_op)
while True:
try:
_, step, c, acc = sess.run([train_step, global_step, cost, accuracy])
if step % 50 == 0:
print("Iter " + str(step) +
", batch loss {:.6f}".format(c) +
", batch Accuracy= {:.5f}".format(acc))
except tf.errors.OutOfRangeError:
print('training is finished...')
break
step = 0
acc = 0
sess.run(test_init_op)
while True:
try:
step = step + 1
acc = acc + sess.run(accuracy)
except tf.errors.OutOfRangeError:
break
print('final accuracy', acc / step)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment