在 PyTorch 中,nn.Module
是构建神经网络的基础类。所有的神经网络模块都应该继承自 nn.Module
类。nn.Module
提供了大量方便的方法和属性,使得定义和使用神经网络变得非常简单和直观。
关键特性和方法
__init__
方法:在这个方法中定义模型的层和其他组件。forward
方法:在这个方法中定义数据如何通过模型进行前向传播。parameters
和named_parameters
方法:用于访问模型的所有参数。children
和named_children
方法:用于访问模型的子模块。state_dict
和load_state_dict
方法:用于保存和加载模型参数。
基本使用示例
以下是一个简单的示例,展示如何使用 nn.Module
定义一个神经网络:
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(4, 3)
self.fc2 = nn.Linear(3, 2)
self.fc3 = nn.Linear(2, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# 实例化神经网络
model = SimpleNN()
# 打印模型结构
print(model)
输出示例
SimpleNN(
(fc1): Linear(in_features=4, out_features=3, bias=True)
(fc2): Linear(in_features=3, out_features=2, bias=True)
(fc3): Linear(in_features=2, out_features=1, bias=True)
)
训练模型示例
以下是一个完整的示例,包括定义模型、损失函数、优化器和训练过程:
# 生成一些随机数据
x = torch.randn(10, 4)
y = torch.randn(10, 1)
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
# 前向传播
outputs = model(x)
loss = criterion(outputs, y)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
保存和加载模型
你可以使用 state_dict
和 load_state_dict
方法来保存和加载模型的参数。
保存模型
torch.save(model.state_dict(), 'model.pth')
加载模型
model = SimpleNN()
model.load_state_dict(torch.load('model.pth'))
总结
nn.Module
是所有神经网络模块的基类,提供了大量方便的方法和属性。- 通过继承
nn.Module
,你可以定义自己的神经网络结构和前向传播逻辑。 parameters
、named_parameters
、state_dict
和load_state_dict
等方法可以帮助你访问和管理模型的参数。- PyTorch 提供了强大的功能来训练、保存和加载模型,使得构建和使用神经网络变得更加简单和高效。