【AI课程领学】第三课3/5:深度学习基本结构——层、激活、损失、正则化、优化器与训练循环(含完整 PyTorch 训练骨架)

【AI课程领学】第三课3/5:深度学习基本结构——层、激活、损失、正则化、优化器与训练循环(含完整 PyTorch 训练骨架)



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可扫描博文下方二维码 “学术会议小灵通”或参考学术信息专栏:https://ais.cn/u/mmmiUz
详细免费的AI课程可在这里获取→www.lab4ai.cn


1. 为什么“基本结构”很关键?

无论你做 CNN、Transformer、U-Net、Diffusion,本质都逃不开一个统一骨架:

  • 数据 → 模型前向 → 损失 → 反向梯度 → 参数更新 → 验证与保存

理解这个骨架,你才能看懂任何深度学习论文与代码库。

2. 深度学习系统的 6 个组件

2.1 数据(Data)

  • 输入张量形状(batch, channels, height, width)或(batch, features)
  • 归一化/标准化是训练稳定性的关键之一

2.2 模型(Model)

由“层(Layer)”堆叠:

  • Linear / Conv / Attention
  • Norm(BatchNorm/LayerNorm)
  • Dropout
  • Residual connections

2.3 激活函数(Activation)

提供非线性,否则多层线性仍等价于一层线性。

常见:

  • ReLU:稳定、快
  • GELU:Transformer 常用
  • Sigmoid/Tanh:容易饱和导致梯度小(但在门控结构仍常见)

2.4 损失函数(Loss)

  • 回归:MSE、MAE、Huber
  • 分类:Cross Entropy
  • 分割:Dice、IoU Loss
  • 检测:Focal Loss 等

2.5 正则化(Regularization)

防止过拟合与提升泛化:

  • L2(weight decay)
  • Dropout
  • 数据增强
  • Early stopping

2.6 优化器(Optimizer)

  • SGD:经典,配合 momentum
  • Adam/AdamW:默认强基线
  • 学习率策略:cosine、step、warmup

3. 一个“可以复用到任何任务”的 PyTorch 训练骨架(建议你收藏当模板)

import torch
import torch.nn as nn
import torch.optim as optim

class Net(nn.Module):
    def __init__(self, in_dim, out_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(in_dim, 256),
            nn.ReLU(),
            nn.Dropout(0.2),
            nn.Linear(256, 256),
            nn.ReLU(),
            nn.Linear(256, out_dim)
        )
    def forward(self, x):
        return self.net(x)

def train_one_epoch(model, loader, optimizer, loss_fn, device):
    model.train()
    total_loss = 0.0
    for X, y in loader:
        X, y = X.to(device), y.to(device)
        pred = model(X)
        loss = loss_fn(pred, y)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_loss += loss.item() * X.size(0)
    return total_loss / len(loader.dataset)

@torch.no_grad()
def evaluate(model, loader, loss_fn, device):
    model.eval()
    total_loss = 0.0
    for X, y in loader:
        X, y = X.to(device), y.to(device)
        pred = model(X)
        loss = loss_fn(pred, y)
        total_loss += loss.item() * X.size(0)
    return total_loss / len(loader.dataset)

def fit(model, train_loader, val_loader, epochs=50, lr=1e-3, wd=1e-4):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = model.to(device)
    loss_fn = nn.MSELoss()
    optimizer = optim.AdamW(model.parameters(), lr=lr, weight_decay=wd)

    best_val = float("inf")
    for epoch in range(1, epochs+1):
        tr = train_one_epoch(model, train_loader, optimizer, loss_fn, device)
        va = evaluate(model, val_loader, loss_fn, device)

        if va < best_val:
            best_val = va
            torch.save(model.state_dict(), "best.pt")

        if epoch % 5 == 0:
            print(f"[{epoch:03d}] train={tr:.4f}  val={va:.4f}  best={best_val:.4f}")

    print("Saved best model to best.pt")

你之后做任何任务(回归/分类/分割)都只需要改:

  • 模型最后一层维度
  • loss_fn
  • evaluate 的指标

4. 基本结构与深度学习“训练稳定性”

训练稳定通常取决于:

  • 输入尺度是否合理(标准化)
  • 学习率是否合适
  • 是否使用 Norm(BN/LN)
  • 初始化是否合理(PyTorch 默认一般够用)
  • batch size 与优化器匹配

5. 小结

  • 结构的本质是:把“函数”写出来,并让它能被梯度驱动地优化。

下一篇我们专讲“前馈运算”,把 forward 的每一步都讲透。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐