核心要点
继承 nn.Module,在 init 里声明层、在 forward 里写前向逻辑,参数会被自动注册
用 Dataset + DataLoader 组织数据(batch、shuffle、num_workers),再选定 loss 与 optimizer
能完整写出训练循环:zero_grad → forward → loss → backward → step,并配验证循环
知道训练用 model.train()、验证用 model.eval()+torch.no_grad(),且模型与数据要 .to(device) 放同一设备
标准回答
在 PyTorch 中创建并训练 神经网络 的标准步骤:
1. 定义模型:继承 nn.Module,在 init 中声明层,在 forward 中写前向逻辑。
class Net(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(784, 10)
def forward(self, x):
return self.fc(x.view(x.size(0), -1))
model = Net().to(device)2. 数据管道:Dataset + DataLoader(batch、shuffle、num_workers)。
3. 损失与优化器:criterion = nn.CrossEntropyLoss();optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)。
4. 训练循环:model.train() → 遍历 batch → zero_grad → forward → loss → backward → step。
5. 验证:model.eval() + torch.no_grad() 算验证指标。
6. 持久化:torch.save(model.state_dict(), 'ckpt.pt')。
也可用 nn.Sequential 快速堆叠简单层。复杂架构(残差、注意力)建议自定义 Module。详见 深度学习基础。
追问
追问 1:nn.Module 和 nn.Sequential 怎么选?
nn.Sequential 是简单的层线性堆叠,前向就是按顺序依次调用,适合纯串联的结构、代码简洁;但它无法表达分支、跳跃连接、多输入输出或带条件的前向逻辑。需要残差连接、注意力、多分支等非线性拓扑时,应继承 nn.Module 自定义 forward。实践中常两者混用:用 Sequential 封装子块,再在 Module 里组合。
追问 2:model.to(device) 要注意什么?
要点:模型和输入数据必须在同一设备,否则报 device mismatch;optimizer 应在 model.to(device) 之后再创建(让它引用 GPU 上的参数);.to(device) 对模型是原地迁移参数,但对张量返回新张量、需重新赋值(x = x.to(device));从 checkpoint 加载时注意 map_location,避免在无 GPU 机器上加载 GPU 张量报错。
追问 3:如何实现早停(Early Stopping)?
监控验证 loss,若连续 N epoch 无改善则停止并恢复最佳 checkpoint。可用回调或手写逻辑,避免在验证集上过拟合超参。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📖 术语表
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出
- Tensorflow
全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具