本项目灵感来源于 numpy-100 项目。在当前开源社区中,我们发现缺少一个类似于 numpy-100 的系统性学习 PyTorch 张量操作的学习路径,因此创建了这个项目,希望能填补这一空白。 这是一个为 PyTorch 初学者设计的循序渐进的训练题集,我们的目标是创建一个内容全面、知识点系统的练习集,从基础张量操作到实际应用预训练模型,提供完整的 PyTorch 入门学习体验。
本项目包含 100 道精心设计的核心练习题,按照难度和主题分为六大模块,形成从张量基础知识到实际模型应用的完整学习路径:
| 模块 | 主题 | 题目数量 | 难度 | 状态 |
|---|---|---|---|---|
| 一 | Tensor 的创建与属性 ✨ | 9 题 | ⭐ | 完成 |
| 二 | 索引、切片与形状变换 🔪 | 26 题 | ⭐⭐ | 完成 |
| 三 | 数学与逻辑运算 🧮 | 15 题 | ⭐⭐ | 完成 |
| 四 | 广播机制 📡 | 15 题 | ⭐⭐⭐ | 完成 |
| 五 | nn.Module 与基础层入门 🏗️ | 20 题 | ⭐⭐ | 未开始 |
| 六 | torchvision 与预训练模型应用 🖼️ | 15 题 | ⭐⭐⭐ | 未开始 |
目标: 掌握创建张量的各种方式,并了解其核心属性。
主要内容 (点击展开)
- 创建张量
- 从 Python 列表 / NumPy 数组创建:
tensor() - 创建常量张量:
zeros,ones,full,eye - 创建随机张量:
rand,randn,randint,normal - 创建序列张量:
arange,linspace,logspace
- 从 Python 列表 / NumPy 数组创建:
- 张量属性
- 获取核心属性:
shape,dtype,device,requires_grad - 类型转换:
to(),type() - 仿照其他张量创建:
zeros_like,ones_like,full_like等
- 获取核心属性:
- 设备管理
- CPU/GPU 切换:
to('cuda'),to('cpu') - 检查可用设备:
torch.cuda.is_available()
- CPU/GPU 切换:
目标: 学习如何灵活地访问、重塑、组合和拆分张量,这是数据处理的核心。
主要内容 (点击展开)
- 索引与切片
- 基础索引与切片:
[] - 布尔索引:
[True or False] - 高级索引:
index_select,gather
- 基础索引与切片:
- 形状操作
- 改变形状:
view,reshape - 交换维度:
permute,transpose - 维度操作:
unsqueeze,squeeze - 扩展与复制:
expand,repeat
- 改变形状:
- 组合与拆分
- 拼接:
cat,stack - 分割:
split,chunk - 条件选择与填充:
where,scatter_,index_put_,masked_fill_
- 拼接:
- 内存布局
- 连续性:
contiguous
- 连续性:
- 高级应用
- 对角线提取:
diagonal - 序列翻转:
flip - 网格生成:
meshgrid
- 对角线提取:
目标: 掌握张量的数值计算,这是构建神经网络前向传播的基础。
主要内容 (点击展开)
- 基础运算
- 逐元素运算:加、减、乘、除、幂等
- 矩阵运算:矩阵乘法 (
matmul或@)
- 聚合操作
- 求和:
sum - 均值:
mean - 最大/最小值:
max,min - 标准差:
std - 结合
dim和keepdim参数
- 求和:
- 逻辑与比较
- 比较运算符:
>,<,== - 逻辑函数:
all,any
- 比较运算符:
目标: 深入理解当两个形状不同的张量进行运算时,PyTorch 如何自动扩展维度来匹配形状。
主要内容 (点击展开)
- 广播基础
- 广播规则与原理解析
- 矩阵与向量、矩阵与标量的运算
- 不同维度张量间的自动扩展
- 广播应用
- 批量数据处理中的广播技巧
- 使用广播加速计算并节省内存
- 常见广播陷阱与解决方案
- 高级应用
- 在神经网络中的实际应用(如注意力机制)
- 结合其他操作(如
unsqueeze)实现复杂广播 - 广播与并行计算的关系
目标: 将底层的 Tensor 操作与 torch.nn 中封装好的高级模块联系起来,为构建网络打下基础。
主要内容 (点击展开)
- 基础层
- 全连接层:
nn.Linear- 实现线性变换 - 激活函数层:
nn.ReLU,nn.Sigmoid,nn.Tanh,nn.LeakyReLU,nn.GELU等 - 卷积层:
nn.Conv1d,nn.Conv2d,nn.Conv3d- 不同维度的卷积操作 - 池化层:
nn.MaxPool2d,nn.AvgPool2d- 降采样操作 - 归一化层:
nn.BatchNorm2d,nn.LayerNorm- 稳定训练 - Dropout 层:
nn.Dropout- 防止过拟合
- 全连接层:
- 模块构建
- 创建自定义模块:继承
nn.Module - 实现
__init__和forward方法 - 模块嵌套与复用
- 使用
nn.Sequential构建简单网络
- 创建自定义模块:继承
- 参数管理
- 查看模块参数:
.parameters(),.named_parameters() - 参数初始化:
nn.init系列函数 - 参数共享与冻结
- 保存与加载模型参数:
torch.save,torch.load
- 查看模块参数:
- 函数式 API
- 使用
F模块中的函数版本 - 模块与函数的对应关系
- 使用
- 实用技巧
- 模型结构可视化
- 参数量计算
- 模型调试与检查
- 处理不同设备上的模型
目标: 学习如何利用 torchvision 库加载预训练模型,处理图像数据,并进行高效推理,应用前面所学的张量知识到实际场景。
主要内容 (点击展开)
- 预训练模型使用
- 加载经典模型:ResNet, VGG, EfficientNet, YOLO
- 模型权重管理:
torch.hub和torchvision.models - 模型结构探索与修改
- 高效推理:使用
torch.inference_mode()和torch.no_grad()
- 图像处理与变换
- 图像加载与预处理:
torchvision.io和transforms - 数据增强技术:裁剪、翻转、颜色变换
- 批量处理与归一化
- 自定义转换流程
- 图像加载与预处理:
- 视觉任务实践
- 图像分类:使用 ImageNet 预训练模型
- 目标检测:使用 COCO 预训练模型
- 图像分割:使用预训练分割模型
- 特征提取与迁移学习
- 结果评估与可视化
- 推理结果处理与后处理
- 性能评估指标:准确率、IoU 等
想要更多实战挑战?请访问我的另一个项目 PyTorch 模型手写实现集合,其中包含了多个经典深度学习模型的完整实现,包括但不限于:
- ResNet
- VGG
- Transformer
- CLIP
- 等更多高级模型
这些实现将帮助你将基础知识应用到实际模型构建中,进一步提升你的 PyTorch 技能。
要运行本项目中的练习,您需要配置以下环境:
# 使用pip安装依赖
pip install torch torchvision torchaudio matplotlib jupyter
# 或使用conda
conda create -n pytorch-tensor-100 python=3.10
conda activate pytorch-tensor-100
conda install pytorch torchvision torchaudio matplotlib jupyter -c pytorch推荐的 Python 版本: 3.10+
您可以通过运行以下代码验证环境是否正确配置:
import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA是否可用: {torch.cuda.is_available()}")- 模块一:完成 9/9 题
- 模块二:完成 26/26 题
- 模块三:完成 15/15 题
- 模块四:完成 15/15 题
- 模块五:未开始
- 模块六:未开始
- 每个练习都尝试自己实现,然后对比参考答案
- 理解每个操作背后的原理,而不只是记住 API
- 尝试将多个操作组合起来解决更复杂的问题
- 使用 PyTorch 官方文档作为补充学习资源
我们非常欢迎并感谢您对本项目做出贡献,无论贡献大小!
- 提交 Issue: 发现错误、有改进建议或新的练习想法? 提交 Issue 告诉我们!
- 提交 Pull Request: 直接修复错误或添加新功能:
- Fork 本仓库
- 创建您的特性分支 (
git checkout -b feature/AmazingFeature) - 提交您的更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
- 确保新练习符合项目整体风格和结构
- 添加适当的注释,使代码易于理解
- 尽可能添加多样、全面的解答
如果您觉得这个项目对您有所帮助,请给它一个 ⭐️ 以示支持,这对维护者意义重大!
