12 从零到上手系统学习 PyTorch

12 从零到上手系统学习 PyTorch

1. 激活函数

激活函数是神经网络中用于引入非线性变换的重要组成部分。通过激活函数,神经网络能够学习到复杂的函数映射。

1.1 常见的激活函数

1.1.1 Sigmoid 函数

Sigmoid 函数是最早使用的激活函数之一,其公式为:

$$
\sigma(x) = \frac{1}{1 + e^{-x}}
$$

  • 特性

    • 输出范围为 (0, 1)。
    • 适合于二分类任务的输出层。
  • 缺点

    • 梯度消失问题。
1
2
3
4
5
6
7
import torch
import torch.nn as nn

sigmoid = nn.Sigmoid()
input_tensor = torch.tensor([-1.0, 0.0, 1.0])
output = sigmoid(input_tensor)
print(output) # 输出: tensor([0.2689, 0.5000, 0.7311])

1.1.2 ReLU 函数

ReLU(Rectified Linear Unit)是目前使用最广泛的激活函数,其公式为:

$$
f(x) = \max(0, x)
$$

  • 特性

    • 非常简单,计算效率高。
    • 在正区间梯度恒为 1。
  • 缺点

    • 死亡的 ReLU 的问题:当输入为负时,输出恒为 0。
1
2
3
4
relu = nn.ReLU()
input_tensor = torch.tensor([-1.0, 0.0, 1.0])
output = relu(input_tensor)
print(output) # 输出: tensor([0., 0., 1.])

1.1.3 Tanh 函数

Tanh (双曲正切)是另一种常用的激活函数,其公式为:

$$
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
$$

  • 特性

    • 输出范围为 (-1, 1)。
    • Sigmoid 函数更优,输出均值为 0。
  • 缺点

    • 仍然存在梯度消失问题。
1
2
3
4
tanh = nn.Tanh()
input_tensor = torch.tensor([-1.0, 0.0, 1.0])
output = tanh(input_tensor)
print(output) # 输出: tensor([-0.7616, 0.0000, 0.7616])

1.2 自定义激活函数

在某些情况下,我们可能希望使用自定义的激活函数。可以通过继承 nn.Module 来实现。

1
2
3
4
5
6
7
8
class CustomActivation(nn.Module):
def forward(self, input):
return input * torch.sigmoid(input) # 自定义激活

custom_activation = CustomActivation()
input_tensor = torch.tensor([-1.0, 0.0, 1.0])
output = custom_activation(input_tensor)
print(output) # 输出: tensor([-0.2689, 0.0000, 0.7311])

2. 损失函数

损失函数用于衡量模型的输出与真实标签之间的差距。通过最小化损失函数,我们可以优化模型的权重。

2.1 常见的损失函数

2.1.1 交叉熵损失

对于分类问题,CrossEntropyLoss 函数通常用于衡量分类的准确性。其公式为:

$$
L = -\sum_{i=1}^{C} y_i \log(p_i)
$$

  • C 为类别数,y 为真实标签,p 为模型预测。
1
2
3
4
5
6
criterion = nn.CrossEntropyLoss()
# 模拟输出和真实标签
output = torch.tensor([[1.0, 2.0, 0.0]]) # 未归一化的logits
target = torch.tensor([1]) # 真实标签
loss = criterion(output, target)
print(loss.item()) # 输出: 0.5500 (示例值)

2.1.2 均方误差损失

对于回归问题,常用 MSELoss (均方误差损失)来衡量模型输出与真实值之间的差距,其公式为:

$$
L = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y_i})^2
$$

1
2
3
4
5
6
criterion = nn.MSELoss()
# 模拟真实值和预测值
target = torch.tensor([1.0, 2.0, 3.0])
output = torch.tensor([1.5, 2.5, 3.5])
loss = criterion(output, target)
print(loss.item()) # 输出: 0.3333(示例值)

2.2 自定义损失函数

可以通过继承 nn.Module 来创建自定义损失函数。

1
2
3
4
5
6
7
8
9
class CustomLoss(nn.Module):
def forward(self, output, target):
return torch.mean((output - target) ** 2) + 0.1 * torch.mean(output) # 自定义损失

custom_loss = CustomLoss()
target = torch.tensor([1.0, 2.0, 3.0])
output = torch.tensor([1.5, 2.5, 3.5])
loss = custom_loss(output, target)
print(loss.item()) # 输出: 自定义损失的值

结论

在这部分内容中,我们详细介绍了 激活函数损失函数 的重要性及常见类型,并展示了如何在 PyTorch 中使用和自定义这些函数。通过对这些概念的掌握,我们可以更好地设计和训练神经网络模型。

12 从零到上手系统学习 PyTorch

https://zglg.work/pytorch-tutorial/12/

作者

AI教程网

发布于

2024-08-07

更新于

2024-08-10

许可协议