tensorflow - RNN學(xué)習(xí)文章的風(fēng)格去仿寫

1 . 能干什么

在知乎,博客上面會看到有人分享自己的一些有意思的項目恩敌,比如下面這些瞬测,用rnn學(xué)習(xí)一個詩歌,散文,黨章涣楷,小說什么的分唾。然后,在自己生成一些東西狮斗。比如绽乔,下面的這兩個例子。作為一個初學(xué)者碳褒,自己也想搭一個模型折砸,然后試著玩一玩。

image.png
image.png

關(guān)于RNN的模型結(jié)構(gòu)的基本原理沙峻,公式推導(dǎo)什么的睦授,就先不在這里展開了。下面寫得是摔寨,如何用tensorflow去實現(xiàn)這個模型去枷。

2. 使用tensorflow 搭建這個RNN的模型去實現(xiàn)
  1. 讀文件,將文件里面的句子分割成詞是复,然后變成一個list删顶。
## 預(yù)處理數(shù)據(jù)
def read_file():
    # Text file containing words for training
    training_file = 'belling_the_cat.txt'
    content=[]
    with open(training_file,'r') as f:
        for line in f.readlines():
            # line 表示讀到數(shù)據(jù)的每一行,linelist是按照空格切分成一個list
            linelist=line.strip().split()
            for i in linelist:
                content.append(i.strip())
    content=np.array(content)
    content=np.reshape(content,[-1,])  #shape (204,1)
    return content
  1. 建立字典淑廊,建立字典的目的是實現(xiàn)將詞轉(zhuǎn)換成詞向量
    字典的目的是實現(xiàn)word-->向量逗余,這個沒有使用word2vec的算法。使用本書文本數(shù)據(jù)的詞建立的向量季惩。簡化的過程录粱,如下:
#文本數(shù)據(jù)
hello ml hello dl
#去重以后的詞匯
hello ml dl
#建立字典
{'hello':0 , 'ml':1 , 'dl':2 }
#反向字典
{0:'hello' ,  1:'ml' , 2: 'dl'}

代碼如下:

def mybuild_dataset(words):  
    # words -- > ['hello','hello','world','python','tensorflow','rnn']
    count = collections.Counter(words)  
    # Counter({'hello': 2, 'python': 1, 'rnn': 1, 'tensorflow': 1, 'world': 1})
    dictionary=dict()
    for key in count:
        dictionary[key]=len(dictionary)
    #dictionary -- > {'hello': 0, 'python': 3, 'rnn': 1, 'tensorflow': 2, 'world': 4}
    reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys()))
    #reverse_dictionary -- > {0: 'hello', 1: 'rnn', 2: 'tensorflow', 3: 'python', 4: 'world'}
    return dictionary, reverse_dictionary  #len(dictionary)  --> 112  
  1. 建立RNN模型訓(xùn)練

理解一個模型,我覺得一個比較好的方式是先搞明白它訓(xùn)練的輸入和輸出画拾。在這個模型里面啥繁,處理訓(xùn)練數(shù)據(jù)的輸入和輸出,如下所示:

#訓(xùn)練數(shù)據(jù)
the mice had a xxxxx

# 訓(xùn)練的思路是青抛,將前三個數(shù)據(jù)作為訓(xùn)練的輸入
[[the],[mice],[had]]  --> 轉(zhuǎn)化為詞向量

#將第四個詞匯作為輸出
['a']
#然后將輸出的詞匯轉(zhuǎn)換成onehot的形式
[ 0,0,0,0 ...0,1,0,0  ...  0,0,0 ]   #長度是詞向量字典的長度 , 置1的地方是詞向量字典里面‘a(chǎn)’對應(yīng)的輸出設(shè)置為1

具體實現(xiàn)的代碼输虱,如下:

3.1 RNN模型的訓(xùn)練數(shù)據(jù)的輸入

n_input = 3
offset = 是一個隨機的偏移,這個是程序設(shè)計上面的一個trick脂凶,不影響理解這一段代碼

# 輸入x 宪睹,將前三個詞匯轉(zhuǎn)換成詞向量
# symbols_in_keys  是一個二維的list -->  [[34], [92], [85]]
symbols_in_keys = [[dictionary[ str(training_data[i])]] for i in range(offset, offset+n_input) ]

# reshape  把他們轉(zhuǎn)換成 (1, 3, 1)
symbols_in_keys = np.reshape(np.array(symbols_in_keys), [-1, n_input, 1])

3.2 RNN模型的訓(xùn)練數(shù)據(jù)的輸出

# 這一段代碼搞定是 y_true ,把第四個詞轉(zhuǎn)換成詞向量 onehot的類型
symbols_out_onehot = np.zeros([vocab_size], dtype=float)

# str(training_data[offset+n_input])  ->  'mice'
symbols_out_onehot[dictionary[str(training_data[offset+n_input])]] = 1.0
symbols_out_onehot = np.reshape(symbols_out_onehot,[1,-1])

3.3 RNN模型的訓(xùn)練

def RNN(x, weights, biases):
    batch_size=1
    x = tf.reshape(x, [batch_size,n_input,1])          # (1,3,1) 相當(dāng)于batch =1 
    # rnn 
    cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
    init_state = cell.zero_state(batch_size, dtype=tf.float32)
    # final_state 的維度是  batch * n_hidden                       --> 1 * 512
    # outputs     的維度是  batch * n_input(time_step) * n_hidden  --> 1 * 3  * 512
    outputs, final_state = tf.nn.dynamic_rnn(cell, x, initial_state=init_state, time_major=False)  
    
    #print ("before unstack , output shape : ",outputs.shape)   # output shape :  (1,3,512) (batch,time_step,cell_n_hidden)
    #unstack 更改維度
    outputs = tf.unstack(tf.transpose(outputs, [1,0,2]))
    #這個時候 outputs 變成了list 
    #print ("output shape[-1] 2: ",outputs[-1].shape)           # output shape :  (3,1,512), outputs[-1] shape (1,512)
    results = tf.matmul(outputs[-1], weights['out']) + biases['out']
    #(1,112)  這個的表示意義是一個(1,112)的onehot蚕钦,112表示字典里面總共有112個詞匯
    return results   #(1, 112)  這個表示的是一個onehot
  1. 完整代碼
    https://github.com/zhaozhengcoder/Machine-Learning/tree/master/tensorflow_tutorials/ RNN學(xué)習(xí)的目錄下面

訓(xùn)練的數(shù)據(jù)使用了伊索寓言的數(shù)據(jù)亭病,但是數(shù)據(jù)的量很少,迭代的次數(shù)也很少嘶居∽锾可以更換成其他的數(shù)據(jù)促煮,然后增大迭代的次數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末整袁,一起剝皮案震驚了整個濱河市菠齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坐昙,老刑警劉巖绳匀,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炸客,居然都是意外死亡疾棵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門痹仙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是尔,“玉大人,你說我怎么就攤上這事开仰∧松常” “怎么了膘茎?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵蛤肌,是天一觀的道長祖秒。 經(jīng)常有香客問我,道長田轧,這世上最難降的妖魔是什么暴匠? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任鞍恢,我火速辦了婚禮傻粘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帮掉。我一直安慰自己弦悉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布蟆炊。 她就那樣靜靜地躺著稽莉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩搓。 梳的紋絲不亂的頭發(fā)上污秆,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音昧甘,去河邊找鬼良拼。 笑死,一個胖子當(dāng)著我的面吹牛充边,可吹牛的內(nèi)容都是我干的庸推。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贬媒!你這毒婦竟也來了聋亡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤际乘,失蹤者是張志新(化名)和其女友劉穎坡倔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚓庭,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡致讥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了器赞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垢袱。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖港柜,靈堂內(nèi)的尸體忽然破棺而出请契,到底是詐尸還是另有隱情,我是刑警寧澤夏醉,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布爽锥,位于F島的核電站,受9級特大地震影響畔柔,放射性物質(zhì)發(fā)生泄漏氯夷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一靶擦、第九天 我趴在偏房一處隱蔽的房頂上張望腮考。 院中可真熱鬧,春花似錦玄捕、人聲如沸踩蔚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馅闽。三九已至,卻和暖如春馍迄,著一層夾襖步出監(jiān)牢的瞬間福也,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工攀圈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暴凑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓量承,卻偏偏與公主長得像搬设,于是被迫代替她去往敵國和親穴店。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容