神经网络:非线性激活(ReLU & Sigmoid)详解
本文通过PyTorch实战演示了ReLU和Sigmoid两种激活函数的应用。实验使用CIFAR-10数据集,结合Tensorboard可视化,展示非线性激活对神经网络的重要性。ReLU通过截断负值筛选特征,计算高效;Sigmoid将数值压缩到(0,1)区间,适合分类输出。代码实现了一个串联网络:先用ReLU过滤输入,再通过Sigmoid映射。实验显示激活函数会显著改变图像特征,ReLU消除负值,S
本文通过 PyTorch 实战演示了 ReLU 和 Sigmoid 两种核心非线性激活函数的使用。通过对 CIFAR-10 数据集进行处理并结合 Tensorboard 可视化,深入浅出地解释了为什么非线性激活是神经网络具备强大拟合能力的关键,适合深度学习初学者快速上手。
1. 为什么需要非线性激活?
如果在神经网络中不使用非线性激活函数,无论你的网络有多少层,最终都只是输入的线性组合(相当于一层感知机)。
非线性激活的作用:
-
引入非线性特征:使模型能够拟合复杂的函数关系(如曲线、边界等)。
-
特征提取:通过截断或压缩数据,帮助网络学习更有用的信号。
2. 常用激活函数对比
在你的代码中,同时使用了最经典的两种激活函数:
ReLU (Rectified Linear Unit)
-
公式:

-
特点:输入大于 0 时原样输出,小于 0 时变为 0。
-
优点:计算速度极快,有效缓解梯度消失问题,是目前卷积神经网络的首选。

Sigmoid
-
公式:

-
特点:将输入数值压缩到 (0, 1)之间。
-
优点:适合做二分类输出;缺点:在深层网络中容易导致梯度消失,且计算量相对较大。

3. 代码逻辑解析
在本次实验中,我们定义了一个串联的激活网络:输入先经过 ReLU 过滤负数,再经过 Sigmoid 进行归一化映射。
class Relu1(nn.Module):
def __init__(self):
super(Relu1, self).__init__()
self.relu = ReLU() # 实例化 ReLU
self.sigmoid = Sigmoid() # 实例化 Sigmoid
def forward(self, x):
out1 = self.relu(x) # 第一步:把小于0的数变0
out2 = self.sigmoid(out1) # 第二步:把数值映射到 0~1 之间
return out2
矩阵计算演示
以代码中的 input_x 为例:
-
输入:
[[1, 0.5], [-1, 3]] -
经过 ReLU:
[[1, 0.5], [0, 3]](-1 被截断为 0) -
经过 Sigmoid:每个元素计算 ,最终结果均在 0.5 到 1 之间。
4. 实战与可视化
通过 CIFAR-10 数据集,我们可以直观看到激活函数对图像的影响。
运行步骤:
-
运行 Python 脚本生成日志。
-
在终端输入:
tensorboard --logdir=Relu。 -
打开浏览器查看图像。
实验现象观察:
-
输入图像:正常的 RGB 彩色图片。
-
输出图像:经过
ReLU和Sigmoid后,图像色调会发生明显变化。因为ReLU抹去了部分负值特征(虽然图像像素通常为正,但在某些标准化处理后会有负值),而Sigmoid将像素值重新压缩,导致对比度改变。
5. 总结
-
ReLU 是“过滤器”,负责筛选重要特征。
-
Sigmoid 是“压缩器”,负责控制数值范围。
-
在实际开发中,通常在隐藏层使用 ReLU,在二分类任务的输出层使用 Sigmoid。
更多推荐
所有评论(0)