FA_CNN卷积神经网络三---非线性激活函数PyTorch

FA :Formulas and Algorithm,CNN:Convolutional Neural Network

1. 非线性激活函数简介

在深度学习中,激活函数 是神经网络中不可或缺的组成部分。它的主要作用是引入非线性,使得神经网络能够学习和模拟复杂的函数映射关系。如果没有激活函数,无论网络有多少层,其输出都只是输入的线性组合,表达能力将大打折扣。

PyTorch 的 torch.nn 模块中提供了丰富的激活函数,其中最常用的包括 ReLU 和 Sigmoid。本文将结合代码实例,带你快速掌握这两种激活函数的使用方法,并学会如何通过 TensorBoard 直观地观察激活前后的效果差异。

2. 核心概念:inplace 参数

在正式写代码之前,我们先来理解一个关键参数------inplace。

inplace 意为「原地操作」,它决定了函数处理数据时是否直接修改原始变量:

  • inplace=True:直接在原变量上进行替换,原始变量的值会被修改,不额外占用内存。
  • inplace=False(默认值):创建一个新变量,将函数处理后的结果赋值给新变量,原始变量的值保持不变。

💡 建议 :在大多数场景下,使用默认的 inplace=False 更安全,可以避免因原地修改导致的反向传播计算错误。

3. ReLU 激活函数实战

ReLU(Rectified Linear Unit,修正线性单元) 的数学表达式为:

复制代码
f(x) = max(0, x)

即:当输入大于 0 时,原样输出;当输入小于等于 0 时,输出 0。ReLU 计算简单、收敛速度快,是目前最常用的激活函数之一。

下面我们通过一个完整的示例来演示 ReLU 的使用:

python 复制代码
import torch
from torch import nn
from torch.nn import ReLU

# 构造输入张量
input = torch.tensor([[1, -0.5],
                      [-1, 3]])
input = torch.reshape(input, (-1, 1, 2, 2))
print(input.shape)  # torch.Size([1, 1, 2, 2])

# 定义网络结构
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.relu1 = ReLU()

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

# 实例化并前向传播
tudui = Tudui()
output = tudui(input)
print(output)

运行结果:

复制代码
torch.Size([1, 1, 2, 2])
tensor([[[[1., 0.],
          [0., 3.]]]])

从输出可以看到,输入中的负数 -0.5 和 -1 都被置为 0,而正数 1 和 3 保持不变,完美体现了 ReLU 的「单侧抑制」特性。

4. Sigmoid 激活函数实战

Sigmoid 函数的数学表达式为:

复制代码
f(x) = 1 / (1 + e^(-x))

它将任意实数压缩到 (0, 1) 区间内,常用于二分类问题的输出层。下面我们结合 CIFAR10 数据集,演示 Sigmoid 的完整使用流程:

python 复制代码
import torch
import torchvision
from torch import nn
from torch.nn import ReLU
from torch.nn import Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 加载 CIFAR10 测试集
dataset = torchvision.datasets.CIFAR10(
    "./dataset",
    train=False,
    transform=torchvision.transforms.ToTensor(),
    download=True
)
dataloader = DataLoader(dataset, batch_size=64)

# 定义网络结构
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.relu1 = ReLU()
        self.sigmoid1 = Sigmoid()

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

tudui = Tudui()
writer = SummaryWriter("logs")
step = 0

for data in dataloader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    output = tudui(imgs)
    writer.add_images("output", output, step)
    step = step + 1

运行后,终端会输出数据集下载与验证信息:

复制代码
Files already downloaded and verified
Files already downloaded and verified

5. 使用 TensorBoard 可视化结果

为了直观地对比激活前后的图像效果,我们可以借助 TensorBoard 来查看日志。

5.1 启动 TensorBoard

在 Anaconda 终端中,按以下步骤操作:

  1. 激活对应的 Python 环境(例如 py3.6.3):
bash 复制代码
conda activate py3.6.3
  1. 输入 tensorboard 命令,指定日志目录:
bash 复制代码
tensorboard --logdir=C:\Users\wangy\Desktop\03CV\logs
  1. 将终端输出的网址复制到浏览器地址栏并回车,即可在浏览器中查看 TensorBoard 的可视化结果。

5.2 观察要点

在 TensorBoard 的 Images 标签页中,你可以同时查看:

  • input:原始输入图像;
  • output:经过 Sigmoid 激活后的输出图像。

通过对比,可以直观地感受到激活函数对数据分布的改变,从而加深对非线性变换的理解。

6. 总结

本文通过两个实战案例,带你掌握了 PyTorch 中 ReLU 与 Sigmoid 两种非线性激活函数的基本用法,并介绍了 inplace 参数的含义以及如何借助 TensorBoard 可视化激活效果。

核心要点回顾:

  • ReLU :max(0, x),计算高效,适合隐藏层;
  • Sigmoid:输出范围 (0, 1),适合二分类输出层;
  • inplace :原地操作需谨慎,默认建议 False;
  • TensorBoard:强大的可视化工具,助力调试与理解。

希望本文能帮助你夯实 PyTorch 基础,在深度学习的道路上更进一步!

相关推荐
Kapaseker12 分钟前
你花大价钱买的那张 5090 可能跑不了本地 AI 模型
人工智能
程序员果子33 分钟前
本体构建方法
人工智能·python·知识图谱·agent框架·本体
深蓝AI1 小时前
Meta FAIR 开源 e-means:k-means 十分之一的轮数跑出更低损失,已并入 Faiss
人工智能·程序员
IT_陈寒1 小时前
Vue这个奇葩的响应式问题让我加班到凌晨
前端·人工智能·后端
yunhuibin1 小时前
AI分类任务种类
人工智能·自然语言处理·分类
东坡肘子1 小时前
参与学生移动应用大赛有感 -- 肘子的 Swift 周报 #161
人工智能·swiftui·swift
天天被压力1 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
唐老板1 小时前
agent 撑爆 Git 之后,两家改的不是同一层
人工智能·ai编程
天天被压力1 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python