Keras 3 API 文件 / 層 API / 循環層 / 基礎 RNN 層

基礎 RNN 層

[原始碼]

RNN 類別

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

循環層的基礎類別。

參數

  • cell:一個 RNN 單元實例或 RNN 單元實例的列表。RNN 單元是一個具有以下特性的類別:
    • 一個 call(input_at_t, states_at_t) 方法,返回 (output_at_t, states_at_t_plus_1)。單元的 call 方法也可以接受可選參數 constants,請參閱下方的「關於傳遞外部常數的注意事項」部分。
    • 一個 state_size 屬性。這可以是一個整數(單一狀態),在這種情況下,它表示循環狀態的大小。也可以是一個整數列表/元組(每個狀態一個大小)。
    • 一個 output_size 屬性,一個整數。
    • 一個 get_initial_state(batch_size=None) 方法,該方法建立一個張量,目的是在使用者沒有透過其他方式指定任何初始狀態的情況下,將其傳遞給 call() 作為初始狀態。返回的初始狀態應具有形狀 (batch_size, cell.state_size)。單元可能會選擇建立一個充滿零的張量,或根據單元的實作而定使用其他值。inputs 是 RNN 層的輸入張量,其形狀為 (batch_size, timesteps, features)。如果單元未實作此方法,則 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,則會展開網路,否則將使用符號迴圈。展開可以加速 RNN,儘管它往往會更耗用記憶體。展開僅適用於短序列。
  • zero_output_for_mask:布林值 (預設為 False)。輸出是否應針對遮罩的時間步使用零。請注意,此欄位僅在 return_sequencesTrue 且提供 mask 時才會使用。如果您希望重複使用 RNN 的原始輸出序列而不受遮罩時間步的干擾 (例如,合併雙向 RNN) 時,它會很有用。

呼叫參數

  • sequences:形狀為 (batch_size, timesteps, features) 的 3D 張量。
  • initial_state:要傳遞給單元第一次呼叫的初始狀態張量列表。
  • mask:形狀為 [batch_size, timesteps] 的二元張量,表示是否應遮罩給定的時間步。單獨的 True 項目表示應使用對應的時間步,而 False 項目表示應忽略對應的時間步。
  • training:Python 布林值,表示層應在訓練模式還是推論模式中運作。此參數會在呼叫單元時傳遞給單元。這適用於使用 dropout 的單元。

輸出形狀

  • 如果 return_state:張量列表。第一個張量是輸出。其餘張量是最後的狀態,每個狀態的形狀為 (batch_size, state_size),其中 state_size 可能是高維度張量形狀。
  • 如果 return_sequences:形狀為 (batch_size, timesteps, output_size) 的 3D 張量。

遮罩

此層支援對具有可變時間步數的輸入資料進行遮罩。若要將遮罩引入您的資料,請使用將 mask_zero 參數設定為 Truekeras.layers.Embedding 層。

關於在 RNN 中使用狀態的注意事項

您可以將 RNN 層設定為「具狀態的」,這表示在一個批次中針對樣本計算的狀態,將重複用作下一個批次中樣本的初始狀態。這假設不同連續批次中的樣本之間存在一對一的對應關係。

若要啟用狀態

  • 在層建構函式中指定 stateful=True
  • 透過將 batch_size=... 傳遞到模型的 Input 層,為您的模型指定固定的批次大小。請記住,在呼叫 fit() 時也要指定相同的 batch_size=...,或者使用產生器類的資料來源,例如 keras.utils.PyDatasettf.data.Dataset
  • 在呼叫 fit() 時指定 shuffle=False,因為您的批次預計將依時間排序。

若要重設模型的狀態,請在特定層或整個模型上呼叫 .reset_state()

關於指定 RNN 初始狀態的注意事項

您可以透過使用關鍵字引數 initial_state 呼叫 RNN 層,以符號方式指定 RNN 層的初始狀態。initial_state 的值應為表示 RNN 層初始狀態的張量或張量列表。

您可以透過使用關鍵字引數 states 呼叫 reset_state(),以數值方式指定 RNN 層的初始狀態。states 的值應為表示 RNN 層初始狀態的 numpy 陣列或 numpy 陣列列表。

範例

from keras.layers import RNN
from keras import ops

# First, let's define a RNN Cell, as a layer subclass.
class MinimalRNNCell(keras.Layer):

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

    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 = ops.matmul(inputs, self.kernel)
        output = h + ops.matmul(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)