RNN
類別keras.layers.RNN(
cell,
return_sequences=False,
return_state=False,
go_backwards=False,
stateful=False,
unroll=False,
zero_output_for_mask=False,
**kwargs
)
循環層的基礎類別。
參數
call(input_at_t, states_at_t)
方法,返回 (output_at_t, states_at_t_plus_1)
。cell 的 call 方法也可以接受可選參數 constants
,請參閱下方「關於傳遞外部常數的注意事項」章節。state_size
屬性。這可以是一個單一整數(單一狀態),在這種情況下,它是循環狀態的大小。這也可以是整數的列表/元組(每個狀態一個大小)。output_size
屬性,一個單一整數。get_initial_state(batch_size=None)
方法,用於建立一個張量,旨在作為初始狀態饋送到 call()
,如果使用者沒有透過其他方式指定任何初始狀態。返回的初始狀態應具有形狀 (batch_size, cell.state_size)
。cell 可以選擇建立一個充滿零的張量,或基於 cell 實作的其他值。inputs
是 RNN 層的輸入張量,形狀為 (batch_size, timesteps, features)
。如果 cell 沒有實作此方法,RNN 層將建立一個填滿零的張量,形狀為 (batch_size, cell.state_size)
。如果 cell
是 RNN cell 實例的列表,則這些 cell 將在 RNN 中彼此堆疊,從而產生有效率的堆疊 RNN。False
)。是否返回輸出序列中的最後一個輸出,還是完整序列。False
)。是否除了輸出之外還返回最後一個狀態。False
)。如果為 True
,則反向處理輸入序列並返回反向序列。False
)。如果為 True,則批次中索引 i
處的每個樣本的最後一個狀態將用作後續批次中索引 i
處的樣本的初始狀態。False
)。如果為 True,網路將會展開,否則將使用符號迴圈。展開可以加速 RNN,儘管它往往更耗費記憶體。展開僅適用於短序列。False
)。輸出是否應對遮罩的時間步使用零。請注意,只有當 return_sequences
為 True
且提供 mask
時,才會使用此欄位。如果您想要重複使用 RNN 的原始輸出序列而不受遮罩時間步的干擾(例如,合併雙向 RNN)時,這會很有用。呼叫參數
(batch_size, timesteps, features)
。[batch_size, timesteps]
的二元張量,指示是否應遮罩給定的時間步。True
條目表示應使用對應的時間步,而 False
條目表示應忽略對應的時間步。輸出形狀
return_state
:張量列表。第一個張量是輸出。其餘張量是最後的狀態,每個狀態的形狀為 (batch_size, state_size)
,其中 state_size
可能是高維度張量形狀。return_sequences
:3D 張量,形狀為 (batch_size, timesteps, output_size)
。遮罩
此層支援對具有可變時間步數的輸入資料進行遮罩。若要將遮罩引入您的資料,請使用 keras.layers.Embedding
層,並將 mask_zero
參數設定為 True
。
關於在 RNN 中使用狀態性的注意事項
您可以將 RNN 層設定為「具狀態性」,這表示為一個批次中的樣本計算的狀態將被重複用作下一個批次中樣本的初始狀態。這假設不同連續批次中的樣本之間存在一對一的對應關係。
若要啟用狀態性
stateful=True
。batch_size=...
傳遞給模型的 Input
層。請記住在呼叫 fit()
時也指定相同的 batch_size=...
,或者使用類似生成器的資料來源,例如 keras.utils.PyDataset
或 tf.data.Dataset
。fit()
時指定 shuffle=False
,因為您的批次預期是按時間順序排列的。若要重設模型的狀態,請在特定層或整個模型上呼叫 .reset_state()
。
關於指定 RNN 初始狀態的注意事項
您可以透過使用關鍵字引數 initial_state
呼叫 RNN 層來以符號方式指定 RNN 層的初始狀態。initial_state
的值應該是一個張量或張量列表,代表 RNN 層的初始狀態。
您可以透過使用關鍵字引數 states
呼叫 reset_state()
,以數值方式指定 RNN 層的初始狀態。states
的值應該是一個 NumPy 陣列或 NumPy 陣列列表,代表 RNN 層的初始狀態。
範例
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)