Flask全棧開發(fā)案例(三) Lstm+Flask的藏頭詩/詩歌生成系統(tǒng)
前言
之前收到了一位粉絲需求投稿,想寫一個基于flask+LSTM實現(xiàn)AI寫詩。支持根據(jù)提示詞續(xù)寫全詩和藏頭詩。該項目參考了《pytorch入門與實踐》的教程。我們的主要功能包括根據(jù)給定提示詞生成一首詩,或者根據(jù)給定的一句話生成藏頭詩。
兩種不同的效果展示如下
運行效果
1、首句生成
我們的主要根據(jù)提示詞輸入,生成詩句。提示詞是基于訓(xùn)練數(shù)據(jù)分詞后的結(jié)果,所以可能會出現(xiàn)提示詞不在訓(xùn)練數(shù)據(jù)中無法生成的情況。

生成詩句后填寫作者和詩名,點擊保存即可保存到數(shù)據(jù)庫中。

界面點擊廣場可以查看其他用戶生成的詩句。

2、藏頭詩
eg:輸入"今天天氣不錯",生成的詩句為:

今日一氣生。
天子行北極。
天府拱飛車。
氣利縱橫折。
不知天地地。
錯豁三秋景。
數(shù)據(jù)集
整理好的numpy格式數(shù)據(jù)集,
http://pytorch-1252820389.cosbj.myqcloud.com/tang_199.pth
其中包含唐詩57580首*125字,不足和多余125字的都被補充或者截斷。
實現(xiàn)細節(jié)
-
1.?data是numpy數(shù)組,57580首*125字
-
2.?word2ix和ix2word都是字典類型,用于字符和序號的映射
-
3. nn.Embedding層可以輸入為long Tensor型的字的下標(int),輸入為同樣shape的詞向量,下標換成了向量,其余形狀不變。最重要的構(gòu)造參數(shù)是num_embeddings, embedding_dim
-
4.?nn.LSTM主要構(gòu)造參數(shù)input_size,hidden_size和num_layers,其中input_size其實就是詞向量的維度,forward時輸入為input和(h0,c0),其中input為(seq_len,batch_size,input_size),h0和c0是(num_layers $$ num_directions, batch, hidden_size),而forward的輸出為output和(hn,cn),一般后面一個就叫做hidden,output為(seq_len, batch, num_directions $$ hidden_size)
-
5. 在本網(wǎng)絡(luò)中,從前往后總共經(jīng)歷了這么幾個網(wǎng)絡(luò),其向量變化如下:
-
??input:(seq_len,batch_size)
-
??經(jīng)過embedding層,embeddings(input)
-
??embeds:(seq_len,batch_size,embedding_size)
-
??經(jīng)過LSTM,lstm(embeds, (h_0, c_0)),輸出output,hidden
-
? output:(seq_len, batch, num_directions $*$ hidden_size)
-
??output view為(seq_len $$ batch, num_directions $$ hidden_size)
-
??進過Linear層判別
-
? output:(seq_len $*$ batch, vocab_size)
6. 具體訓(xùn)練時的實現(xiàn)方法:
-
??輸入的input為(batch_size,seq_len)
-
??data_ = data_.long().transpose(1,0).contiguous()將數(shù)據(jù)轉(zhuǎn)置并且復(fù)制了一份,成了(seq_len,batch_size)
-
??通過input_,target = data_[:-1,:],data_[1:,:]將每句話分為前n-1個字作為真正的輸入,后n-1個字作為label,size都是(seq_len-1,batch_size)
-
??經(jīng)過網(wǎng)絡(luò),得出output:((seq_len-1) $*$ batch, vocab_size)
-
??通過target.view(-1)將target變成((seq_len-1) $*$ batch)
-
??這里的target不需要是一個one-hot向量,因crossEntropy不需要,直接是下標即可
-
??然后反向傳播即可
7. 生成詩句的方法:
-
??首字為
,首個hidden自動為空 -
??如果有前綴風(fēng)格,通過前綴生成hidden
-
??在首句內(nèi)部時,不使用output,僅僅不斷前進得到hidden,直到首句結(jié)尾。
-
??進入生成模式后,實際上每次調(diào)用model都生成一個字,逐漸生成前n句話。
-
??藏頭詩同理,只是在頭的部分將詩句首字換掉
使用方法
首先訓(xùn)練模型,然后運行app.py,訪問。當(dāng)然也可以直接執(zhí)行app.py,使用預(yù)訓(xùn)練內(nèi)容。
python?main.py
python?app.py
源碼獲取
點擊公眾號菜單中的"免費源碼-源碼集合"進入"編程樹"小程序搜索"詩歌生成"即可免費下載。有項目需求或者代碼修改、代碼講解的可以在小程序中發(fā)布需求或者直接聯(lián)系客服
