Python AI 与深度学习:每周任务拆分及代码练手

Python AI与深度学习(方向5):每周每日任务拆分+代码练手+环境配置+MNIST入门代码

以下内容完全适配Python基础已掌握的学习者,按「数学补全→PyTorch基础→核心实战」循序渐进,每日1.5-2小时,任务量化、代码可直接运行,配套练手题目和验证标准,确保学完即会用。

一、PyTorch深度学习环境一键配置(Windows/macOS/Linux通用)

方式1:Anaconda配置(推荐,环境隔离不冲突)

  1. 下载Anaconda:官网地址(选对应系统版本,Python3.9+),默认安装即可

  2. 打开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仓库结构清晰,可直接克隆运行,有效果截图/演示视频

三、关键学习要求(确保效率,避免走偏)

  1. 代码必须手动敲:禁止复制粘贴,哪怕是重复的代码,敲一遍的理解远大于看十遍;

  2. 每步验证结果:所有练手题目必须运行出正确结果,报错时先自己查(看报错信息+百度),再求助;

  3. 做好笔记整理:每周末花30分钟整理本周核心知识点+代码片段+问题解决方法,用Markdown记录;

  4. 保存所有代码:按「阶段/周数/项目名」建立文件夹,所有代码和模型文件统一保存,方便后续复盘;

  5. 聚焦核心不贪多:入门阶段只做「图像分类+文本分类」两个核心方向,不碰GAN/扩散模型等复杂内容。

四、配套资源(精准匹配任务,无需额外找资料)

  1. PyTorch官方文档中文教程(查API必备,最权威);

  2. 动手学深度学习李沐老师课程+代码(完全适配PyTorch,与任务高度契合);

  3. Hugging Face官方教程Transformers使用指南(NLP专项必备);

  4. Gradio/Streamlit官方文档Gradio/Streamlit(可视化部署必备);

  5. 数据集下载:MNIST(自动下载)、猫狗分类(Kaggle)、中文情感分析(百度网盘/天池)。

五、后续支持

如果在学习过程中遇到代码报错、概念理解不清、超参数调优等问题,可直接告诉我具体问题(附报错信息/代码片段),我会针对性解答并补充对应知识点!

现在可以直接从「环境配置」开始,完成后运行MNIST核心代码,开启你的AI深度学习之路~

(注:文档部分内容可能由 AI 生成)

posted @ 2026-02-04 13:51  玛雅人  阅读(62)  评论(0)    收藏  举报