torch.nn
模块
torch.nn
是 PyTorch 中最重要的模块之一,专门用于构建和训练神经网络。它包含了大量用于神经网络模型构建、训练、优化等的模块和函数。torch.nn
提供了对神经网络的 抽象,包括 层(Layer)、损失函数(Loss Function)、优化器(Optimizer) 等,帮助用户更加方便地定义和训练深度学习模型。
1. torch.nn
模块主要功能
1.1 神经网络层(Layers)
torch.nn
提供了多种类型的神经网络层,用户可以通过它们来构建网络。常见的层有:
-
全连接层:
torch.nn.Linear
用于定义一个全连接层,即输入和输出之间是线性关系。linear_layer = torch.nn.Linear(in_features=10, out_features=5)
-
卷积层:
torch.nn.Conv2d
,torch.nn.Conv1d
,torch.nn.Conv3d
用于卷积操作,广泛应用于卷积神经网络(CNN)。conv_layer = torch.nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
-
池化层:
torch.nn.MaxPool2d
,torch.nn.AvgPool2d
用于池化操作,常用于 CNN 网络中,帮助降低特征图的尺寸。max_pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)
-
循环层:
torch.nn.RNN
,torch.nn.LSTM
,torch.nn.GRU
用于构建循环神经网络(RNN),LSTM 和 GRU 是特殊的 RNN 单元。rnn_layer = torch.nn.RNN(input_size=10, hidden_size=20, num_layers=2)
-
自注意力层(Transformer):
torch.nn.Transformer
用于构建 Transformer 网络,广泛应用于自然语言处理任务。transformer_layer = torch.nn.Transformer(d_model=512, nhead=8, num_encoder_layers=6)
-
批归一化层:
torch.nn.BatchNorm1d
,torch.nn.BatchNorm2d
用于批归一化操作,常用于提高深度神经网络的训练速度和稳定性。batch_norm = torch.nn.BatchNorm2d(num_features=16)
-
激活函数层:
torch.nn.ReLU
,torch.nn.Sigmoid
,torch.nn.Tanh
提供了常见的激活函数层。relu = torch.nn.ReLU()
-
Dropout层:
torch.nn.Dropout
用于Dropout正则化技术,防止过拟合。dropout = torch.nn.Dropout(p=0.5)
1.2 损失函数(Loss Functions)
torch.nn
还提供了常见的损失函数,供用户在模型训练时进行优化目标的定义。
-
交叉熵损失:
torch.nn.CrossEntropyLoss
loss_fn = torch.nn.CrossEntropyLoss() loss = loss_fn(predictions, labels)
-
均方误差损失:
torch.nn.MSELoss
loss_fn = torch.nn.MSELoss() loss = loss_fn(predictions, labels)
-
负对数似然损失:
torch.nn.NLLLoss
loss_fn = torch.nn.NLLLoss() loss = loss_fn(predictions, labels)
-
二元交叉熵损失:
torch.nn.BCEWithLogitsLoss
loss_fn = torch.nn.BCEWithLogitsLoss() loss = loss_fn(predictions, labels)
1.3 优化器(Optimizers)
torch.optim
模块提供了多种优化算法,如 SGD、Adam、RMSprop 等。
-
SGD(随机梯度下降):
torch.optim.SGD
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
-
Adam优化器:
torch.optim.Adam
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
-
RMSprop优化器:
torch.optim.RMSprop
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
2. torch.nn.Module
类
在 torch.nn
中,构建神经网络模型时,我们通常会继承 torch.nn.Module
类并实现其 forward
方法。torch.nn.Module
是 PyTorch 中所有神经网络模块的基类,提供了模型的基础功能,如参数的管理、网络前向传播等。
2.1 定义一个简单的神经网络
例如,定义一个简单的全连接神经网络:
import torch
import torch.nn as nn
import torch.optim as optim
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
# 定义网络层
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
# 前向传播
x = x.view(-1, 28*28) # 扁平化输入
x = torch.relu(self.fc1(x)) # 激活函数
x = self.fc2(x)
return x
# 创建模型实例
model = SimpleNN()
# 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 模拟训练过程
inputs = torch.randn(32, 28, 28) # 模拟输入 (batch_size, height, width)
labels = torch.randint(0, 10, (32,)) # 模拟标签
# 前向传播
outputs = model(inputs)
# 计算损失
loss = loss_fn(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Loss: {loss.item()}')
在上面的代码中:
SimpleNN
是一个继承自torch.nn.Module
的神经网络类。- 在
__init__
方法中定义了模型的层(如nn.Linear
层)。 forward
方法定义了数据流动的路径,即输入通过层进行变换。- 训练时,我们通过
optimizer.step()
来更新模型的参数。
3. 模块与参数管理
torch.nn.Module
还提供了一些有用的方法来管理模型的参数:
parameters()
:返回模型的所有参数。named_parameters()
:返回带有名称的模型参数。modules()
:返回模型中的所有子模块。named_modules()
:返回带有名称的模型子模块。
例如:
for name, param in model.named_parameters():
print(f"Parameter: {name}, Shape: {param.shape}")
4. 总结
torch.nn
是构建神经网络的核心模块,提供了各种层、损失函数、优化器和其他构建神经网络所需的工具。torch.nn.Module
是构建自定义模型的基类,定义了模型的前向传播和其他重要功能。- 通过
torch.nn
提供的功能,用户可以高效地构建和训练深度学习模型。