Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Tensorflow RNN-LSTM implementation to count number of set bits in a binary string
#Source code with the blog post at http://monik.in/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow/
import numpy as np
import random
from random import shuffle
import tensorflow as tf
# from tensorflow.models.rnn import rnn_cell
# from tensorflow.models.rnn import rnn
NUM_EXAMPLES = 10000
train_input = ['{0:020b}'.format(i) for i in range(2**20)]
shuffle(train_input)
train_input = [map(int,i) for i in train_input]
ti = []
for i in train_input:
temp_list = []
for j in i:
temp_list.append([j])
ti.append(np.array(temp_list))
train_input = ti
train_output = []
for i in train_input:
count = 0
for j in i:
if j[0] == 1:
count+=1
temp_list = ([0]*21)
temp_list[count]=1
train_output.append(temp_list)
test_input = train_input[NUM_EXAMPLES:]
test_output = train_output[NUM_EXAMPLES:]
train_input = train_input[:NUM_EXAMPLES]
train_output = train_output[:NUM_EXAMPLES]
print "test and training data loaded"
data = tf.placeholder(tf.float32, [None, 20,1]) #Number of examples, number of input, dimension of each input
target = tf.placeholder(tf.float32, [None, 21])
num_hidden = 24
cell = tf.nn.rnn_cell.LSTMCell(num_hidden,state_is_tuple=True)
val, _ = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32)
val = tf.transpose(val, [1, 0, 2])
last = tf.gather(val, int(val.get_shape()[0]) - 1)
weight = tf.Variable(tf.truncated_normal([num_hidden, int(target.get_shape()[1])]))
bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]]))
prediction = tf.nn.softmax(tf.matmul(last, weight) + bias)
cross_entropy = -tf.reduce_sum(target * tf.log(tf.clip_by_value(prediction,1e-10,1.0)))
optimizer = tf.train.AdamOptimizer()
minimize = optimizer.minimize(cross_entropy)
mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1))
error = tf.reduce_mean(tf.cast(mistakes, tf.float32))
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
batch_size = 1000
no_of_batches = int(len(train_input)) / batch_size
epoch = 5000
for i in range(epoch):
ptr = 0
for j in range(no_of_batches):
inp, out = train_input[ptr:ptr+batch_size], train_output[ptr:ptr+batch_size]
ptr+=batch_size
sess.run(minimize,{data: inp, target: out})
print "Epoch ",str(i)
incorrect = sess.run(error,{data: test_input, target: test_output})
print sess.run(prediction,{data: [[[1],[0],[0],[1],[1],[0],[1],[1],[1],[0],[1],[0],[0],[1],[1],[0],[1],[1],[1],[0]]]})
print('Epoch {:2d} error {:3.1f}%'.format(i + 1, 100 * incorrect))
sess.close()

seriously this code has not been optimized at all. can't even run it

Fahad615 commented Mar 7, 2017

The code is not working.

Fahad615 commented Mar 7, 2017

I got the following error: "tensorflow.python.ops.nn' has no attribute 'rnn_cell"

I think It was moved to contrib. Take a look here

mg64ve commented Mar 11, 2017 edited

This code runs on TensorFlow 0.12
What TensorFlow version are your using guys?

I'm using TensorFlow 1.0.0

rickysahu commented Mar 21, 2017 edited

on TF 1.0.0, the only thing you need to change is Line 44 which should be this:
cell = tf.contrib.rnn.LSTMCell(num_hidden,state_is_tuple=True)
Also, you probably dont need to run all 5000 epochs, my machine got to 0.1% error in 600.

Working after upgrading to tensorflow 1.0.1 , just change line #62 - no_of_batches = int((len(train_input)) / batch_size)

da-steve101 commented May 12, 2017 edited

I modified this code to use a single floating point value as output as ( 0, 1/20, 2/20, ... etc 20/20 )
See here: https://gist.github.com/da-steve101/31693ebfa1b451562810d8644b788900
It trains in 100 epochs and gets an error of 0%
Uses tensorflow 1.1 and python3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment