Python AI 与深度学习:每周任务拆分及代码练手
Python AI与深度学习(方向5):每周每日任务拆分+代码练手+环境配置+MNIST入门代码
以下内容完全适配Python基础已掌握的学习者,按「数学补全→PyTorch基础→核心实战」循序渐进,每日1.5-2小时,任务量化、代码可直接运行,配套练手题目和验证标准,确保学完即会用。
一、PyTorch深度学习环境一键配置(Windows/macOS/Linux通用)
方式1:Anaconda配置(推荐,环境隔离不冲突)
-
下载Anaconda:官网地址(选对应系统版本,Python3.9+),默认安装即可
-
打开Anaconda Prompt(Windows)/终端(macOS/Linux),执行以下命令:
# 1. 创建专属深度学习环境(命名dl-pytorch,Python3.10)
conda create -n dl-pytorch python=3.10 -y
# 2. 激活环境(每次使用前必须执行)
conda activate dl-pytorch
# 3. 安装PyTorch(CPU版本,入门足够,无需显卡)
# Windows/macOS/Linux CPU通用
conda install pytorch torchvision torchaudio cpuonly -c pytorch -y
# 4. 安装必备配套库(数据处理/可视化/实战)
pip install numpy pandas matplotlib scikit-learn gradio opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
方式2:原生Python+pip配置
# 直接安装,建议在虚拟环境中执行
pip install torch torchvision torchaudio numpy pandas matplotlib scikit-learn gradio opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
环境验证(必做)
执行以下代码,无报错且输出PyTorch版本即配置成功:
import torch
import torchvision
# 输出PyTorch版本和是否支持CPU(入门只需CPU)
print("PyTorch版本:", torch.__version__)
print("CPU可用:", torch.cuda.is_available() == False) # 输出True即正常
二、完整学习任务拆分(共14周,每日1.5-2小时)
阶段1:数学前置补全(第1-2周,够用即止,不啃公式)
核心:用代码实现数学概念,拒绝纯理论背诵,重点为后续反向传播、梯度下降打基础
第1周:线性代数+NumPy代码实现
| 天数 | 核心任务 | 代码练手题目 | 验证标准 |
|---|---|---|---|
| 1 | 向量/矩阵定义、索引、形状变换(torch.Tensor基础) | 1. 用NumPy创建3行2列矩阵 2. 将向量从(5,)变形为(5,1) 3. 提取矩阵第2行所有元素 |
独立写出代码,输出结果正确 |
| 2 | 矩阵运算(加减、点乘、矩阵乘法、转置) | 1. 两个2x2矩阵相乘 2. 矩阵转置后与原矩阵点乘 |
理解@(矩阵乘法)和*(元素乘)的区别 |
| 3 | 张量基础(PyTorch Tensor与NumPy数组互转) | 1. NumPy数组转Tensor 2. Tensor求均值、求和、按维度求和 |
掌握.numpy()/.from_numpy()方法 |
| 4 | 特征值/特征向量基础(应用层面理解) | 用np.linalg.eig求2x2矩阵的特征值和特征向量 | 能看懂输出结果,无需推导 |
| 5-7 | 本周内容复盘+综合练习 | 实现「矩阵批量运算封装」:写一个函数,输入任意两个矩阵,输出其和、积、转置 | 函数能处理维度匹配的矩阵,有基础异常提示 |
第2周:概率论+微积分+梯度基础
| 天数 | 核心任务 | 代码练手题目 | 验证标准 |
|---|---|---|---|
| 1 | 期望、方差、正态分布(np.random) | 1. 生成1000个符合正态分布的随机数 2. 计算其期望和方差 |
理解np.mean()/np.var()的底层逻辑 |
| 2 | 交叉熵、极大似然估计(应用层面) | 手动计算2个样本的交叉熵(二分类) | 能看懂交叉熵损失的意义(衡量预测与真实值差距) |
| 3 | 导数/偏导基础、链式法则(直观理解) | 用数值法求函数y=x²+2x+1在x=2处的导数 | 无需公式推导,能理解「梯度是变化率」 |
| 4 | 梯度下降直观实现(一维函数) | 实现简单梯度下降:求y=x²的最小值点 | 代码能迭代收敛到x=0附近 |
| 5-7 | 本周内容复盘+数学+PyTorch衔接 | 用PyTorch Tensor实现「简单梯度求解」(用torch.autograd) | 理解自动求导的基本逻辑,为后续铺垫 |
阶段2:深度学习核心理论(第3周,2周压缩为1周,结合代码理解)
核心:概念+代码结合,拒绝死记硬背,每个概念都配极简代码演示
| 天数 | 核心任务 | 代码练手题目 | 验证标准 |
|---|---|---|---|
| 1 | 感知机模型+激活函数(Sigmoid/ReLU) | 1. 实现简单感知机(输入2个特征,输出1个结果) 2. 绘制Sigmoid/ReLU函数图像 |
理解激活函数的作用:引入非线性 |
| 2 | 损失函数(MSE/交叉熵)+ 前向传播 | 1. 实现MSE损失函数(手动+调用torch.nn.MSELoss) 2. 简单网络的前向传播计算 |
能区分回归用MSE、分类用交叉熵 |
| 3 | 反向传播原理+梯度下降(SGD/Adam) | 手动推导简单网络的反向传播(2层感知机) | 理解「梯度下降是反向传播的目的」 |
| 4 | 过拟合与正则化(L1/L2/早停) | 绘制「过拟合/欠拟合」的简单图像 | 知道正则化的作用:防止模型学太细 |
| 5-7 | 理论复盘+核心概念默写 | 整理「深度学习核心概念思维导图」,包含:感知机→激活函数→前向/反向传播→优化器→正则化 | 能清晰梳理概念之间的逻辑关系 |
阶段3:PyTorch核心实战(第4-14周,重点核心,MNIST入门+CV/NLP专项)
第4-5周:PyTorch基础(Tensor+Autograd+Dataset,MNIST入门核心)
第4周:PyTorch核心基础(每日任务)
| 天数 | 核心任务 | 代码练手题目 | 验证标准 |
|---|---|---|---|
| 1 | Tensor高级操作(拼接、分割、索引、广播) | 1. 拼接两个3x2的Tensor 2. 将一个6x2的Tensor分割为3个2x2的Tensor |
掌握torch.cat()/torch.split()方法 |
| 2 | 自动求导(Autograd)核心:requires_grad/backward() | 1. 求函数y=(x+2)²在x=3处的梯度 2. 多变量函数的梯度求解(z=x²+y²) |
能独立写出自动求导代码,梯度结果正确 |
| 3 | 优化器基础(torch.optim):SGD/Adam | 用Adam优化器求解y=x²+5x的最小值点 | 理解优化器的作用:更新参数 |
| 4 | 数据集加载(Dataset/DataLoader) | 自定义简单数据集(包含100个样本,特征+标签) | 能通过DataLoader批量加载数据 |
| 5-7 | 数据预处理(归一化/标准化/随机裁剪) | 用torchvision.transforms实现「图像归一化+随机翻转」 | 掌握Transforms的组合使用(Compose) |
第5周:MNIST手写数字识别(入门第一个完整项目,可直接运行)
✅ 核心代码:MNIST手写数字识别(PyTorch CPU版,直接复制运行)
# 导入所有需要的库
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
# -------------------------- 1. 配置超参数和设备 --------------------------
batch_size = 64 # 每次加载64个样本
epochs = 5 # 整个数据集训练5遍
lr = 0.001 # 学习率
# 设备配置:优先CPU(入门)
device = torch.device("cpu")
# -------------------------- 2. 数据预处理和加载MNIST数据集 --------------------------
# 数据预处理:将图像转为Tensor+归一化(0-1之间)
transform = transforms.Compose([
transforms.ToTensor(), # 转为Tensor,形状从(28,28)→(1,28,28),值从0-255→0-1
transforms.Normalize((0.1307,), (0.3081,)) # MNIST数据集的均值和标准差,固定值
])
# 加载训练集和测试集(自动下载,无需手动找数据)
train_dataset = datasets.MNIST(
root='./data', # 数据保存路径
train=True, # 训练集
download=True, # 自动下载
transform=transform
)
test_dataset = datasets.MNIST(
root='./data',
train=False, # 测试集
download=True,
transform=transform
)
# 用DataLoader批量加载数据,打乱顺序
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# -------------------------- 3. 定义简单的卷积神经网络(CNN) --------------------------
class MNIST_CNN(nn.Module):
def __init__(self):
super(MNIST_CNN, self).__init__()
# 卷积层:输入1通道(灰度图),输出16通道,卷积核3x3,步长1,填充1
self.conv1 = nn.Conv2d(1, 16, 3, 1, 1)
self.relu = nn.ReLU() # 激活函数
self.pool = nn.MaxPool2d(2, 2) # 池化层:2x2,步长2,缩小图像尺寸
# 卷积层:输入16通道,输出32通道
self.conv2 = nn.Conv2d(16, 32, 3, 1, 1)
# 全连接层:将特征展平后,映射到10个输出(0-9数字)
self.fc1 = nn.Linear(32 * 7 * 7, 10) # 28→池化2次→7,32*7*7是展平后的特征数
def forward(self, x):
# 前向传播:卷积→激活→池化→卷积→激活→池化→展平→全连接
x = self.pool(self.relu(self.conv1(x)))
x = self.pool(self.relu(self.conv2(x)))
x = x.view(-1, 32 * 7 * 7) # 展平:(batch_size, 32,7,7)→(batch_size, 32*7*7)
x = self.fc1(x)
return x
# 实例化模型,移到指定设备
model = MNIST_CNN().to(device)
# -------------------------- 4. 定义损失函数和优化器 --------------------------
criterion = nn.CrossEntropyLoss() # 交叉熵损失,适合分类任务
optimizer = optim.Adam(model.parameters(), lr=lr) # Adam优化器,比SGD更快收敛
# -------------------------- 5. 模型训练 --------------------------
print("开始训练MNIST模型...")
model.train() # 模型进入训练模式
for epoch in range(epochs):
running_loss = 0.0
for i, (images, labels) in enumerate(train_loader):
# 将数据移到指定设备
images, labels = images.to(device), labels.to(device)
# 1. 清空梯度(必须步骤,否则梯度累加)
optimizer.zero_grad()
# 2. 前向传播:输入图像,得到预测结果
outputs = model(images)
# 3. 计算损失:预测结果与真实标签的差距
loss = criterion(outputs, labels)
# 4. 反向传播:计算梯度
loss.backward()
# 5. 优化器更新参数
optimizer.step()
# 累计损失
running_loss += loss.item()
# 打印每个epoch的平均损失
avg_loss = running_loss / len(train_loader)
print(f"第{epoch+1}/{epochs}轮训练,平均损失:{avg_loss:.4f}")
print("训练完成!")
# -------------------------- 6. 模型测试(评估准确率) --------------------------
print("开始测试模型...")
model.eval() # 模型进入测试模式,关闭Dropout/BN等
correct = 0
total = 0
# 测试时不需要计算梯度,节省内存
with torch.no_grad():
for images, labels in test_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
# 取预测概率最大的类别作为预测结果
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
# 打印测试准确率
accuracy = 100 * correct / total
print(f"MNIST测试集准确率:{accuracy:.2f}%") # 正常训练后准确率≥98%
# -------------------------- 7. 可视化预测结果(可选) --------------------------
# 取测试集中的前5张图像,展示预测结果
images, labels = next(iter(test_loader))
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs, 1)
# 绘制图像
plt.figure(figsize=(10, 5))
for i in range(5):
plt.subplot(1, 5, i+1)
plt.imshow(images[i].squeeze().numpy(), cmap='gray') # 去掉通道维度,显示灰度图
plt.title(f"真实:{labels[i].item()}\n预测:{predicted[i].item()}")
plt.axis('off')
plt.show()
# -------------------------- 8. 保存模型(后续可直接加载使用) --------------------------
torch.save(model.state_dict(), './mnist_cnn_model.pth')
print("模型已保存为:mnist_cnn_model.pth")
# -------------------------- 加载模型(后续使用) --------------------------
# new_model = MNIST_CNN().to(device)
# new_model.load_state_dict(torch.load('./mnist_cnn_model.pth'))
# new_model.eval() # 加载后必须进入测试模式
第5周每日任务(围绕MNIST项目,拆解学习,确保吃透)
| 天数 | 核心任务 | 练手要求 | 验证标准 |
|---|---|---|---|
| 1 | 理解MNIST数据集结构+数据加载流程 | 1. 查看训练集/测试集的样本数 2. 打印单张图像的形状和值范围 |
知道MNIST是28x28灰度图,标签0-9 |
| 2 | 理解CNN模型定义(卷积/池化/全连接) | 1. 修改卷积核数量(如将16改为8) 2. 打印模型每一层的输出形状 |
能根据输入形状推导输出形状 |
| 3 | 掌握训练流程(5大步骤:清梯度→前向→损失→反向→更新) | 注释掉optimizer.zero_grad(),观察训练效果 | 理解「梯度累加」的问题,知道该步骤的必要性 |
| 4 | 理解测试流程+准确率计算 | 1. 计算训练集的准确率 2. 修改batch_size为32,重新训练 |
知道model.eval()和torch.no_grad()的作用 |
| 5-7 | MNIST项目优化+复盘 | 1. 将学习率改为0.01,观察训练效果(损失是否震荡) 2. 增加训练轮数到10,看准确率是否提升 3. 整理项目核心步骤笔记 |
能独立修改超参数,分析不同超参数对模型的影响 |
第6-8周:计算机视觉(CV)核心专项(CNN进阶+经典网络)
| 周数 | 核心任务 | 重点练手项目 | 验证标准 |
|---|---|---|---|
| 6 | CNN进阶(Padding/Stride/池化原理+数据增强) | 实现「图像数据增强工具类」:包含随机翻转、裁剪、旋转 | 增强后的图像可可视化,不影响识别 |
| 7 | 经典网络实战(LeNet→AlexNet→VGG→ResNet) | 用ResNet18微调MNIST,提升准确率 | 准确率≥99%,理解ResNet残差连接的作用(解决梯度消失) |
| 8 | 图像分类实战进阶 | 基于自定义数据集(如猫狗分类,可从Kaggle下载)实现图像分类 | 能处理自定义数据集,完成训练和测试 |
第9-11周:自然语言处理(NLP)核心专项(词向量+Transformer+BERT)
| 周数 | 核心任务 | 重点练手项目 | 验证标准 |
|---|---|---|---|
| 9 | 词向量基础(Word2Vec/GloVe)+ 文本预处理 | 1. 实现文本分词/去停用词 2. 用GloVe预训练词向量表示句子 |
能将任意句子转为向量表示 |
| 10 | Transformer基础+注意力机制 | 实现简单的自注意力机制 | 理解注意力机制的核心:「关注重要信息」 |
| 11 | Hugging Face Transformers库+BERT微调 | 基于BERT实现中文文本情感分析(如豆瓣影评) | 能加载预训练BERT模型,完成微调,准确率≥85% |
第12-14周:项目落地与工程化(打造可演示/可部署的作品集)
核心:将模型封装为可视化界面/API接口,上传GitHub,形成完整作品集(就业/面试必备)
| 周数 | 核心任务 | 最终落地项目 | 验证标准 |
|---|---|---|---|
| 12 | 可视化界面开发(Gradio/Streamlit) | 基于MNIST模型开发「手写数字识别网页」 | 可在浏览器中手绘数字,实时输出预测结果 |
| 13 | API接口开发(FastAPI) | 开发「图像分类API」+「文本情感分析API」 | 用Postman调用接口,传入图像/文本,返回预测结果 |
| 14 | 工程化优化+GitHub上传 | 1. 模型ONNX转换(推理加速) 2. 编写项目README.md(含环境配置、使用方法、效果演示) 3. 上传所有代码到GitHub |
GitHub仓库结构清晰,可直接克隆运行,有效果截图/演示视频 |
三、关键学习要求(确保效率,避免走偏)
-
代码必须手动敲:禁止复制粘贴,哪怕是重复的代码,敲一遍的理解远大于看十遍;
-
每步验证结果:所有练手题目必须运行出正确结果,报错时先自己查(看报错信息+百度),再求助;
-
做好笔记整理:每周末花30分钟整理本周核心知识点+代码片段+问题解决方法,用Markdown记录;
-
保存所有代码:按「阶段/周数/项目名」建立文件夹,所有代码和模型文件统一保存,方便后续复盘;
-
聚焦核心不贪多:入门阶段只做「图像分类+文本分类」两个核心方向,不碰GAN/扩散模型等复杂内容。
四、配套资源(精准匹配任务,无需额外找资料)
-
PyTorch官方文档:中文教程(查API必备,最权威);
-
动手学深度学习:李沐老师课程+代码(完全适配PyTorch,与任务高度契合);
-
Hugging Face官方教程:Transformers使用指南(NLP专项必备);
-
数据集下载:MNIST(自动下载)、猫狗分类(Kaggle)、中文情感分析(百度网盘/天池)。
五、后续支持
如果在学习过程中遇到代码报错、概念理解不清、超参数调优等问题,可直接告诉我具体问题(附报错信息/代码片段),我会针对性解答并补充对应知识点!
现在可以直接从「环境配置」开始,完成后运行MNIST核心代码,开启你的AI深度学习之路~
(注:文档部分内容可能由 AI 生成)

浙公网安备 33010602011771号