2017-05-24 21 views
8

我無法理解來自tf.nn.dynamic_rnn tensorflow函數的輸出。該文件只是告訴輸出的大小,但它不能說明每行/列的含義。從文檔:來自tf.nn.dynamic_rnn tensorflow函數的輸出分析

輸出:RNN輸出Tensor

如果time_major == False(默認值),這將是Tensor shaped: [batch_size, max_time, cell.output_size]

如果time_major == True,這將是Tensor shaped: [max_time, batch_size, cell.output_size]

注意,如果cell.output_size是整數 或TensorShape對象的(可能是嵌套的)元組,那麼outputs將是具有元組
相同的結構cell.output_size,包含具有對應於所述形狀數據中cell.output_size形狀 張量。

狀態:最終狀態。如果cell.state_size是一個int,則將 的形狀爲[batch_size, cell.state_size]。如果它是
TensorShape,這將形成[batch_size] + cell.state_size
如果它是一個(可能是嵌套的)int或TensorShape的元組,則這個 是具有相應形狀的元組。

outputs張量是一個3-D矩陣,但每行/列代表什麼?

回答

12

tf.dynamic_rnn提供了兩個輸出,outputsstate

  • outputs包含RNN小區在每個時刻的輸出。假設默認time_major == False,假設您有一個輸入由10個示例組成,每個示例包含7個時間步長,每個時間步長的特徵向量大小爲5。然後你的輸入將是10x7x5(batch_size x max_time x features)。現在,您將此作爲輸入大小爲15的RNN單元的輸入。從概念上講,每個示例的每個時間步驟都輸入到RNN,並且您將爲每個RNN單元獲得15長的向量。這就是outputs所包含的尺寸,在這種情況下尺寸爲10x7x15的張量(batch_size x max_time x cell.output_size)與每個時間步的RNN小區的輸出。如果您只對單元格的最後一個輸出感興趣,則可以對時間維度進行切片以僅選取最後一個元素(例如outputs[:, -1, :])。
  • state包含處理完所有輸入後的RNN狀態。請注意,與outputs不同,此信息不包含有關每個時間步的信息,而只包含最後一個信息(即最後一個之後的狀態)。根據你的情況,這個州可能有用也可能沒用。例如,如果序列很長,您可能不希望/能夠在一個批次中處理它們,並且您可能需要將它們分成幾個子序列。如果你忽略了state,那麼每當你給出一個新的子序列時,就好像你正在開始一個新的子序列;但是,如果你記得這個狀態(例如,輸出或將其存儲在變量中)後,可以稍後(通過tf.nn.dynamic_rnn的參數initial_state)反饋,以便正確跟蹤RNN的狀態,並僅將其重置爲初始狀態(通常全爲零)完成整個序列之後。的state形狀可以根據所使用的RNN細胞而變化,但是,在一般情況下,你有各實施例中的一些狀態(一個或多個張量與尺寸batch_size X state_size,其中state_size依賴於細胞類型和尺寸)。
+2

這個,但我相信'國家'還擁有你的網絡的每一層的狀態。因此,如果您使用的是GRU,那麼您的候選層和門層的輸出就會有一個狀態,並且如果您的GRU是多層RNN的單元,則您的網絡中的每個層都會有這些狀態。 – Engineero

+0

@Engineero是的,沒錯,謝謝。我沒有給出太多的細節,但是對於多層RNN小區的狀態將是每個單獨小區的狀態列表,因爲LSTM小區將是一對張量等等。 – jdehesa

+0

@jdehesa - 你可以看看我提出的另一個問題嗎? https://stackoverflow.com/questions/44116689/siamese-model-with-lstm-network-fails-to-train-using-tensorflow – Mithun