tensorflow學習之dynamic_rnn使用詳解
阿新 • • 發佈:2018-12-11
tf.nn.dynamic_rnn
使用指定的RNNCell單元建立一個迴圈神經網路,對輸入執行完全動態展開。
tf.nn.dynamic_rnn(
cell,
inputs,
sequence_length=None,
initial_state=None,
dtype=None,
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)
引數說明:
- cell:一個RNNCell例項
- Inputs:RNN的輸入。如果time_major==False(預設),張量的形狀為:[batch_size,max_time,…]或這些元素的巢狀的tuple。如果time_major==True,張量的形狀為:[max_time,batch_size,…]或者這些元素的巢狀的tuple。也可能是滿足此屬性的Tensors(可能是巢狀的)元組。每個時間步的單元輸入的是張量或者是維度為[batch_size,…]的張量的tuple
- Sequence_length:可選引數。一個大小為[batch_size]的int32/int64型別向量。表示每個輸入樣本長度,如時間步長。更多的考慮到效能而不是正確性。
- Initial_state:可選引數。一個針對RNN的初始狀態。
- dtype:初始狀態和預期輸出的資料型別。
- parallel_iteratioins:預設為32。並行執行的迭代次數。用於那些沒有任何時間依賴性並且可以並行執行的操作。該引數是使用空間換時間。值>1則使用更多記憶體但佔用更少時間。使用較小的值則使用較少記憶體但計算時間較長。
- swap_memory:透明地交換前向推理中產生的張量,但對於後向傳播,需要從GPU到CPU。這允許訓練通常不適合單個GPU的RNN,具有非常小的效能損失。
- time_major:指定輸入和輸出張量的形狀格式。如果為True,張量必須形如[max_time,batch_size,depth].如果為False,張量必須形如:[batch_size,max_time,depth]。使用time_major=True會更有效,因為它避免了RNN計算開始和結束時的轉置。但是,大多數Tensorflow資料都是batch_size為major的資料,因此,預設情況下,此函式以batch-major形式接受輸入和輸出。
- Scope:用於建立子圖的VariableScope,預設是”rnn”。
返回:
一個(outputs,state)對,其中:
- outputs:如果time_major=False(預設),則是一個張量,形如:[batch_size,max_time,cell.output.size];如果time_major=True則形如[max_time,batch_size,cell.output_size]。
注意:如果cell.output_size是整數或TensorShape物件的元組,則輸出將是具有與cell.output_size相同結構的元組,包含的張量的形狀也同cell.output_size。
- state:最終的狀態。如果cell.state_size是一個整數,則形如[batch_size,cell.state_size]。如果是一個TensorShape,則形如[batch_size]+cell.state_size.如果是一個整數或者TensorShape的元組,則它是一個有著相應形狀的元組。如果cell是LSTMCells.則state對於每個cell來說是一個包含一個LSTMStateTuple的元組。
程式碼例項1:
batch_size=10 #批處理大小
hidden_size=100 #隱藏層神經元
max_time=40 #最大時間步長
depth=400 #輸入層神經元數量,如詞向量維度
input_data=tf.Variable(tf.random_normal([max_time,batch_size,depth]))
# create a BasicRNNCell
rnn_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_size)
# 'outputs' is a tensor of shape [batch_size, max_time, cell_state_size]
# defining initial state
initial_state = rnn_cell.zero_state(batch_size, dtype=tf.float32)
# 'state' is a tensor of shape [batch_size, cell_state_size]
outputs, state = tf.nn.dynamic_rnn(rnn_cell, input_data,
initial_state=initial_state,
dtype=tf.float32,time_major=True)
print(outputs.shape) #(40, 10, 100)
print(state.shape) #(10, 100)
程式碼例項2:
batch_size=10 #批處理大小
hidden_size=100 #隱藏層神經元
max_time=40 #最大時間步長
depth=400 #輸入層神經元數量,如詞向量維度
input_data=tf.Variable(tf.random_normal([max_time,batch_size,depth]))
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_size)
# 'outputs' is a tensor of shape [batch_size, max_time, cell_state_size]
# defining initial state
initial_state = lstm_cel.zero_state(batch_size, dtype=tf.float32)
# 'state' is a tensor of shape [batch_size, cell_state_size]
outputs, state = tf.nn.dynamic_rnn(lstm_cell, input_data,
initial_state=initial_state,
dtype=tf.float32,time_major=True)
print(outputs.shape) #(40, 10, 100)
print(state.c) #Tensor("rnn_4/while/Exit_3:0", shape=(10, 100), dtype=float32)
print(state.h) #Tensor("rnn_4/while/Exit_4:0", shape=(10, 100), dtype=float32)