當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.keras.layers.RNN用法及代碼示例


循環層的基類。

繼承自:LayerModule

用法

tf.keras.layers.RNN(
    cell, return_sequences=False, return_state=False, go_backwards=False,
    stateful=False, unroll=False, time_major=False, **kwargs
)

參數

  • cell RNN 單元實例或 RNN 單元實例列表。 RNN 單元是一個類,它具有:
    • 一個 call(input_at_t, states_at_t) 方法,返回 (output_at_t, states_at_t_plus_1) 。單元格的調用方法也可以采用可選參數 constants ,請參閱下麵的“關於傳遞外部常量的注意事項”部分。
    • state_size 屬性。這可以是單個整數(單個狀態),在這種情況下,它是循環狀態的大小。這也可以是整數列表/元組(每個狀態一個大小)。 state_size 也可以是 TensorShape 或 TensorShape 的元組/列表,以表示高維狀態。
    • output_size 屬性。這可以是單個整數或 TensorShape,表示輸出的形狀。出於向後兼容的原因,如果該屬性對單元格不可用,則該值將由 state_size 的第一個元素推斷。
    • get_initial_state(inputs=None, batch_size=None, dtype=None) 方法創建一個張量,如果用戶沒有通過其他方式指定任何初始狀態,則該張量將作為初始狀態饋送到 call()。返回的初始狀態應具有 [batch_size, cell.state_size] 的形狀。單元格可能會根據單元格的實現選擇創建一個充滿零或充滿其他值的張量。 inputs 是 RNN 層的輸入張量,它應該包含作為其 shape[0] 的批量大小,以及 dtype。請注意,在圖形構建過程中,shape[0] 可能是None。提供inputs 或一對batch_sizedtypebatch_size 是一個標量張量,表示輸入的批量大小。 dtypetf.DType,表示輸入的 dtype。為了向後兼容,如果cell沒有實現這個方法,RNN層會創建一個大小為[batch_size, cell.state_size]的零填充張量。在 cell 是 RNN 單元實例列表的情況下,這些單元將在 RNN 中相互堆疊,從而形成高效的堆疊 RNN。
  • return_sequences 布爾值(默認 False )。是返回輸出序列中的最後一個輸出,還是返回完整序列。
  • return_state 布爾值(默認 False )。是否返回除了輸出之外的最後一個狀態。
  • go_backwards 布爾值(默認 False )。如果為 True,則反向處理輸入序列並返回反向序列。
  • stateful 布爾值(默認 False )。如果為 True,則批次中索引 i 處每個樣本的最後狀態將用作下一批中索引 i 的樣本的初始狀態。
  • unroll 布爾值(默認 False )。如果為 True,則網絡將展開,否則將使用符號循環。展開可以speed-up一個RNN,雖然它往往更多memory-intensive。展開僅適用於短序列。
  • time_major inputsoutputs 張量的形狀格式。如果為 True,輸入和輸出的形狀將是 (timesteps, batch, ...) ,而在 False 情況下,它將是 (batch, timesteps, ...) 。使用time_major = True 效率更高一些,因為它避免了 RNN 計算開始和結束時的轉置。但是,大多數 TensorFlow 數據是 batch-major,因此默認情況下,此函數接受輸入並以 batch-major 形式發出輸出。
  • zero_output_for_mask 布爾值(默認 False )。輸出是否應為掩碼時間步使用零。請注意,此字段僅在return_sequences 為 True 並提供掩碼時使用。如果您想重用 RNN 的原始輸出序列而不受掩碼時間步長的幹擾,例如合並雙向 RNN,它會很有用。

屬性

  • states

有關 RNN API 使用的詳細信息,請參閱 Keras RNN API 指南。

調用參數:

  • inputs:輸入張量。
  • mask: 形狀的二進製張量[batch_size, timesteps]指示是否應屏蔽給定的時間步長。個人True條目指示應使用相應的時間步長,而Falseentry 表示應該忽略相應的時間步長。
  • training:Python 布爾值,指示層應該在訓練模式還是推理模式下運行。此參數在調用時傳遞給單元格。這適用於使用 dropout 的單元格。
  • initial_state:要傳遞給單元的第一次調用的初始狀態張量列表。
  • constants:在每個時間步傳遞給單元的常量張量列表。

輸入形狀:

當time_major 為真時,N-D 張量形狀為[batch_size, timesteps, ...][timesteps, batch_size, ...]

輸出形狀:

  • 如果 return_state :張量列表。第一個張量是輸出。剩餘的張量是最後的狀態,每個狀態都具有 [batch_size, state_size] 形狀,其中 state_size 可能是高維張量形狀。
  • 如果 return_sequences :N-D 張量的形狀為 [batch_size, timesteps, output_size] ,其中 output_size 可能是高維張量形狀,或者 [timesteps, batch_size, output_size]time_major 為真時。
  • 否則,N-D 形狀為 [batch_size, output_size] 的張量,其中 output_size 可能是高維張量形狀。

掩蔽:

該層支持對具有可變時間步數的輸入數據進行屏蔽。要將掩碼引入數據,請使用 [tf.keras.layers.Embedding] 層,並將 mask_zero 參數設置為 True

在 RNN 中使用狀態性的注意事項:您可以將 RNN 層設置為'stateful',這意味著為一個批次中的樣本計算的狀態將被重用於下一批中的樣本的初始狀態。這假設不同連續批次中的樣本之間存在one-to-one 映射。

要啟用有狀態:

- Specify `stateful=True` in the layer constructor.
- Specify a fixed batch size for your model, by passing
  If sequential model:
    `batch_input_shape=(...)` to the first layer in your model.
  Else for functional model with 1 or more Input layers:
    `batch_shape=(...)` to all the first layers in your model.
  This is the expected shape of your inputs
  *including the batch size*.
  It should be a tuple of integers, e.g. `(32, 10, 100)`.
- Specify `shuffle=False` when calling `fit()`.

要重置模型的狀態,請在特定層或整個模型上調用 .reset_states()

關於指定 RNN 初始狀態的注意事項:您可以通過使用關鍵字參數 initial_state 來象征性地指定 RNN 層的初始狀態。 initial_state 的值應該是一個張量或張量列表,表示 RNN 層的初始狀態。

您可以通過使用關鍵字參數 states 調用 reset_states 以數字方式指定 RNN 層的初始狀態。 states 的值應該是一個 numpy 數組或 numpy 數組列表,表示 RNN 層的初始狀態。

將外部常量傳遞給 RNN 的注意事項:您可以使用 RNN.__call__ (以及 RNN.call )方法的 constants 關鍵字參數將 "external" 常量傳遞給單元格。這要求 cell.call 方法接受相同的關鍵字參數 constants 。這些常數可用於在額外的靜態輸入(不隨時間變化)上調節單元轉換,也就是注意力機製。

例子:

# First, let's define a RNN Cell, as a layer subclass.

class MinimalRNNCell(keras.layers.Layer):

    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True

    def call(self, inputs, states):
        prev_output = states[0]
        h = backend.dot(inputs, self.kernel)
        output = h + backend.dot(prev_output, self.recurrent_kernel)
        return output, [output]

# Let's use this cell in a RNN layer:

cell = MinimalRNNCell(32)
x = keras.Input((None, 5))
layer = RNN(cell)
y = layer(x)

# Here's how to use the cell to build a stacked RNN:

cells = [MinimalRNNCell(32), MinimalRNNCell(64)]
x = keras.Input((None, 5))
layer = RNN(cells)
y = layer(x)

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.keras.layers.RNN。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。