2025-10-24
点 赞
0
热 度
19
评 论
0

Pytorch非线性激活(SiLU)篇

  1. 首页
  2. 深度学习
  3. Pytorch非线性激活(SiLU)篇

1.什么是非线性激活

非线性激活是一种将以各种函数的表现形式加入到输入中的方法。以最常见的 ReLU 和 Sigmoid 举例,其图示如下:

../_images/ReLU.png

图 1 ReLU 函数

../_images/Sigmoid.png

图 2 Sigmoid 函数

ReLU 函数就是输入为负时取 0,输入为正时取其本身,是一个简单的截断操作;sigmoid 函数是σ函数,其公式为:

Sigmoid(x)=σ(x)=\frac{1}{(1+e^{-x})}

非线性激活最主要的作用就是给输入添加非线性特征,提升模型的泛化能力。

2.SiLU函数

在我看来,SiLU 函数就是一种特殊的 Sigmoid 函数,算是 Sigmoid 函数的一个变种,其公式如下:

Sigmoid(x)=x*σ(x)=\frac{x}{(1+e^{-x})}

非线性激活并没有太多参数,一般来说非线性激活只需要提供输入即可,另外非线性激活还有一个较为重要的参数为 inplace,inplace 也是意如其名,它指的是是否将输入替换为非线性激活后的结果,其默认值为 False 即不替代,一般推荐使用默认值以保证输入的完整性。

3.具象化表示

这步演示我依然使用 CIFAR10 数据集,构建一个最简化的模型来演示非线性激活的实际效果,图 1 是原始图像,图 2 是非线性激活 SiLU 后的结果,这里取一个 batch 做演示:

图 1 原始图像

图 2 非线性激活后的结果

下面是测试代码:

import torchvision
from tensorboardX import SummaryWriter
from torch import nn
from torch.utils.data import DataLoader

data_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, download=True, transform=torchvision.transforms.ToTensor())
data_loader = DataLoader(dataset=data_set, batch_size=64)

class Example(nn.Module):
    def __init__(self):
        super(Example, self).__init__()
        self.silu1 = nn.SiLU()

    def forward(self, input):
        output = self.silu1(input)
        return output

example = Example()
writer = SummaryWriter("./logs_silu")
step = 0
for data in data_loader:
    imgs, targets = data
    writer.add_images("input", imgs, global_step=step)
    output = example(imgs)
    writer.add_images("output", output, global_step=step)
    step += 1
writer.close()


我自己用的账号

enfj 主人公

不具版权性
不具时效性

文章内容不具时效性。若文章内容有错误之处,请您批评指正。

目录

欢迎来到Henry的站点,为您导航全站动态

18 文章数
4 分类数
1 评论数
5标签数