Tensorflow教程 遞迴神經網路

2021-08-01 04:07:15 字數 3689 閱讀 4062

可以在 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...