PyTorch 深度学习笔记(十一):Sigmoid 激活函数在 PyTorch 中的实现与使用案例
·
Sigmoid 激活函数简介
Sigmoid 函数是深度学习中常用的非线性激活函数之一,其数学表达式为:
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$
Sigmoid 函数将输入值压缩到 (0, 1) 区间内,常用于二分类问题的输出层或中间层的激活函数。它的特点是输出平滑且易于求导,但存在梯度消失问题。
PyTorch 中的 Sigmoid 实现
PyTorch 提供了两种方式实现 Sigmoid 激活函数:通过 torch.sigmoid() 函数或 nn.Sigmoid() 模块。
使用 torch.sigmoid() 函数
import torch
# 定义输入张量
x = torch.tensor([-1.0, 0.0, 1.0])
# 应用 sigmoid 函数
output = torch.sigmoid(x)
print(output)
输出结果类似:
tensor([0.2689, 0.5000, 0.7311])
使用 nn.Sigmoid() 模块
import torch.nn as nn
# 创建 Sigmoid 模块
sigmoid = nn.Sigmoid()
# 应用 sigmoid 模块
output = sigmoid(x)
print(output)
Sigmoid 在神经网络中的应用案例
二分类问题输出层
在二分类任务中,Sigmoid 常用于输出层,将模型的原始输出转换为概率值。
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 1),
nn.Sigmoid()
)
# 假设输入数据
input_data = torch.randn(1, 10)
output = model(input_data)
print(output) # 输出概率值
自定义损失函数
Sigmoid 常与 BCELoss (Binary Cross Entropy Loss) 结合使用:
criterion = nn.BCELoss()
# 假设预测值和真实标签
pred = torch.tensor([0.9, 0.2, 0.8], requires_grad=True)
target = torch.tensor([1.0, 0.0, 1.0])
loss = criterion(pred, target)
print(loss)
Sigmoid 的梯度特性
Sigmoid 函数的导数为:
$$ \sigma'(x) = \sigma(x)(1 - \sigma(x)) $$
在 PyTorch 中,自动微分可以自动计算 Sigmoid 的梯度:
x = torch.tensor(1.0, requires_grad=True)
y = torch.sigmoid(x)
y.backward()
print(x.grad) # 输出梯度值
Sigmoid 与其他激活函数的比较
- ReLU:计算更简单,缓解梯度消失问题,但不适合输出层
- Tanh:输出范围 (-1, 1) 更适合某些场景
- Softmax:多分类问题的首选,而 Sigmoid 更适合二分类
使用注意事项
- 深层网络中谨慎使用 Sigmoid,可能导致梯度消失
- 输出层使用 Sigmoid 时,注意配合适当的损失函数
- 对于大型网络,ReLU 等激活函数通常表现更好
可视化示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 10, 100)
y = torch.sigmoid(torch.tensor(x)).numpy()
plt.plot(x, y)
plt.title("Sigmoid Function")
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.grid(True)
plt.show()
这段代码将绘制出 Sigmoid 函数的曲线,直观展示其将输入压缩到 (0,1) 区间的特性。
更多推荐

所有评论(0)