Spec-Zone.ru › PyTorch 2

RNN

class torch.nn.RNN(self, input_size, hidden_size, num_layers=1, nonlinearity='tanh', bias=True, batch_first=False, dropout=0.0, bidirectional=False, device=None, dtype=None) [source]

Применяет многослойный 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', используется ReLU\text{ReLU} вместо tanh⁡\tanh.

Параметры
  • 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. По умолчанию: 0
  • bidirectional – Если True, становится двунаправленным RNN. По умолчанию: False
Входы: вход, h_0
  • вход: тензор формы (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() для получения подробностей.
  • h_0: тензор формы (D∗num_layers,Hout)(D * \text{num\_layers}, H_{out}) для неразобранного входного сигнала или (D∗num_layers,N,Hout)(D * \text{num\_layers}, N, H_{out}) содержащий начальное скрытое состояние для пакетного входного сигнала. По умолчанию равен нулю, если не указано.

где:

N=размер пакетаL=длина последовательностиD=2 если bidirectional=True, иначе 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}
Выходы: выход, h_n
  • выход: тензор формы (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. Можно обеспечить детерминированное поведение, задав следующие переменные окружения:

На CUDA 10.1 установите переменную окружения CUDA_LAUNCH_BLOCKING=1. Это может повлиять на производительность.

На CUDA 10.2 или более поздних версиях установите переменную окружения (обратите внимание на ведущий символ двоеточия) CUBLAS_WORKSPACE_CONFIG=:16:8 или CUBLAS_WORKSPACE_CONFIG=:4096:2.

Для получения дополнительной информации см. cuDNN 8 Release Notes.

Примечание

Если выполнены следующие условия: 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)

© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.nn.RNN.html

Spec-Zone.ru

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