RNN
-
class torch.nn.modules.rnn.RNN(input_size, hidden_size, num_layers=1, nonlinearity='tanh', bias=True, batch_first=False, dropout=0.0, bidirectional=False, device=None, dtype=None)[исходный код] -
Применяет многослойную сеть Элмана RNN с нелинейностью или к входной последовательности. Для каждого элемента входной последовательности каждый слой вычисляет следующую функцию:
где — скрытое состояние в момент времени
t, — вход в момент времениt, а — скрытое состояние предыдущего слоя в момент времениt-1или начальное скрытое состояние в момент времени0. Еслиnonlinearityравно'relu', то вместо используется .# Efficient implementation equivalent to the following with bidirectional=False rnn = nn.RNN(input_size, hidden_size, num_layers) params = dict(rnn.named_parameters()) def forward(x, hx=None, batch_first=False): if batch_first: x = x.transpose(0, 1) seq_len, batch_size, _ = x.size() if hx is None: hx = torch.zeros(rnn.num_layers, batch_size, rnn.hidden_size) h_t_minus_1 = hx.clone() h_t = hx.clone() output = [] for t in range(seq_len): for layer in range(rnn.num_layers): input_t = x[t] if layer == 0 else h_t[layer - 1] h_t[layer] = torch.tanh( input_t @ params[f"weight_ih_l{layer}"].T + h_t_minus_1[layer] @ params[f"weight_hh_l{layer}"].T + params[f"bias_hh_l{layer}"] + params[f"bias_ih_l{layer}"] ) output.append(h_t[-1].clone()) h_t_minus_1 = h_t.clone() output = torch.stack(output) if batch_first: output = output.transpose(0, 1) return output, h_t- Параметры:
-
-
input_size – Количество признаков во входных данных
x -
hidden_size – Количество признаков в скрытом состоянии
h -
num_layers – Количество рекуррентных слоёв. Например, значение
num_layers=2означает объединение двух RNN вstacked RNN, где вторая RNN получает выходы первой RNN и вычисляет окончательные результаты. Значение по умолчанию: 1 -
nonlinearity – Используемая нелинейность. Может быть
'tanh'или'relu'. Значение по умолчанию:'tanh' -
bias – Если
False, слой не использует веса смещенияb_ihиb_hh. Значение по умолчанию:True -
batch_first – Если
True, входные и выходные тензоры передаются в формате(batch, seq, feature)вместо(seq, batch, feature). Обратите внимание, что это не относится к скрытым состояниям и состояниям ячеек. Подробности см. в разделах «Входы/Выходы» ниже. Значение по умолчанию:False -
dropout – Если значение не равно нулю, добавляет слой
Dropoutк выходам каждого слоя RNN, кроме последнего, с вероятностью dropout, равнойdropout. Значение по умолчанию: 0 -
bidirectional – Если
True, сеть становится двунаправленной RNN. Значение по умолчанию:False
-
input_size – Количество признаков во входных данных
- Входы: input, hx
-
-
input: тензор формы для входа без пакетов, , если
batch_first=False, или , еслиbatch_first=True, содержащий признаки входной последовательности. Вход также может быть упакованной последовательностью переменной длины. Подробности см. в описанииtorch.nn.utils.rnn.pack_padded_sequence()илиtorch.nn.utils.rnn.pack_sequence(). - hx: тензор формы для входа без пакетов или , содержащий начальное скрытое состояние для пакета входных последовательностей. Если значение не указано, по умолчанию используются нули.
где:
-
input: тензор формы для входа без пакетов, , если
- Выходы: output, h_n
-
-
output: тензор формы для входа без пакетов, , если
batch_first=False, или , еслиbatch_first=True, содержащий выходные признаки(h_t)последнего слоя RNN для каждогоt. Если в качестве входных данных переданtorch.nn.utils.rnn.PackedSequence, выход также будет упакованной последовательностью. - h_n: тензор формы для входа без пакетов или , содержащий окончательное скрытое состояние для каждого элемента пакета.
-
output: тензор формы для входа без пакетов, , если
- Переменные:
-
-
weight_ih_l[k] – обучаемые веса входа—скрытого состояния k-го слоя, формы
(hidden_size, input_size)дляk = 0. В противном случае форма равна(hidden_size, num_directions * hidden_size) -
weight_hh_l[k] – обучаемые веса скрытого состояния—скрытого состояния k-го слоя, формы
(hidden_size, hidden_size) -
bias_ih_l[k] – обучаемое смещение входа—скрытого состояния k-го слоя, формы
(hidden_size) -
bias_hh_l[k] – обучаемое смещение скрытого состояния—скрытого состояния k-го слоя, формы
(hidden_size)
-
weight_ih_l[k] – обучаемые веса входа—скрытого состояния k-го слоя, формы
Примечание
Все веса и смещения инициализируются из , где
Примечание
Для двунаправленных RNN прямое и обратное направления обозначаются соответственно числами 0 и 1. Пример разделения выходных слоёв при
batch_first=False:output.view(seq_len, batch, num_directions, hidden_size).Примечание
Аргумент
batch_firstигнорируется для входов без пакетов.Предупреждение
Для функций RNN известны проблемы с недетерминированностью в некоторых версиях cuDNN и CUDA. Детерминированное поведение можно обеспечить, задав следующие переменные окружения:
Задайте переменную окружения (обратите внимание на начальный символ двоеточия)
CUBLAS_WORKSPACE_CONFIG=:16:8илиCUBLAS_WORKSPACE_CONFIG=:4096:2Дополнительные сведения см. в примечаниях к выпуску cuDNN 8.
Примечание
Если выполнены следующие условия: 1) включён cudnn, 2) входные данные находятся на GPU, 3) тип данных входных данных —
torch.float16, 4) используется GPU V100, 5) входные данные не представлены в форматеPackedSequence, для повышения производительности может быть выбран персистентный алгоритм.Примеры:
>>> rnn = nn.RNN(10, 20, 2) >>> input = torch.randn(5, 3, 10) >>> h0 = torch.randn(2, 3, 20) >>> output, hn = rnn(input, h0)
-
forward(input: Tensor, hx: Tensor | None = None) → tuple[Tensor, Tensor][исходный код] - forward(input:PackedSequence, hx:Tensor|None=None) tuple[PackedSequence,Tensor]
-
Выполняет прямой проход.
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.nn.modules.rnn.RNN.html