把容易散落在不同笔记里的 PyTorch 常用工具收成一篇:nn.Module、nn.functional、optim、初始化与常见工程辅助接口。
这一篇主要整理自
pytorch_learning/pytorch_6.py到pytorch_learning/pytorch_10.py,以及liuer_pytorch/9.ipynb里那部分对 PyTorch 包结构的速查总结。这些内容单看都不难,但最容易散,放到一起反而更适合复习。
1. nn.Module 是网络的基本壳
PyTorch 里最核心的对象,就是继承 nn.Module 的网络。
Python3
点击展开代码
展开代码
这里的经验可以记成一句:
- 只要一个结构里有可学习参数,它大概率就应该放进
nn.Module
这样:
- 参数会被自动注册
model.parameters()才能收集到它们- 优化器才能更新它们
2. nn 和 nn.functional 的区别
我之前很容易把这两个混着用。现在更清楚的理解是:
nn.*:偏对象化,适合有参数或有状态的层nn.functional.*:偏无状态纯函数,适合直接在forward()里调用
比如:
nn.Linear、nn.Conv2d用nnF.relu、F.max_pool2d这种更适合用functional
pytorch_9.py 里也有个很直观的小例子:
Python3
点击展开代码
展开代码
本质是一样的,只是组织代码的方式不同。
3. 优化器:不是只有 SGD
在最开始的练习里,我几乎总是用:
Python3
代码示例
但到了 pytorch_8.py,有两个很实用的工程技巧:
技巧一:不同层用不同学习率
Python3
点击展开代码
展开代码
这个在迁移学习和微调时非常常见。
技巧二:动态调整学习率
虽然这里的代码只是做演示,但背后的工程直觉很重要:
学习率不是"一次写死到训练结束",而是常常需要按阶段调。
4. 参数初始化
大多数时候,nn.Module 已经带了合理默认初始化。
但 pytorch_9.py 也提醒我,初始化并不是完全不用管。
比如:
Python3
点击展开代码
展开代码
Xavier 初始化背后的目标,是让信号在网络中传播得更稳定,不容易一开始就炸掉或塌掉。
5. 其他容易散的小工具
pytorch_10.py 虽然比较像提纲,但它点出了真正做项目时经常绕不过去的方向:
- 自定义
Dataset torchvision- 可视化工具
- GPU 加速
- 模型保存与加载
这些内容暂时还没有被我完全展开成独立文章,但它们其实构成了 PyTorch 从"写模型"到"做工程"的入口。
6. 把 PyTorch 的包结构记成一个简单地图
我后来比较喜欢的记法是:
torch.*:张量和基础运算torch.nn.*:网络层、损失函数、模块torch.nn.functional.*:无状态操作torch.optim.*:参数更新
这样至少不会在代码里每次都把几个包的职责混掉。
7. 这一阶段该记住什么
如果把这篇压缩成最少几句话,我会记:
nn.Module是网络的组织方式,不只是一个语法壳。- 有参数的层优先用
nn.*,无状态操作常用F.*。 - 优化器不是黑盒配置项,而是训练策略的一部分。
- 初始化、学习率、数据集接口这些"边角 API",其实很影响真实训练体验。
这篇看起来像杂项,但真正写 PyTorch 项目时,它往往是最常用的一层。
专题阅读
Pytorch
这篇文章属于同一条阅读链。你可以直接在这里切换,不用再回到列表页重新找。
部分信息可能已经过时
留言区
留言
欢迎纠错、补充、交流。昵称和评论内容必填;如果你愿意,也可以留下联系方式,仅站主可见。