🛠️ 第27集:从零实现(18:44)每个函数都手写
# softmax:先减最大值防爆,再归一化
def softmax(X):
X_exp = torch.exp(X - X.max(axis=1, keepdim=True).values)
return X_exp / X_exp.sum(axis=1, keepdim=True)
# 交叉熵:gather 取真实类概率,取负 log
def cross_entropy(y_hat, y):
return -torch.log(y_hat[range(len(y_hat)), y])
# 准确率:argmax 与标签比对
def accuracy(y_hat, y):
return (y_hat.argmax(axis=1) == y).float().mean().item()
📐 模型展平
28×28 图片 reshape 成 784 维向量,W 是 784×10 矩阵
🧮 手写评估器
Accumulator 类累加"正确数/样本数",算训练/测试精度
🔁 训练循环
前向→损失→backward→SGD→清零,10个epoch ≈ 84% 准确率
⚡ 第28集:简洁实现(04:10)框架一行顶手写十行
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
loss = nn.CrossEntropyLoss() # softmax+交叉熵 合体 ⚠️
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
| 组件 | 27集手写 | 28集 API |
| 模型 | X@W+b 手动矩阵乘 | nn.Linear(784,10) |
| 激活归一 | 手写 softmax | 藏在 CrossEntropyLoss 里 ⭐ |
| 损失 | gather + log | nn.CrossEntropyLoss() |
| 代码量 | ▊▊▊▊▊ 约100行 | ▏ 约10行 |