1. 程式人生 > >TensorFlow-10-基於 LSTM 建立一個語言模型

TensorFlow-10-基於 LSTM 建立一個語言模型

今天的內容是基於 LSTM 建立一個語言模型

人每次思考時不會從頭開始,而是保留之前思考的一些結果,為現在的決策提供支援。RNN 的最大特點是可以利用之前的資訊,即模擬一定的記憶,具體可以看我之前寫過的這篇文章:
詳解迴圈神經網路(Recurrent Neural Network)
http://www.jianshu.com/p/39a99c88a565

RNN 雖然可以處理整個時間序列資訊,但是它記憶最深的還是最後輸入的一些訊號,而之前的訊號的強度就會越來越低,起到的作用會比較小。
LSTM 可以改善長距離依賴的問題,不需要特別複雜的除錯超引數就可以記住長期的資訊。關於 LSTM 可以看這一篇文章:
詳解 LSTM

http://www.jianshu.com/p/dcec3f07d3b5

今天要實現一個語言模型,它是 NLP 中比較重要的一部分,給上文的語境後,可以預測下一個單詞出現的概率。

首先下載 ptb 資料集,有一萬個不同的單詞,有句尾的標記,並且將罕見的詞彙統一處理成特殊字元;

PTBInput,
定義語言模型處理輸入資料的一些引數,包括 LSTM 的展開步數 num_steps,用 reader.ptb_producer 讀取資料和標籤:

PTBModel,
def __init__(self, is_training, config, input_) 包括三個引數,訓練標記,配置引數以及輸入資料的例項;
把這幾個變數讀取到本地,hidden_size

是隱藏層的節點數,vocab_size 是詞彙表的大小;

def lstm_cell(),設定基本的 LSTM 單元,用的是 tf.contrib.rnn.BasicLSTMCell
如果 if is_training and config.keep_prob < 1 這個條件的話,在 LSTM 單元后面可以加一個 dropout 層;
再用 tf.contrib.rnn.MultiRNNCell 把多層的 LSTM 堆加到一起;
cell.zero_state 將 LSTM 的初始狀態設定為0;

接下來是 embedding 矩陣,行數是詞彙表的大小,列數是每個單詞的向量表達的維度,在訓練過程中,它可以被優化和更新;

接下來我們要定義輸出,限制一下反向傳播時可以展開的步數,將 inputs 和 state 傳到 LSTM,然後把輸出結果新增到 outputs 的列表裡;

然後將輸出的內容串到一起,接下來 softmax 層,接著要定義損失函式 loss,它的定義形式是這樣的:

然後我們要加和整個 batch 的誤差,再平均到每個樣本的誤差,並且保留最終的狀態,如果不是訓練狀態就直接返回;

接下來是定義學習速率,根據前面的 cost 計算一下梯度,並將梯度的最大範數設定好,相當於正則化的作用,可以防止梯度爆炸;

這個學習速率還可以更新,將其傳入給 _new_lr,再執行 _lr_update 完成修改:

接下來可以定義幾種不同大小的模型的引數,其中有學習速率,還有梯度的最大範數,還是 LSTM 的層數,反向傳播的步數,隱含層節點數,dropout 保留節點的比例,學習速率的衰減速度:

run_epoch,是定義訓練一個 epoch 資料的函式,首先初始化 costs 還有 iters,state;
將 LSTM 的所有 state 加入到 feed_dict 中,然後會生成結果的字典表 fetches,其中會有 cost 和 final_state
每完成 10% 的 epoch 就顯示一次結果,包括 epoch 的進度,perplexity(是cost 的自然常數指數,這個指標越低,表示預測越好),還有訓練速度(單詞數每秒):

main() 中:
reader.ptb_raw_data 讀取解壓後的資料;
得到 train_data, valid_data, test_data 資料集;

用 PTBInput 和 PTBModel 分別定義用來訓練的模型 m,驗證的模型 mvalid,測試的模型 mtest;

m.assign_lr 對 m 應用累計的 learning rate;

每個迴圈內執行一個 epoch 的訓練和驗證,輸出 Learning rate,Train Perplexity, Valid Perplexity。

相關推薦

TensorFlow-10-基於 LSTM 建立一個語言模型

今天的內容是基於 LSTM 建立一個語言模型 人每次思考時不會從頭開始,而是保留之前思考的一些結果,為現在的決策提供支援。RNN 的最大特點是可以利用之前的資訊,即模擬一定的記憶,具體可以看我之前寫過的這篇文章: 詳解迴圈神經網路(Recurrent

TensorFlow 實現基於LSTM語言模型

一、LSTM的相關概念部落格上有很多講解的很好的博主,我看的是這個博主的關於LSTM的介紹,感覺很全面,如果對LSTM原理不太明白的,可以點選這個連結。LSTM相關概念,這裡就不多做介紹了哈!二、GRU介紹這裡為什麼要介紹下GRU呢!因為在RNN的各種變種中,除了LSTM,另

######好好好,本質#####基於LSTM搭建一個文字情感分類的深度學習模型:準確率往往有95%以上

基於情感詞典的文字情感分類 傳統的基於情感詞典的文字情感分類,是對人的記憶和判斷思維的最簡單的模擬,如上圖。我們首先通過學習來記憶一些基本詞彙,如否定詞語有“不”,積極詞語有“喜歡”、“愛”,消極詞語有“討厭”、“恨”等,從而在大腦中形成一個基本的語料庫。然後,我們再對輸入的句子進行最直接

建立一個物件模型的時候,為什麼要重寫hashCode與equals方法

為了闡明其作用,我們先來假設有如下一個Person類。 class Person { public Person(String name, int age) { this.name = name; this.age = age;

tensorflow實現基於LSTM的文字分類方法

引言 學習一段時間的tensor flow之後,想找個專案試試手,然後想起了之前在看Theano教程中的一個文字分類的例項,這個星期就用tensorflow實現了一下,感覺和之前使用的theano還是有很大的區別,有必要總結mark一下 模型說明 這個

Tensorflow基於slim訓練自己的模型

    假如我們需要從頭開始訓練一個影象識別的模型,我們可以使用tensorflow構建自己的圖片分類模型,並將圖片轉換成tfrecord格式的檔案。tfrecord是tensorflow官方提供的一種檔案型別。這裡補充下,關於tensorflow讀取資料,官網給出了三種方法

LightRNN —— 基於RNN的輕量級語言模型

2017年6月我在MSRA實習的時候,在微軟內部的Talk上聽過MSRA主管研究員秦濤博士講過一篇他們團隊在2016年頂會NIPS上發表的最新成果《LightRNN: Memory and Computation-Efficient Recurrent Neur

基於LSTM和遷移學習的文字分類模型說明(Tensorflow)

考慮到在實際應用場景中,資料有可能後續增加,另外,類別也有可能重新分配,比如銀行業務中的[取款兩萬以下]和[取款兩萬以上]後續可能合併為一類[取款],而重新訓練模型會浪費大量時間,因此我們考慮使用遷移學習來縮短訓練時間。即保留LSTM層的各權值變數,然後重新構建全連線層,

基於TensorflowLSTM-CNN文字分類模型

題記    前段時間再看QA方面的文章,讀了一篇paper(《LSTM-based deep learning model for non-factoid answer selection》)中,使用了LSTM-CNN模型來做answer與question的語義抽取。受此啟發

tensorflow RNN LSTM語言模型

參考部落格: 以上鍊接講解詳細,主要說明以下: (1)資料的總量為 batch_size * num_steps * epoch_size batch_size:一批資料的樣本數 num_steps:LSTM單元的展開步數,即橫向LSTM序列上有幾個單元 epoc

Go語言建立一個最簡單的服務端點

一個 nds Coding port struct pac quest com handler handlers/handlers.go package handlers import ( "encoding/json" "net/http" )

為你的機器學習模型建立一個API服務

1. 什麼是API 當調包俠們訓練好一個模型後,下一步要做的就是與業務開發組同學們進行程式碼對接,以便這些‘AI大腦’們可以順利的被使用。然而往往要面臨不同程式語言的挑戰,例如很常見的是調包俠們用Python訓練模型,開發同學用Java寫業務程式碼,這時候,Api就作為一種解決方案被使用。 簡單地說,AP

安裝angular cli 及建立一個基於angular 的程式

發現了一個很好的頁面效果,裡面使用了angular . 來學習一下 angular 。 參考官網,安裝angular-cli . 在安裝 angular-cli 前,先安裝一下node 與 npm, node中自帶npm . 在 命令視窗 使用命令 node -v npm -v

SketchUp教程 | 如何建立一個完美的SketchUp屋頂模型

作者 | 活力網Caigle 點選本行文字檢視視訊 【教程重點】 製作模型一方面在於技術,另一方面在於思路。視訊中完整演示瞭如何正確的使用SU自帶的剖切工具進行剖切。在思路上要學會利用鋪助面與線進行剖切,同時結合Roof,JHS Powerbar,Zorro2,Curvilof

React 折騰記 - (6) 基於React 16.7 + Antd 3.10.7封裝的一個宣告式的查詢元件

前言 最近把新的後臺系統寫好了..用的是上篇文章的技術棧(mobx+react16); 但是感覺mobx沒有想象中的好用,看到umi 2.x了.就著手又開始重構了... 仔細梳理了下上個系統,發現可以抽離的東西不少 有興趣的瞧瞧,沒興趣的止步,節約您的時間... 效果圖 響應式傳入

PS學習記錄10--如何在PS中建立一個乾淨的網頁佈局

作為編碼者,美工基礎是偏弱的。我們可以參考一些成熟的網頁PS教程,提高自身的設計能力。套用一句話,“熟讀唐詩三百首,不會作詩也會吟”。 本系列的教程來源於網上的PS教程,都是國外的,全英文的。本人嘗試翻譯這些優秀的教程。因為翻譯能力有限,翻譯的細節上還有待推敲,希望廣大網友不吝賜教。 約定:

從頭基於空映象scratch建立一個新的Docker映象

我們在使用Dockerfile構建docker映象時,一種方式是使用官方預先配置好的容器映象。優點是我們不用從頭開始構建,節省了很多工作量,但付出的代價是需要下載很大的映象包。 比如我機器上docker images返回的這些基於nginx的映象,每個都超過了100MB,而一個簡單的Ubuntu

最簡單的Docker映象教程:從頭基於空映象scratch建立一個新的Docker映象

我們在使用Dockerfile構建docker映象時,一種方式是使用官方預先配置好的容器映象。優點是我們不用從頭開始構建,節省了很多工作量,但付出的代價是需要下載很大的映象包。 比如我機器上docker images返回的這些基於nginx的映象,每個都超過了100MB,而一個簡單的

==3==基於tensorflow目標識別API執行已有的模型(執行demo coco資料集)

首先裝環境 參考連結 一 執行已經訓練好的模型 執行demo 1進入模型資料夾下的research資料夾中 進入research資料夾下!如果按照上面參考部落格進行,那麼路徑可以由下面步驟查詢: 首先確認tensorflow的路徑 python3 import tensorf