在使用torch.nn.functional模块时,需要导入包:
from torch.nn import functional
以下是常见激活函数的介绍以及对应的代码示例:
tanh (双曲正切)
输出范围:(-1, 1)
特点:中心对称,适合处理归一化后的数据。
公式:
import torch
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
y = torch.nn.funcationl.tanh(x)
print(y) # 输出:tensor([-0.9640, -0.7616, 0.0000, 0.7616, 0.9640])
sigmoid (S形函数)
输出范围:(0, 1)
特点:用于将输入映射到概率值,但可能会导致梯度消失问题。
公式:
y = torch.nn.funcational.sigmoid(x)
print(y) # 输出:tensor([0.1192, 0.2689, 0.5000, 0.7311, 0.8808])
SiLU (Sigmoid Linear Unit,也称Swish)
输出范围:(0, x)
特点:结合了线性和非线性特性,效果较好。
公式:silu(x) = x * sigmoid(x)
y = torch.nn.funcationl.silu(x)
print(y) # 输出:tensor([-0.2384, -0.2689, 0.0000, 0.7311, 1.7616])
GELU (Gaussian Error Linear Unit)
输出范围:接近ReLU,但更加平滑。
特点:常用于Transformer模型。
公式:近似为:gelu(x) ≈ x * sigmoid(1.702 * x)
y = torch.nn.functional.gelu(x)
print(y) # 输出:tensor([-0.0454, -0.1588, 0.0000, 0.8413, 1.9546])
ReLU (Rectified Linear Unit)
输出范围:[0, +∞)
特点:简单高效,是最常用的激活函数之一。
公式:relu(x) = max(0, x)
y = torch.nn.funcationl.relu(x)
print(y) # 输出:tensor([0., 0., 0., 1., 2.])
ReLU_ (In-place ReLU)
输出范围:[0, +∞)
特点:修改原张量而不是生成新的张量,节省内存。
x.relu_() # 注意:会改变x本身
print(x) # x的值被修改为:tensor([0., 0., 0., 1., 2.])
Leaky ReLU
输出范围:(-∞, +∞)
特点:允许负值有较小的输出,避免死神经元问题。
公式:leaky_relu(x) = x if x > 0 else alpha * x
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
y = torch.nn.functional.leaky_relu(x, negative_slope=0.01)
print(y) # 输出:tensor([-0.0200, -0.0100, 0.0000, 1.0000, 2.0000])
Leaky ReLU_ (In-place Leaky ReLU)
特点:和ReLU_一样会修改原张量。
x.leaky_relu_(negative_slope=0.01)
print(x) # x的值被修改
Softmax
输出范围:(0, 1),且所有输出的和为1。
特点:常用于多分类任务的最后一层。
公式:
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.nn.functional.softmax(x, dim=0)
print(y) # 输出:tensor([0.0900, 0.2447, 0.6652])
Threshold
输出范围:手动设置的范围。
特点:小于阈值的数被置为设定值,大于等于阈值的数保持不变。
x = torch.tensor([-1.0, 0.0, 1.0, 2.0])
y = torch.nn.functional.threshold(x, threshold=0.5, value=0.0)
print(y) # 输出:tensor([0., 0., 0., 2.])
Normalize
功能:将张量的值标准化到指定范围。
公式:normalize(x) = x / max(||x||, eps)
x = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
y = torch.nn.functional.normalize(x, p=2, dim=1)
print(y) # 输出:标准化到单位向量