核心要点

  • 继承 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 中写前向逻辑

标准回答

在 PyTorch 中创建并训练 神经网络 的标准步骤:

1. 定义模型:继承 nn.Module,在 init 中声明层,在 forward 中写前向逻辑。

python
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 → backwardstep

5. 验证model.eval() + torch.no_grad() 算验证指标。

6. 持久化torch.save(model.state_dict(), 'ckpt.pt')

也可用 nn.Sequential 快速堆叠简单层。复杂架构(残差、注意力)建议自定义 Module。详见 深度学习基础

常见误区

⚠️ 常见踩坑

验证时忘记 model.eval() 导致 Dropout/BatchNorm 行为错误;训练时未 zero_grad;把 DataLoader 当无限流不控制 epoch 数。

追问

追问 1nn.Module 和 nn.Sequential 怎么选?

nn.Sequential 是简单的层线性堆叠,前向就是按顺序依次调用,适合纯串联的结构、代码简洁;但它无法表达分支、跳跃连接、多输入输出或带条件的前向逻辑。需要残差连接、注意力、多分支等非线性拓扑时,应继承 nn.Module 自定义 forward。实践中常两者混用:用 Sequential 封装子块,再在 Module 里组合。

追问 2model.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 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具