Keras 3 API 文件 / 層 API / 循環層 / 雙向層

雙向層

[原始碼]

Bidirectional 類別

keras.layers.Bidirectional(
    layer, merge_mode="concat", weights=None, backward_layer=None, **kwargs
)

用於 RNN 的雙向包裝器。

參數

  • layerkeras.layers.RNN 實例,例如 keras.layers.LSTMkeras.layers.GRU。它也可以是一個 keras.layers.Layer 實例,該實例符合以下條件:
    1. 是一個序列處理層 (接受 3D+ 輸入)。
    2. 具有 go_backwardsreturn_sequencesreturn_state 屬性 (具有與 RNN 類別相同的語義)。
    3. 具有 input_spec 屬性。
    4. 透過 get_config()from_config() 實作序列化。請注意,建立新 RNN 層的建議方法是編寫自訂 RNN cell 並將其與 keras.layers.RNN 一起使用,而不是直接子類化 keras.layers.Layer。當 return_sequencesTrue 時,無論層原始的 zero_output_for_mask 值為何,遮罩時間步長的輸出都將為零。
  • merge_mode:前向和後向 RNN 的輸出將組合的方式。可以是 {"sum", "mul", "concat", "ave", None} 其中之一。如果為 None,則不會組合輸出,它們將作為列表回傳。預設為 "concat"
  • backward_layer:可選的 keras.layers.RNNkeras.layers.Layer 實例,用於處理後向輸入處理。如果未提供 backward_layer,則會使用作為 layer 參數傳遞的層實例來自動產生後向層。請注意,提供的 backward_layer 層應具有與 layer 參數匹配的屬性,特別是它應具有相同的 statefulreturn_statesreturn_sequences 等值。此外,backward_layerlayer 應具有不同的 go_backwards 參數值。如果不符合這些要求,將會引發 ValueError

呼叫參數

此層的呼叫參數與包裝的 RNN 層的呼叫參數相同。請注意,在此層的呼叫期間傳遞 initial_state 參數時,initial_state 列表中前半部的元素將傳遞給前向 RNN 呼叫,而列表中後半部的元素將傳遞給後向 RNN 呼叫。

注意:從現有的 RNN 層實例實例化 Bidirectional 層不會重複使用 RNN 層實例的權重狀態 – Bidirectional 層將具有全新初始化的權重。

範例

model = Sequential([
    Input(shape=(5, 10)),
    Bidirectional(LSTM(10, return_sequences=True),
    Bidirectional(LSTM(10)),
    Dense(5, activation="softmax"),
])
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

# With custom backward layer
forward_layer = LSTM(10, return_sequences=True)
backward_layer = LSTM(10, activation='relu', return_sequences=True,
                      go_backwards=True)
model = Sequential([
    Input(shape=(5, 10)),
    Bidirectional(forward_layer, backward_layer=backward_layer),
    Dense(5, activation="softmax"),
])
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')