TensorFlow深度學習筆記 迴圈神經網路實踐

2021-07-14 17:38:54 字數 3570 閱讀 2948

歡迎star,有問題可以到issue區討論

官方教程位址

text8中只包含27種字元:小寫的從a到z,以及空格符。如果把它打出來,讀起來就像是去掉了所有標點的wikipedia。

用zipfile讀取zip內容為字串,並拆分成單詞list

用connections模組統計單詞數量並找出最常見的單詞

達成隨機取資料的目標

embeddings = tf.variable(

tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

embed = tf.nn.embedding_lookup(embeddings, train_dataset)
loss = tf.reduce_mean(

tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,

train_labels, num_sampled, vocabulary_size))

optimizer = tf.train.adagradoptimizer(1.0).minimize(loss)
data_index = (data_index + 1) % len(data)
訓練100001次,每2000次輸出這兩千次的平均損失

每10000次計算相似度,並輸出與驗證集中的詞最接近的詞彙列表

用tsne降維呈現詞彙接近程度

用matplotlib繪製結果

實現**見word2vec.py

上面訓練的是skip-gram模型,是根據目標詞彙**上下文,而word2vec還有一種方式,cbow,根據上下文**目標詞彙。

實際上就是將skip-gram中的輸入輸出反過來。

分別從embeding裡找到train_data裡每個word對應的vector,用tf.reduce_sum將其相加,將相加結果與train_label比較

# look up embeddings for inputs.

embed = tf.nn.embedding_lookup(embeddings, train_dataset)

# sum up vectors on first dimensions, as context vectors

embed_sum = tf.reduce_sum(embed, 0)

**見:

cbow.py

整體思路是,以乙個文字中的乙個詞作為train data,後續的所有詞作為train label,從而能夠根據乙個給定詞,**後續的片段。

last_batch:上乙個訓練資料片段

每呼叫一次next,生成乙個num_unrollings長的array,以last_batch開頭,跟著num_unrollings個batch

每個batch的作為train_input,每個batch後面的乙個batch作為train_label,每個step訓練num_unrolling個batch

input_gate = sigmoid(i * ix + o * im + ib)
- 給輸入乘乙個vocabulary_size * num_nodes大小的矩陣,給輸出乘乙個num_nodes * num_nodes大小的矩陣;

- 用這兩個矩陣調節對輸入資料的取捨程度

- 用sigmoid這個非線性函式進行啟用

forget_gate = sigmoid(i * fx + o * fm + fb)
思路同輸入門,用以對歷史資料做取捨

output_gate = sigmoid(i * ox + o * om + ob)
思路同輸入門,用以對輸出狀態做取捨

update = i * cx + o * cm + cb

state = forget_gate * state + input_gate * tanh(update)

lstm_cell = output_gate * tanh(state)

- 用同樣的方式構造新狀態update

- 用遺忘門處理歷史狀態state

- 用tanh啟用新狀態update

- 用輸入門處理新狀態update

- 整合新舊狀態,再用tanh啟用狀態state

- 用輸出門處理state

上面的cell中,update,output_gate,forget_gate,input_gate計算方法都是一樣的,

可以把四組引數分別合併,一次計算,再分別取出:

values = tf.split(1, gate_count, tf.matmul(i, input_weights) + tf.matmul(o, output_weights) + bias)

input_gate = tf.sigmoid(values[0])

forget_gate = tf.sigmoid(values[1])

update = values[2]

再將lstm-cell的輸出扔到乙個wx+b中調整作為輸出

實現**見singlew_lstm.py

實現**見lstm.py

上面的流程裡,每次都是以乙個字元作為單位,可以使用多一點的字元做**,取最高概率的那個,防止特殊情況導致的誤判

在這裡我們增加字元為2個,形成bigram,**見:bigram_lstm.py

主要通過bigrambatchgenerator類實現

由於bigram情況下,vocabulary_size變為 27*27個,使用one-hot encoding 做predict的話會產生非常稀疏的矩陣,浪費算力,計算速度慢

因此引入embedding_lookup,**見embed_bigram_lstm.py

def

create_model

(sess, forward_only):

model = seq2seq_model.seq2seqmodel(source_vocab_size=vocabulary_size,

target_vocab_size=vocabulary_size,

buckets=[(20, 21)],

size=256,

num_layers=4,

max_gradient_norm=5.0,

batch_size=batch_size,

learning_rate=1.0,

learning_rate_decay_factor=0.9,

use_lstm=true,

forward_only=forward_only)

return model

TensorFlow 深度學習筆記

google 深度學習筆記 經常總結是個好習慣,筆記目錄奉上。歡迎star,有問題可以到issue區討論 官方教程位址 最近tensorflow團隊出了乙個model專案,和這個課程無關,但是可以參考 框架 tensorflow 谷歌出品的基於python的深度學習工具集 工具 ipython,py...

TensorFlow深度學習框架

tensorflow支援python和c 兩種程式語言,再複雜的多層神經網路模型都可以用python來實現,如果業務使用其他程式設計也不用擔心,使用跨語言的grpc或者http服務也可以訪問使用tensorflow訓練好的智慧型模型。tensorflow 是乙個採用資料流圖 data flow gr...

深度學習 初識TensorFlow

深度學習使用場景 影象理解 語音識別 自然語言處理 機器自主 無人駕駛 深度學習,如深度神經網路 卷積神經網路和遞迴神經網路已被應用計算機視覺 語音識別 自然語言處理 音訊識別與生物資訊學等領域並取得了很好的效果。深度學習在人工智慧領域的地位 深度學習框架 google brain計畫產物 應用於a...