Spec-Zone.ru › PyTorch 2.14

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 с нелинейностью 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 – Если значение не равно нулю, добавляет слой Dropout к выходам каждого слоя RNN, кроме последнего, с вероятностью 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) тип данных входных данных — 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

Spec-Zone.ru

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