1. 程式人生 > >tensorflow學習之dynamic_rnn使用詳解

tensorflow學習之dynamic_rnn使用詳解

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)