17. 非线性激活函数

非线性激活函数
1. 为什么要使用非线性激活函数
  • 对于一个网络结构来说,如果不引入非线性处理方式,那么经过多层网络的堆叠后,输入数据与输出数据之间的映射始终是线性的 (公式推导略)
  • 非线性激活函数通常应用于每一个神经元末尾,或者特征提取层、特征处理层之后,赋予特征非线性性,正是这种非线性性,让特征可以通过非线性变换来表示复杂的图像或者数据!
2. 非线性激活函数的使用实例
  • 加载 torchvision 中的数据,并构建一个基本的 DataLoader 实例

    data = torchvision.datasets.CIFAR10(
        root="./data_torchvision",
        train=False,
        transform=torchvision.transforms.ToTensor(),
        download=True
    )
    dataloader = DataLoader(data,
                            batch_size=64)
    
  • 创建一个简单的神经网络基本框架 Model,非线性激活函数一般应用于每层特征提取、特征处理之后,这里在卷积层、池化层后都应用一次非线性激活函数 sigmoid()函数

    class Model(nn.Module):
        def __init__(self):
            super(Model, self).__init__()
            self.conv = nn.Conv2d(
                in_channels=3,
                out_channels=3,
                kernel_size=3,
                stride=1,
            )
            self.pool = nn.MaxPool2d(kernel_size=3,
                                     ceil_mode=True)
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            conv = self.conv(x)
            pool = self.pool(self.sigmoid(conv))
            output = self.sigmoid(pool)
            return conv, pool, output
    
  • 同样使用 tensorboard 来记录每层处理后的数据

    with SummaryWriter("log") as writer:
        step = 0
        model = Model()
        for data in dataloader:
            imgs, labels = data
            writer.add_images("input",
                              img_tensor=imgs,
                              global_step=step)
            writer.add_images("conv+pool", 
                              model(imgs)[0],
                              global_step=step)
            writer.add_images("pool", 
                              model(imgs)[1],
                              global_step=step)
            writer.add_images("output",
                              img_tensor=model(imgs)[2],
                              global_step=step)
            step += 1
    
  • 展示了原始数据inputinput进行卷积操作后的convconv进行非线性激活以及池化操作后的poolpool最后进行一次非线性激活得到output

    • 原始数据 input

      image-20240819203648146

    • input 卷积后的数据 conv

      image-20240819203735421

    • conv非线性处理后进行池化操作得到 pool

      image-20240819203834266

    • pool最后经过一层非线性激活后输出 output

      image-20240819203956166

3.常见的非线性激活函数
  • ReLU激活函数:

    nn.ReLU()
    

    R e L U ( x ) = m a x { 0 , x } ReLU(x)=max\{0, x\} ReLU(x)=max{0,x}

  • LeakyReLU激活函数:

    nn.LeakyReLU()
    

    L e a k y R e L U ( x ) = m a x { 0.01 x , x } LeakyReLU(x)=max\{0.01x, x\} LeakyReLU(x)=max{0.01x,x}

  • Sigmoid激活函数

    nn.Sigmoid()
    

    S i g m o i d ( x ) = 1 1 + e − x Sigmoid(x) = {{1}\over{1+e^{-x}}} Sigmoid(x)=1+ex1

  • Tanh激活函数

    nn.Tanh()
    

    T a n h ( x ) = e x − e − x e x + e − x Tanh(x) = {{e^{x}-e^{-x}}\over{e^{x}+e^{-x}}} Tanh(x)=ex+exexex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都想学的大学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值