In [2]:
import tensorflow as tf
import numpy as np

In [12]:
def ascii2char(list_):
    list_ += 97 
    return [chr(item) for item in list_]

tf.reset_default_graph()

# Variables:
seq_len = 3
cell_size = 10
vocab_size = 26 - 2 
embedding_size = vocab_size

# Placeholders:
enc_inp = [tf.placeholder(tf.int32,[None] ) ]
labels = [tf.placeholder(tf.int32,[None] ) ]
weights = [ tf.ones_like(enc_inp, tf.int32) ]#weight of each prediction in the sequence during loss calc.
dec_inp = ([tf.zeros_like(enc_inp[0], dtype=tf.int32, name="GO")] )

# Build Graph:
cell = tf.contrib.rnn.BasicLSTMCell(cell_size)
dec_outputs, states = tf.contrib.legacy_seq2seq.embedding_rnn_seq2seq(enc_inp, dec_inp, cell, vocab_size, vocab_size, 
                                                                      embedding_size, feed_previous=True)

# Optimisation:
loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(
    labels=tf.one_hot(labels[0], depth=vocab_size, dtype=tf.float32),
    logits=dec_outputs,
))
learning_rate = 00.1
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

# Start Session:
sess = tf.Session()
sess.run(tf.global_variables_initializer() )

for epoch_i in range(1000):
    X = np.random.choice(vocab_size, size=(seq_len)) #97 is ascii of 'a'
    Y = X + 2 #next to next ascii value 
    feed_dict = {enc_inp[0]:X , labels[0]:Y}
    dec_outputs_, dec_inp_ = sess.run([dec_outputs, dec_inp],feed_dict)
    
    loss_,_ = sess.run([loss, optimizer],feed_dict)
    if epoch_i%100==0:
        print "Iteration:  ",epoch_i
        print "X:          ",ascii2char(X)
        print "Prediction: ",ascii2char([logits_t.argmax(axis=1) for logits_t in dec_outputs_][0] )
        print "Label:      ",ascii2char(Y)
        print "loss:       ",loss_
        print


Iteration:   0
X:           ['t', 'g', 'l']
Prediction:  ['u', 'g', 'k']
Label:       ['v', 'i', 'n']
loss:        3.22133

Iteration:   100
X:           ['w', 'i', 'j']
Prediction:  ['m', 'k', 'l']
Label:       ['y', 'k', 'l']
loss:        1.87227

Iteration:   200
X:           ['m', 'd', 'j']
Prediction:  ['e', 'f', 'l']
Label:       ['o', 'f', 'l']
loss:        2.62441

Iteration:   300
X:           ['i', 'k', 'b']
Prediction:  ['k', 'm', 'd']
Label:       ['k', 'm', 'd']
loss:        1.87997

Iteration:   400
X:           ['f', 'v', 'f']
Prediction:  ['h', 'x', 'h']
Label:       ['h', 'x', 'h']
loss:        1.00559

Iteration:   500
X:           ['c', 'l', 'w']
Prediction:  ['e', 'j', 'x']
Label:       ['e', 'n', 'y']
loss:        0.982762

Iteration:   600
X:           ['s', 'u', 'q']
Prediction:  ['u', 'w', 's']
Label:       ['u', 'w', 's']
loss:        0.332675

Iteration:   700
X:           ['q', 'r', 't']
Prediction:  ['s', 't', 'v']
Label:       ['s', 't', 'v']
loss:        0.246857

Iteration:   800
X:           ['j', 'm', 'q']
Prediction:  ['l', 'o', 's']
Label:       ['l', 'o', 's']
loss:        0.159969

Iteration:   900
X:           ['g', 'p', 't']
Prediction:  ['i', 'r', 'v']
Label:       ['i', 'r', 'v']
loss:        0.185063