TensotFlow RNN LSTM古詩生成

2021-09-07 15:22:14 字數 3733 閱讀 7790

『tensotflow』基礎rnn網路分類問題

『tensotflow』rnn中文文字_上

『tensotflow』基礎rnn網路回歸問題

『tensotflow』rnn中文文字_下_暨研究生開學感想

預處理結果是二維資料,相當於batch條一維資料,每個資料對應一首詩,每個字是乙個scalar;

embedding之後,將每個字對映為乙個rnn_size大小的向量,資料變為三維;

經過遞迴神經網路,輸出維度不變;

將之調整為二維資料,這裡面第二維度(即每一行)對應乙個字;

全連線對映,將每乙個字由rnnsize的向量對映為乙個長度為總字數的向量,這樣方便計算loss,實際計算loss時,會將label(二維向量,一行一首詩,字為scalar)拉伸為一維向量,每行只有乙個字scalar,one_hot之後和此時資料正好對應,方便計算

softmax不改變張量形狀,只是將結果以概率分布的形式輸出

**見github

lstm_model.py:lstm網路模型,提供了end_points介面,被其他部分呼叫

poetry_porcess.py:資料讀取、預處理部分,會返回打包好的batch,被main呼叫

gen_poetry.py:古詩生成程式,擁有可選的風格引數,被main呼叫

main.py:主函式,既可以呼叫前兩個程式獲取預處理資料並使用lstm網路進行訓練,也可以呼叫gen_poetry.py生成古詩

main.py最後有如下指令,

if __name__ == "__main__": words,poetry_vector,to_num,x_batches,y_batches = poetry_porcess.poetry_process() # train(words, poetry_vector, x_batches, y_batches) # gen_poetry(words, to_num) generate(words_, to_num_, style_words="狂沙將軍戰燕然,大漠孤煙黃河騎。")

此時實際上處於生成模式,對於最後的三行, train:表示訓練 gen_poetry:表示根據首字元生成 generate:表示根據首句和風格句生成古詩

訓練時注釋掉後兩行,保留train行,

if __name__ == "__main__": words,poetry_vector,to_num,x_batches,y_batches = poetry_porcess.poetry_process() train(words, poetry_vector, x_batches, y_batches) # gen_poetry(words, to_num) # generate(words_, to_num_, style_words="狂沙將軍戰燕然,大漠孤煙黃河騎。")

生成時不需要修改,但是

generate(words_, to_num_, style_words="狂沙將軍戰燕然,大漠孤煙黃河騎。")

可以替換style_word為任何你想要的風格句,注意最好使用7言或者5言,因為這句會大概率影響到你生成的古詩的句子長度(不絕對),這只是風格提取,你可以輸入任意長度;在執行了指令碼後,螢幕會提示輸入起始句,輸入的句子一般5或者7個字,這個由於會拿來直接做首句(由結果示範可以看到),輸入長度不宜過長。

對於上面的兩種情況,修改完成後執行指令碼即可,

python main.py
即可顯示結果

head:床前明月光 + style:黃沙百戰金甲:

床前明月光輝,魏武徵夫血絮紅。

數步崩雲復遺主,縞衣東,帝京舉,玉輪還滿出書初。

秋秋慘慘垂楊柳,夢斷黃鶯欲斷腸。

花凋柳映阮家幾,屋前病,歇馬空留門。

當年皆月林,獨往深山有素。

head:少小離家老大回 + style:山雨欲來風滿樓:

少小離家老大回,四壁百月弄鴉飛。

掃香花間春風地,隔天傾似爛桃香。

近來誰伴清明日,兩株愁味在羅幃。

仍通西疾空何處,軋軋涼吹日方明。

head:少小離家老大回 + style:鐵馬冰河入夢來:

少小離家老大回,化空千里便成絲。

官拋十里同牛頷,莫礙風光雪片雲。

飲水遠濤飛漢地,雲連城戶翠微低。

一樹鐵門永珍聳,白雲三尺各關高。

同言東甸西遊子,誰道承陽要舊憂。

少小離家老大回,含顰玉燭拂樓台。

初齊去府芙蓉死,細緩行雲向國天

原網路結構如下,實際上不需要像下面這樣寫了,不過當時費了好大事,所以保留一下原來版本的**,

with tf.variable_scope('placeholder'):

input_vec = tf.placeholder(tf.int32,[none,none])

output_targets = tf.placeholder(tf.int32,[none,none])

def rnn_network(rnn_size=128,num_layers=2):

def lstm_cell():

l_cell = tf.contrib.rnn.basiclstmcell(rnn_size,state_is_tuple=true,reuse=tf.get_variable_scope().reuse)

return l_cell

cell = tf.contrib.rnn.multirnncell([lstm_cell() for _ in range(num_layers)])

initial_state = cell.zero_state(batch_size, tf.float32) # 初始化lstm網路節點,引數為尺寸

with tf.variable_scope('lstm'):

with tf.variable_scope('embedding'):

e = tf.get_variable('embedding',[len(words_list) + 1,rnn_size])

input_embedding = tf.nn.embedding_lookup(e,input_vec)

output_embedding, last_state = tf.nn.dynamic_rnn(cell, input_embedding, initial_state=initial_state,scope='lstm')

output = tf.reshape(output_embedding,[-1,rnn_size])

with tf.variable_scope('output'):

w = tf.get_variable('w', [rnn_size,len(words_list)+1])

b = tf.get_variable('b', [len(words_list)+1])

logits = tf.matmul(output,w) + b

probs = tf.nn.softmax(logits)

return logits, last_state, probs, cell, initial_state

另外,直接使用tf.nn.rnn_cell而不是用tf.contrib.rnn也可以。

古詩十九首

古詩十九首 組詩名。漢無名氏作 其中有八首 玉臺新詠 題為漢枚乘作,後人 多疑其不確 非一時一人所為,一般認為大都出於東漢末年。南朝梁蕭統合為一 組,收入 文選 題為 古詩十九首 內容多寫夫婦朋友間的離愁別緒和士人 的彷徨失意,有些作品表現出追求富貴和及時行樂的思想。語言樸素自然,描寫生 動真切,在...

喜歡的古詩

朝代 唐代 將進酒 君不見,黃河之水天上來,奔流到海不復回。君不見,高堂明鏡悲白髮,朝如青絲暮成雪。人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還復來。烹羊宰牛且為樂,會須一飲三百杯。岑夫子,丹丘生,將進酒,杯莫停。與君歌一曲,請君為我傾耳聽。鐘鼓饌玉不足貴,但願長醉不復醒。古來聖賢皆寂...

兒童背誦古詩

1 詠鵝 駱賓王 鵝鵝鵝,曲項向天歌 白毛浮綠水,紅掌撥清波 2憫農 李紳 春種一粒粟,秋收萬顆子 四海無閒田,農夫猶餓死 鋤禾日當午,汗滴禾下土 誰知盤中餐,粒粒皆辛苦 3靜夜思 李白 床前明月光,疑是地上霜 舉頭望明月,低頭思故鄉 4夜宿山寺 李白 危樓高百尺,手可摘星辰 不敢高聲語,恐驚天上人...