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 基础,在深度学习的道路上更进一步!

相关推荐
Geek-Chow2 小时前
实验:用 Claude Code 一句提示词生成 three.js 3D V8 发动机剖视动画(附 GIF/MP4 导出)
人工智能
阿里云大数据AI技术2 小时前
云栖实录|从数据闭环到模型闭环,阿里云全栈方案助力多模态AI走向生产
人工智能·agent
“AI国潮设计-小江”2 小时前
【AIGC实战】Python+SDXL批量生成「潮汕英歌舞冰淇淋蛋糕&红桃粿咖啡」IP,固定角色形象批量出甜品商业效果图
开发语言·人工智能·python·prompt·aigc
Leo.yuan2 小时前
企业级AI分析平台技术选型:FineBI(AI原生版)的NL2BI架构与业务适配能力
大数据·人工智能
疯狂奔跑华丽跌倒2 小时前
医药行业数据治理工具选型,需匹配业务与AI落地需求
大数据·人工智能·经验分享
飞哥数智坊3 小时前
我用 WorkBuddy 复刻了 Claude 的 Vibe Video,效果不错
人工智能
small_wh1te_coder3 小时前
AI技术总监级拆解大模型|第21讲:大模型微调工程——什么时候用 LoRA?深度拆解 PEFT 低秩分解、QLoRA 与成本账本
人工智能
紧跟先前的步伐3 小时前
Go AI Agent 实战 02|大语言模型(LLM)到底是怎么工作的
人工智能·语言模型·golang
七牛云行业应用3 小时前
Codex接MCP完整教程:从官方文档服务器到HTTP、STDIO与OAuth配置(2026年10月)
人工智能·ai·agent·ai编程