Spec-Zone.ru › PyTorch 2.14

RNN

class torch.nn.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 Эльмана с нелинейностью tanh⁡\tanh или ReLU\text{ReLU} к входной последовательности. Для каждого элемента входной последовательности каждый слой вычисляет следующую функцию:

ht=tanh⁡(xtWihT+bih+ht−1WhhT+bhh)h_t = \tanh(x_t W_{ih}^T + b_{ih} + h_{t-1}W_{hh}^T + b_{hh})

где hth_t — скрытое состояние в момент времени t, xtx_t — вход в момент времени t, а h(t−1)h_{(t-1)} — скрытое состояние предыдущего слоя в момент времени t-1 или начальное скрытое состояние в момент времени 0. Если nonlinearity равно 'relu', вместо tanh⁡\tanh используется ReLU\text{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 – Если значение ненулевое, к выходам каждого слоя RNN, кроме последнего, добавляется слой Dropout с вероятностью dropout, равной dropout. По умолчанию: 0
  • bidirectional – Если True, используется двунаправленная RNN. По умолчанию: False
Входы: input, hx
  • input: тензор формы (L,Hin)(L, H_{in}) для входа без пакетов, (L,N,Hin)(L, N, H_{in}) при batch_first=False или (N,L,Hin)(N, L, H_{in}) при batch_first=True, содержащий признаки входной последовательности. Вход также может быть упакованной последовательностью переменной длины. Подробности см. в описании torch.nn.utils.rnn.pack_padded_sequence() или torch.nn.utils.rnn.pack_sequence().
  • hx: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) для входа без пакетов или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}), содержащий начальное скрытое состояние для пакета входных последовательностей. Если оно не задано, по умолчанию используется нулевое состояние.

где:

N=batch sizeL=sequence lengthD=2 if bidirectional=True otherwise 1Hin=input_sizeHout=hidden_size\begin{aligned} N ={} & \text{batch size} \\ L ={} & \text{sequence length} \\ D ={} & 2 \text{ if bidirectional=True otherwise } 1 \\ H_{in} ={} & \text{input\_size} \\ H_{out} ={} & \text{hidden\_size} \end{aligned}
Выходы: output, h_n
  • output: тензор формы (L,D∗Hout)(L, D * H_{out}) для входа без пакетов, (L,N,D∗Hout)(L, N, D * H_{out}) при batch_first=False или (N,L,D∗Hout)(N, L, D * H_{out}) при batch_first=True, содержащий выходные признаки (h_t) последнего слоя RNN для каждого t. Если на вход подана torch.nn.utils.rnn.PackedSequence, выход также будет упакованной последовательностью.
  • h_n: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) для входа без пакетов или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}), содержащий конечное скрытое состояние для каждого элемента пакета.
Переменные:
  • 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)

Примечание

Все веса и смещения инициализируются из U(−k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k}), где k=1hidden_sizek = \frac{1}{\text{hidden\_size}}

Примечание

Для двунаправленных 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) входные данные имеют dtype 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.RNN.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API