您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“RNN中的Dropout怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“RNN中的Dropout怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
我們可以簡單的在RNN之前或之后加一個DropOut層,但是如果我們想在RNN層中間加上DropOut的話,就得用DropoutWrapper了。下面代碼在每個RNN層的輸入都應用Dropout,對每個輸入有50%的概率丟棄。
keep_prob = 0.5
cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
cell_drop = tf.contrib.rnn.DropoutWrapper(cell, input_keep_prob=keep_prob)
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([cell_drop] * n_layers)
rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
當然,我們也可以通過設置output_keep_prob來對輸出進行dropout。
其實,細心的童鞋可能已經發現,上面的代碼是有問題的,因為我們在前面CNN中應用Dropout的時候是有一個is_training的placeholder來區分是在training還是testing應用的。但是上面代碼并沒有。確實,上面代碼的最大問題就是在testing的時候,也會應用Dropout,當然,這并不是我們想要的。不幸的是,DropoutWrapper并不支持is_training的placeholder,因此,我們要么自己重寫一個DropoutWapper類,要么我們有兩個計算圖,一個是用來training,另一個用來testing。這里我們看下兩個計算圖是怎么實現的,如下:
import sys
is_training = (sys.argv[-1] == "train")
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
y = tf.placeholder(tf.float32, [None, n_steps, n_outputs])
cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
if is_training:
cell = tf.contrib.rnn.DropoutWrapper(cell, input_keep_prob=keep_prob)
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([cell] * n_layers)
rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
[...] # build the rest of the graph
init = tf.global_variables_initializer()
saver = tf.train.Saver()
with tf.Session() as sess:
if is_training:
init.run()
for iteration in range(n_iterations):
[...] # train the model
save_path = saver.save(sess, "/tmp/my_model.ckpt")
else:
saver.restore(sess, "/tmp/my_model.ckpt")
[...] # use the model
讀到這里,這篇“RNN中的Dropout怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。