1. torch.nn
torch.nn
是 PyTorch 深度学习框架中的一个核心模块,它为构建和训练神经网络提供了丰富的类库。
以下是 torch.nn
的关键组成部分及其功能:
-
nn.Module 类:
nn.Module
是所有自定义神经网络模型的基类。用户通常会从这个类派生自己的模型类,并在其中定义网络层结构(如卷积层、全连接层等)以及前向传播函数(forward pass):nn.Module
是所有自定义神经网络结构的基础类。当你需要创建一个深度学习模型时,通常会继承这个类,并在其中定义模型的层(Layer)结构以及前向传播(forward pass)逻辑。在子类中通过调用super().__init__()
初始化父类,并定义各种层作为实例变量,如卷积层(nn.Conv2d
)、全连接层(nn.Linear
)、激活函数等。必须实现forward(self, input)
方法,该方法描述了输入数据如何经过网络中的各个层并生成输出。 详细内容请见PyTorch的nn.Module类的详细介绍。 -
预定义层(Modules):
包括各种类型的层组件,例如:- 更多其他层,包括但不限于 LSTM、GRU、Dropout、BatchNorm、Embedding 等。
- 正则化层:如批量归一化
nn.BatchNorm1d
,nn.BatchNorm2d
等。 - 池化层:
nn.MaxPool1d
,nn.MaxPool2d
,nn.AvgPool2d
用于下采样特征图。 - 激活函数:如
nn.ReLU
,nn.Sigmoid
,nn.Tanh
等非线性激活层。 - 卷积层:
nn.Conv1d
,nn.Conv2d
,nn.Conv3d
分别用于一维、二维和三维数据的卷积操作,常应用于图像识别、语音处理等领域。 - 全连接层:
nn.Linear
用于实现线性变换,常见于多层感知机(MLP)中。
-
容器类:
nn.Sequential
:允许将多个层按顺序组合起来,形成简单的线性堆叠网络。nn.ModuleList
和nn.ModuleDict
:可以动态地存储和访问子模块,支持可变长度或命名的模块集合。
-
损失函数(Loss Functions):
torch.nn
包含了一系列用于衡量模型预测与真实标签之间差异的损失函数,例如:- 对数似然损失:
nn.NLLLoss
配合LogSoftmax层使用于分类任务。 - 均方误差损失:
nn.MSELoss
适用于回归任务。 - 交叉熵损失:
nn.CrossEntropyLoss
常用于分类任务。 - 更多针对特定任务定制的损失函数,如
nn.BCEWithLogitsLoss
用于二元分类任务。 - 这些函数用于计算模型预测结果与实际目标之间的差异,作为优化的目标。
- 对数似然损失:
-
实用函数接口(Functional Interface):
nn.functional
(通常简写为F
),包含了许多可以直接作用于张量上的函数,它们实现了与层对象相同的功能,但不具有参数保存和更新的能力。比如,可以使用F.relu()
直接进行 ReLU 操作,或者F.conv2d()
进行卷积操作。 -
初始化方法:
torch.nn.init
提供了一些常用的权重初始化策略,比如 Xavier 初始化 (nn.init.xavier_uniform_()
) 和 Kaiming 初始化 (nn.init.kaiming_uniform_()
), 这些对于成功训练神经网络至关重要。
通过 torch.nn
,开发者能够快速构建复杂的深度学习模型,并利用 PyTorch 动态计算图特性进行高效训练和推理。此外,该模块还与 torch.optim
配合,方便地进行权重优化;以及与 DataLoader
结合以组织和迭代训练数据。
2. torch.nn
的使用方法
使用方法通常包括以下步骤:
- 继承
nn.Module
类创建自定义模型,并在构造函数__init__()
中定义需要的层结构。 - 实现
forward(self, input)
方法,描述如何通过定义好的层计算输出。 - 创建模型实例并传入必要的参数进行初始化。
- 使用优化器 (
torch.optim
) 对模型的可学习参数进行优化,结合数据加载器 (torch.utils.data.DataLoader
) 加载数据集,并在一个循环中迭代执行前向传播、计算损失、反向传播和参数更新。
Python
1import torch
2import torch.nn as nn
3
4# 定义一个简单的全连接神经网络模型
5class SimpleNet(nn.Module):
6 def __init__(self, input_size, hidden_size, num_classes):
7 super(SimpleNet, self).__init__()
8 self.fc1 = nn.Linear(input_size, hidden_size)
9 self.relu = nn.ReLU()
10 self.fc2 = nn.Linear(hidden_size, num_classes)
11
12 def forward(self, x):
13 out = self.fc1(x)
14 out = self.relu(out)
15 out = self.fc2(out)
16 return out
17
18# 创建模型实例
19model = SimpleNet(input_size=784, hidden_size=128, num_classes=10)
20
21# 定义损失函数和优化器
22criterion = nn.CrossEntropyLoss()
23optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
24
25# 假设我们有一个数据批次
26inputs = torch.randn(64, 784) # 输入张量
27labels = torch.randint(0, 10, (64,)) # 标签张量
28
29# 正向传播计算预测结果
30outputs = model(inputs)
31
32# 计算损失
33loss = criterion(outputs, labels)
34
35# 反向传播和参数更新
36optimizer.zero_grad() # 清零梯度缓冲区
37loss.backward() # 反向传播求梯度
38optimizer.step() # 更新模型参数
以上是一个简单的例子展示了如何定义模型、损失函数和优化器,并进行一次训练迭代的过程。在实际应用中,还需要根据具体问题设计更复杂的网络结构和训练流程。