2016-08-25 82 views
3
堆棧LSTM層

我有什麼是下面的,我相信這是一個隱藏LSTM層的網絡:如何使用TensorFlow

# Parameters 
learning rate = 0.001 
training_iters = 100000 
batch_size = 128 
display_step = 10 

# Network Parameters 
n_input = 13 
n_steps = 10 
n_hidden = 512 
n_classes = 13 

# tf Graph input 
x = tf.placeholder("float", [None, n_steps, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

# Define weights 
weights = { 
    'out' : tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'out' : tf.Variable(tf.random_normal([n_classes])) 
} 

不過,我嘗試使用TensorFlow預測構建LSTM網絡能量消耗。我一直在尋找一個很好的例子,但我找不到任何帶有2個隱藏LSTM圖層的模型。這裏,我想構建模型:

1輸入層, 1個輸出層, 2隱藏LSTM層(在每個512元), 時間步驟(序列長度):10

莫非任何人指導我使用TensorFlow來構建這個? (從定義權重,構建輸入形狀,訓練,預測,優化器或成本函數的使用等),任何幫助將不勝感激。

非常感謝你提前!

回答

5

下面是我在具有GRU單元的翻譯模型中如何做到這一點。您可以用LSTM替換GRU。只需使用tf.nn.rnn_cell.MultiRNNCell和它應該包裝的多個單元的列表就可以了。在下面的代碼中,我手動展開它,但您也可以將它傳遞給tf.nn.dynamic_rnntf.nn.rnn

y = input_tensor 
with tf.variable_scope('encoder') as scope: 
    rnn_cell = rnn.MultiRNNCell([rnn.GRUCell(1024) for _ in range(3)]) 
    state = tf.zeros((BATCH_SIZE, rnn_cell.state_size)) 
    output = [None] * TIME_STEPS 
    for t in reversed(range(TIME_STEPS)): 
     y_t = tf.reshape(y[:, t, :], (BATCH_SIZE, -1)) 
     output[t], state = rnn_cell(y_t, state) 
     scope.reuse_variables() 
    y = tf.pack(output, 1) 
+0

感謝您的回答。我是否還需要將隱藏層1中的變量(參數)初始化爲隱藏層2,還是需要內部處理? – subbie

+0

LSTM的變量在類中使用時會被初始化。看看源代碼是非常有用的。 – chasep255

+0

我看到LSTM的四個門的變量被初始化了,但是不應該有從第一個隱藏層到第二個參數的參數?如果MultiRNNCell將參數從一個隱藏的參數初始化到另一個隱藏參數,這將是有意義的。 – subbie

2

首先,你需要一些佔位符,把你的訓練數據(一個批次)

x_input = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 
y_output = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 

一個LSTM需要的狀態,它由兩個部分組成,隱藏的狀態和電池狀態,很不錯這裏指導:https://arxiv.org/pdf/1506.00019.pdf。對於LSTM中的每個圖層,您都有一個單元格狀態和一個隱藏狀態。

問題是,Tensorflow將此存儲在LSTMStateTuple中,您無法將其發送到佔位符。所以,你需要將其存儲在一個張量,然後把它解壓到一個元組:

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size]) 

l = tf.unpack(state_placeholder, axis=0) 
rnn_tuple_state = tuple(
    [tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1]) 
    for idx in range(num_layers)] 
) 

然後你可以使用內置的Tensorflow API來創建堆疊LSTM層。

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True) 
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True) 
outputs, state = tf.nn.dynamic_rnn(cell, x_input, initial_state=rnn_tuple_state) 

從這裏你與輸出繼續計算logits再損失關於y_inputs

然後運行每批與sess.run -command,被截斷的反向傳播(這裏http://r2rt.com/styles-of-truncated-backpropagation.html很好的解釋)

init_state = np.zeros((num_layers, 2, batch_size, state_size)) 

...current_state... = sess.run([...state...], feed_dict={x_input:batch_in, state_placeholder:current_state ...}) 
current_state = np.array(current_state) 

你將不得不再次餵養它之前的狀態轉換爲numpy陣列。

也許最好是使用像Tflearn或Keras的圖書館呢?

+0

不想編輯,因爲它取決於您使用的tensorflow版本:但似乎tf.unpack已更改爲tf.unstack – vanilla

相關問題