Класс GRU
Класс GRU реализует рекуррентный слой с вентилями (Gated Recurrent Unit),
который является упрощенной версией LSTM и эффективно обрабатывает
последовательности данных. Первым параметром передается размер входных
признаков, вторым - размер скрытого состояния, третьим - количество слоев.
Синтаксис
torch.nn.GRU(
input_size,
hidden_size,
num_layers=1,
bias=True,
batch_first=False,
dropout=0.0,
bidirectional=False
)
Параметры
Метод принимает следующие параметры:
input_size- размер входных признаков на каждом временном шаге.hidden_size- размер скрытого состояния.num_layers- количество рекуррентных слоев (по умолчанию1).bias- использовать ли смещение (по умолчаниюTrue).batch_first- еслиTrue, то вход имеет форму(batch, seq, feature)(по умолчаниюFalse).dropout- вероятность dropout между слоями (по умолчанию0.0).bidirectional- использовать ли двунаправленный GRU (по умолчаниюFalse).
Вход и выход
На вход слой принимает тензор формы (seq_len, batch, input_size)
(или (batch, seq_len, input_size), если batch_first=True).
Возвращает выходные данные всех временных шагов и финальное скрытое состояние.
Пример
Давайте создадим простой GRU слой и применим его к случайной последовательности:
import torch
torch.manual_seed(0)
gru = torch.nn.GRU(
input_size=10,
hidden_size=20,
num_layers=2
)
x = torch.randn(5, 3, 10) # seq_len=5, batch=3, features=10
output, hidden = gru(x)
print(output.shape)
print(hidden.shape)
Результат выполнения кода:
torch.Size([5, 3, 20])
torch.Size([2, 3, 20])
Пример
Теперь создадим GRU слой с параметром batch_first=True и применим его к данным:
import torch
torch.manual_seed(0)
gru = torch.nn.GRU(
input_size=10,
hidden_size=20,
num_layers=1,
batch_first=True
)
x = torch.randn(3, 5, 10) # batch=3, seq_len=5, features=10
output, hidden = gru(x)
print(output.shape)
print(hidden.shape)
Результат выполнения кода:
torch.Size([3, 5, 20])
torch.Size([1, 3, 20])
Пример
Давайте создадим двунаправленный GRU слой и применим его к последовательности:
import torch
torch.manual_seed(0)
gru = torch.nn.GRU(
input_size=10,
hidden_size=20,
num_layers=1,
bidirectional=True
)
x = torch.randn(5, 3, 10)
output, hidden = gru(x)
print(output.shape)
print(hidden.shape)
Результат выполнения кода:
torch.Size([5, 3, 40])
torch.Size([2, 3, 20])
Пример
Инициализируем скрытое состояние вручную и прогоним через GRU слой:
import torch
torch.manual_seed(0)
gru = torch.nn.GRU(
input_size=5,
hidden_size=10,
num_layers=2
)
x = torch.randn(4, 2, 5) # seq_len=4, batch=2, features=5
h0 = torch.randn(2, 2, 10) # num_layers=2, batch=2, hidden_size=10
output, hidden = gru(x, h0)
print(output.shape)
print(hidden.shape)
Результат выполнения кода:
torch.Size([4, 2, 10])
torch.Size([2, 2, 10])
Смотрите также
-
класс
LSTM,
который реализует более сложный рекуррентный слой с механизмом памяти -
класс
RNN,
который реализует базовый рекуррентный слой без вентилей -
класс
GRUCell,
который реализует одну ячейку GRU для одного временного шага -
класс
LSTMCell,
который реализует одну ячейку LSTM для одного временного шага