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 终端中,按以下步骤操作:
- 激活对应的 Python 环境(例如
py3.6.3):
bash
conda activate py3.6.3
- 输入
tensorboard命令,指定日志目录:
bash
tensorboard --logdir=C:\Users\wangy\Desktop\03CV\logs
- 将终端输出的网址复制到浏览器地址栏并回车,即可在浏览器中查看 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 基础,在深度学习的道路上更进一步!