Функция silu
Функция F.silu применяет функцию активации SiLU (Sigmoid Linear Unit),
также известную как Swish, к каждому элементу входного тензора.
Функция вычисляется как x * sigmoid(x), что создаёт гладкую,
непрерывную и неограниченную сверху функцию активации.
Параметром функция принимает входной тензор произвольной формы.
Синтаксис
torch.nn.functional.silu(input)
Функция может быть вызвана как непосредственно из модуля F,
так и как метод тензора через silu.
Пример
Базовое применение функции SiLU к одномерному тензору:
import torch
import torch.nn.functional as F
t = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
res = F.silu(t)
print(res)
Результат выполнения кода:
tensor([-0.2384, -0.2689, 0.0000, 0.7311, 1.7616])
Пример
Применение SiLU к двумерному тензору:
import torch
import torch.nn.functional as F
t = torch.tensor([
[-3.0, -2.0, -1.0],
[0.0, 1.0, 2.0],
[3.0, 4.0, 5.0]
])
res = F.silu(t)
print(res)
Результат выполнения кода:
tensor([
[-0.1426, -0.2384, -0.2689],
[0.0000, 0.7311, 1.7616],
[2.8574, 3.9281, 4.9669]
])
Пример
Использование SiLU в качестве слоя в нейронной сети. Функция активации применяется после линейного слоя:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(5, 3)
def forward(self, x):
x = self.linear(x)
x = F.silu(x)
return x
model = SimpleNet()
t = torch.randn(2, 5)
res = model(t)
print(res.shape)
print(res)
Результат выполнения кода:
torch.Size([2, 3])
tensor([
[0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000]
], grad_fn=<SiluBackward0>)
Пример
Сравнение SiLU с сигмоидой для наглядности. Видно, что SiLU наследует свойства сигмоиды, но не насыщается для больших положительных значений:
import torch
import torch.nn.functional as F
t = torch.linspace(-10, 10, 5)
silu_res = F.silu(t)
sigmoid_res = torch.sigmoid(t)
print("Input: ", t)
print("SiLU: ", silu_res)
print("Sigmoid: ", sigmoid_res)
Результат выполнения кода:
"Input: tensor([-10.0000, -5.0000, 0.0000, 5.0000, 10.0000])"
"SiLU: tensor([-0.0005, -0.0337, 0.0000, 4.9669, 9.9995])"
"Sigmoid: tensor([0.0000, 0.0067, 0.5000, 0.9933, 1.0000])"
Смотрите также
-
функцию
relu,
которая реализует простую и широко используемую функцию активации ReLU -
функцию
elu,
которая является экспоненциальной версией ReLU с гладким переходом -
функцию
gelu,
которая является гладкой аппроксимацией ReLU, основанной на гауссовском распределении -
функцию
softplus,
которая является гладкой аппроксимацией ReLU с мягким насыщением