Tensorflow: recurrent neural network char-level 1

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.models.rnn import rnn, rnn_cell
from tensorflow.models.rnn import seq2seq

import collections

# @karpathy
data = open('ThreeMusketeers.txt').read()
chars = list(set(data))
data_size , vocab_size = len(data), len(chars)
print 'data has %d characters, %d unique.' %(data_size, vocab_size)
char_to_ix = {ch:i for i, ch in enumerate(chars)}
ix_to_char = {i:ch for i, ch in enumerate(chars)}
counter = collections.Counter(data)
counter = sorted(counter.items(), key=lambda x:-x[1])
for i in xrange(5):
    print counter[i]

corpus = [char_to_ix[c] for c in data]

batch_size = 1
seq_length = 1


hidden_size = 128
num_layers = 2
max_grad_norm = 5.0

an_lstm = rnn_cell.BasicLSTMCell(hidden_size)
multi_lstm = rnn_cell.MultiRNNCell([an_lstm] * num_layers)
x = tf.placeholder(tf.int32, [batch_size, seq_length])
y = tf.placeholder(tf.int32, [batch_size, seq_length])
init_state = multi_lstm.zero_state(batch_size, tf.float32)

with tf.variable_scope('rnn'):
    softmax_w = tf.get_variable('softmax_w', [hidden_size, vocab_size])
    softmax_b = tf.get_variable('softmax_b', [vocab_size])
    with tf.device('/cpu:0'):
        embedding = tf.get_variable('embedding', [vocab_size, hidden_size])
        inputs = tf.nn.embedding_lookup(embedding, x)
        inputs = tf.split(1, seq_length, inputs)
        inputs = [tf.squeeze(input_, [1]) for input_ in inputs]

#def loop(prev):
#    prev = tf.nn.xw_plus_b(prev, softmax_w, softmax_b)
#    prev_symbol = tf.stop_gradient(tf.arg_max(prev, 1))
#    return tf.nn.embedding_lookup(embedding, prev_symbol)

outputs, last_state = seq2seq.rnn_decoder(inputs, init_state, 
                                          multi_lstm, 
                                          loop_function=None, 
                                          scope='rnn')
# outputs is a list of 2D-Tensor with shape [batch_size , hidden_size]
# the len(outputs)) is seq_length

# first, hiddenlayer outputs belong to same sequence should be concatenated together 
out_conca = tf.concat(1, outputs) # [batch_size, hidden_size*seq_length]
# second, to get the softmax prob and add the fc layer, the out_conca's second dim should
# be reshaped to the size: hidden_size
# [batch_size*seq_length, hidden_size]
output = tf.reshape(out_conca, [-1, hidden_size])
# [batch_size*seq_length, vocab_size]
score = tf.nn.xw_plus_b(output, softmax_w, softmax_b)
# [batch_size*seq_length, vocab_size]
probs = tf.nn.softmax(score)


init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

epoch = 20
batch_size = 100
snapshot = 5
save_step = 1
saver = tf.train.Saver()
ckpt = tf.train.get_checkpoint_state('net_snapshot/')
saver.restore(sess, ckpt.model_checkpoint_path)
print ckpt.model_checkpoint_path

def weighted_pick(weights):
    t = np.cumsum(weights)
    s = np.sum(weights)
    return np.searchsorted(t, np.random.rand(1)*s).tolist()[0]

prime = 'The'
state = sess.run(multi_lstm.zero_state(1, tf.float32))
for c in prime[-1]:
    ix = np.zeros((1,1))
    ix[0,0] = char_to_ix[c]
    state = sess.run(last_state, feed_dict={x:ix, init_state: state})

def char_filter(pred):
    cache = ['!', '.', '?', '\"', ' ', ',', '%']
    if pred >='a' and pred <= 'z':
        return pred
    if pred >='A' and pred <= 'Z':
        return pred
    if pred in cache:
        return pred
    return ''

ret = prime
char = prime[-1]
num = 1000
for n in xrange(num):
    ix = np.zeros((1,1))
    ix[0,0] = char_to_ix[char]
    probsval, state = sess.run([probs, last_state], 
                               feed_dict={x:ix, init_state:state})

    if np.random.rand(1) > 0.5:
        sample = np.argmax(probsval[0])
    else:
        sample = weighted_pick(probsval[0])

    pred = ix_to_char[sample]

    ret += char_filter(pred)
    char = ret[-1]

print ret

sampled chars:

The and the caral there turrid seing, acting, and I scapter the cardy and this tow in 
the carmant of the cardantg wit. The sesper the carmisted the camplessing unce you will 
the cardow shanded the entereled the haved is thuld a conturute of you wnocch forlack 
the dal would the cardersty a saiking the contter the man the this lackul not to the 
carster which he wat madame you was abver D he womple lead me the conleshs of the 
cardinous of the closed there obe in his had past, acking that time the cardinal same 
trrang the cant of the cat of the sir thim the deave, and the clome the ca in aftented 
of throse one and all be, and proming him are to they undersince, she dy hering thought 
o man the conter to musked the cardinal be at the porsess of a seet the for the 
cardinan and as the omemen exter the cardinal and to the wall take proming this, and 
the cands, and then? Tetter. Tno tay will see to see thougle. The chaned them then for 
a sra

reference:
https://github.com/sjchoi86/tensorflow-101/blob/master/notebooks/char_rnn_train_tutorial.ipynb
https://github.com/sherjilozair/char-rnn-tensorflow

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值