可以在 here。
本教程的目的是重現 zaremba et al., 2014 的成果,他們在 ptb 資料集上得到了很棒的結果。
本教程使用的下面檔案的目錄是models/rnn/ptb
:
檔案作用
ptb_word_lm.py
在 ptb 資料集上訓練乙個語言模型.
reader.py
讀取資料集.
本教程需要的資料在 data/ 路徑下,**於 tomas mikolov **上的 ptb 資料集。
該資料集已經預先處理過並且包含了全部的 10000 個不同的詞語,其中包括語句結束標記符,以及標記稀有詞語的特殊符號()
。我們在reader.py
中轉換所有的詞語,讓他們各自有唯一的整型識別符號,便於神經網路處理。
模型的核心由乙個 lstm 單元組成,其可以在某時刻處理乙個詞語,以及計算語句可能的延續性的概率。網路的儲存狀態由乙個零向量初始化並在讀取每乙個詞語後更新。而且,由於計算上的原因,我們將以batch_size
為最小批量來處理資料。
基礎的偽**就像下面這樣:
lstm = rnn_cell.basiclstmcell(lstm_size)
# 初始化 lstm 儲存狀態.
state = tf.zeros([batch_size, lstm.state_size])
loss = 0.0
for current_batch_of_words in words_in_dataset:
# 每次處理一批詞語後更新狀態值.
output, state = lstm(current_batch_of_words, state)
# lstm 輸出可用於產生下乙個詞語的**
logits = tf.matmul(output, softmax_w) + softmax_b
probabilities = tf.nn.softmax(logits)
loss += loss_function(probabilities, target_words)
為使學習過程易於處理,通常的做法是將反向傳播的梯度在(按時間)展開的步驟上照乙個固定長度(num_steps
)截斷。 通過在一次迭代中的每個時刻上提供長度為num_steps
的輸入和每次迭代完成之後反向傳導,這會很容易實現。
乙個簡化版的用於計算圖建立的截斷反向傳播**:
# 一次給定的迭代中的輸入佔位符.
words = tf.placeholder(tf.int32, [batch_size, num_steps])
lstm = rnn_cell.basiclstmcell(lstm_size)
# 初始化 lstm 儲存狀態.
initial_state = state = tf.zeros([batch_size, lstm.state_size])
for i in range(len(num_steps)):
# 每處理一批詞語後更新狀態值.
output, state = lstm(words[:, i], state)
# 其餘的**.
# ...
final_state = state
下面展現如何實現迭代整個資料集:
# 乙個 numpy 陣列,儲存每一批詞語之後的 lstm 狀態.
numpy_state = initial_state.eval()
total_loss = 0.0
for current_batch_of_words in words_in_dataset:
numpy_state, current_loss = session.run([final_state, loss],
# 通過上一次迭代結果初始化 lstm 狀態.
feed_dict=)
total_loss += current_loss
在輸入 lstm 前,詞語 id 被嵌入到了乙個密集的表示中(檢視 向量表示教程)。這種方式允許模型高效地表示詞語,也便於寫**:
# embedding_matrix 張量的形狀是: [vocabulary_size, embedding_size]
word_embeddings = tf.nn.embedding_lookup(embedding_matrix, word_ids)
嵌入的矩陣會被隨機地初始化,模型會學會通過資料分辨不同詞語的意思。
我們想使目標詞語的平均負對數概率最小
實現起來並非很難,而且函式sequence_loss_by_example
已經有了,可以直接使用。
**中的典型衡量標準是每個詞語的平均困惑度(perplexity),計算式為
同時我們會觀察訓練過程中的困惑度值(perplexity)。
要想給模型更強的表達能力,可以新增多層 lstm 來處理資料。第一層的輸出作為第二層的輸入,以此類推。
類multirnncell
可以無縫的將其實現:
lstm = rnn_cell.basiclstmcell(lstm_size)
stacked_lstm = rnn_cell.multirnncell([lstm] * number_of_layers)
initial_state = state = stacked_lstm.zero_state(batch_size, tf.float32)
for i in range(len(num_steps)):
# 每次處理一批詞語後更新狀態值.
output, state = stacked_lstm(words[:, i], state)
# 其餘的**.
# ...
final_state = state
首先需要構建庫,在 cpu 上編譯:
bazel build -c opt tensorflow/models/rnn/ptb:ptb_word_lm
bazel build -c opt --config=cuda tensorflow/models/rnn/ptb:ptb_word_lm
執行模型:
bazel-bin/tensorflow/models/rnn/ptb/ptb_word_lm \
--data_path=/tmp/******-examples/data/ --alsologtostderr --model small
教程**中有 3 個支援的模型配置引數:"small", "medium" 和 "large"。它們指的是 lstm 的大小,以及用於訓練的超引數集。
模型越大,得到的結果應該更好。在測試集中small
模型應該可以達到低於 120 的困惑度(perplexity),large
模型則是低於 80,但它可能花費數小時來訓練。
還有幾個優化模型的技巧沒有提到,包括:
繼續學習和更改**以進一步改善模型吧。
原文:warln 校對:hongyangwang
tensorflow安裝神坑
莫名的,我之前安裝的tensorflow又用不了了,並且不論怎麼重新安裝都會報錯。1.importerror dll load failed 找不到指定的模組。這個錯誤在我不停解除安裝不停重灌中一直存在,直到我在乙個博主安裝細節中找到 這一步網上有很多安裝方法,有pip的,有conda的。但是,大部...
安裝TensorFlow教程
1.安裝anaconda 2.建立乙個conda環境,命名為tensorflow conda create n tensorflow3.用以下命令進入conda環境 source activate tensorflow tensorflow 進入tensorflow後的顯示符4.安裝tensorfl...
Tensorflow教程 綜述
如果你是機器學習領域的新手,我們推薦你從本文開始閱讀.本文通過講述乙個經典的問題,手寫數字識別 mnist 讓你對多類分類 multiclass classification 問題有直觀的了解.閱讀教程 如果你已經對其它深度學習軟體比較熟悉,並且也對 mnist 很熟悉,這篇教程能夠引導你對 ten...