Python与PyTorch深度学习入门指南:从基础到实战

176 阅读4分钟

前言

本文面向初学深度学习的新手,通过形象化的比喻与实战案例,带你快速掌握Python基础PyTorch核心概念手写数字识别实战。所有代码均可直接运行(需提前安装PyTorch),建议边阅读边实践。


一、Python必备基础(快速回顾)

1. 变量与数据类型

# 基础容器
a = 3                   # 整数 → 存储单个数值
text = "Hello AI"       # 字符串 → 存储文本
arr = [1, 2, 3]         # 列表 → 有序可变集合
dict = {"name": "Bob"}  # 字典 → 键值对映射

# 类型转换
float_num = float(a)    # 转为浮点数 → 3.0

2. 控制流

# for循环:遍历列表元素
for num in arr:
    print(num * 2)       # 输出 2, 4, 6

# if条件:逻辑判断
if a > 2 and "AI" in text:
    print("条件满足!")

二、PyTorch核心概念(形象化解析)

1. 张量:数据的“多维集装箱”

  • 0维张量 → 标量(如温度值)
  • 1维张量 → 向量(如股票价格序列)
  • 2维张量 → 矩阵(如Excel表格)
  • 3维张量 → 立体数据(如RGB图片:高度×宽度×颜色通道)
import torch

# 创建张量的多种方式
scalar = torch.tensor(3.14)           # 标量(箱子中装一个苹果)
matrix = torch.tensor([[1,2], [3,4]]) # 矩阵(货架上摆放的鸡蛋盒)
video = torch.rand(10,3,224,224)      # 视频数据(4维:时间×通道×高×宽)

# GPU加速(用货运卡车搬运集装箱)
if torch.cuda.is_available():
    matrix = matrix.cuda()  # 将数据移入GPU

2. 自动微分:智能会计系统

场景模拟
假设你要计算广告投入对利润的影响。PyTorch的Autograd会自动追踪所有计算步骤,一键反向计算梯度。

# 定义变量(标记需要追踪的变量)
x = torch.tensor(2.0, requires_grad=True)  # 广告投入金额

# 正向计算(利润计算模型)
y = x**3 + 2*x       # 利润 = 投入^3 + 2*投入
z = torch.sin(y)     # 最终收益 = sin(利润)

# 反向传播(计算梯度)
z.backward()          # 自动计算导数链
print(x.grad)        # 输出:dz/dx = (3x² + 2) * cos(y) 
                     # 当x=2时计算结果为 (12 + 2)*cos(12) ≈ -11.8

3. 神经网络模块:乐高积木库

PyTorch的nn.Module提供预定义的神经网络组件,支持自由拼装:

import torch.nn as nn

class CustomNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 选择积木块
        self.layer1 = nn.Linear(784, 256)  # 全连接层(输入784维→256维)
        self.act = nn.ReLU()               # 激活函数(引入非线性)
        self.layer2 = nn.Linear(256, 10)    # 输出层(10分类)
    
    def forward(self, x):
        # 定义数据流动路径
        x = self.layer1(x)    # 数据通过第一层
        x = self.act(x)       # 激活函数“开关”
        return self.layer2(x)

# 实例化网络
model = CustomNet()

三、数据加载系统:工厂流水线

PyTorch通过DatasetDataLoader实现高效数据加载:

1. Dataset类:原料仓库

from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data_path):
        # 加载原始数据(如CSV文件)
        self.data = torch.load(data_path)  # 假设已预处理
        
    def __len__(self):
        return len(self.data)  # 总样本数
    
    def __getitem__(self, idx):
        # 单样本处理流水线
        features = self.data[idx][:10]  # 前10列为特征
        label = self.data[idx][-1]      # 最后一列为标签
        return features.float(), label.long()

# 实例化数据集
dataset = MyDataset('data.pth')

2. DataLoader:批量生产车间

from torch.utils.data import DataLoader

loader = DataLoader(
    dataset,
    batch_size=32,    # 每批次32个样本
    shuffle=True,     # 打乱顺序(防止模型记忆顺序)
    num_workers=2     # 多线程加载(加快速度)
)

# 使用示例
for batch_features, batch_labels in loader:
    print(f"批次特征形状:{batch_features.shape}")  # 如 [32,10]

四、实战案例:MNIST手写数字识别

1. 数据准备

from torchvision import datasets, transforms

# 数据预处理管道
transform = transforms.Compose([
    transforms.ToTensor(),                # 转张量(0-255 → 0-1)
    transforms.Normalize((0.5,), (0.5,))   # 标准化到[-1,1]
])

# 加载数据集(自动下载)
train_set = datasets.MNIST(
    root='./data', 
    train=True,
    download=True, 
    transform=transform
)

# 创建数据加载器
train_loader = DataLoader(train_set, batch_size=64, shuffle=True)

2. 模型训练全流程

model = CustomNet()
criterion = nn.CrossEntropyLoss()  # 损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器

# 训练循环
for epoch in range(5):  # 遍历数据集5次
    for images, labels in train_loader:
        optimizer.zero_grad()        # 清空历史梯度
        outputs = model(images)      # 前向传播(计算预测值)
        loss = criterion(outputs, labels)  # 计算损失
        loss.backward()              # 反向传播(计算梯度)
        optimizer.step()             # 更新参数
        
    print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")

3. 扩展功能

模型保存与加载

# 保存模型
torch.save(model.state_dict(), 'mnist_model.pth')

# 加载模型(用于推理)
loaded_model = CustomNet()
loaded_model.load_state_dict(torch.load('mnist_model.pth'))

单张图片预测

from PIL import Image

# 处理自定义图片
img = Image.open('my_digit.png').convert('L')  # 转为灰度图
img_tensor = transform(img).unsqueeze(0)      # 添加批次维度

# 预测
with torch.no_grad():
    prediction = loaded_model(img_tensor).argmax(dim=1)
    print(f"预测结果:{prediction.item()}")

五、学习路径建议

  1. 优先掌握:张量操作 → 自动微分原理 → 数据加载流程

  2. 修改实验

    • 改变网络结构(增加隐藏层)
    • 尝试不同优化器(SGD vs Adam)
    • 调整学习率(0.1→0.0001)
  3. 进阶方向

    graph LR
    A[基础全连接网络] --> B[卷积神经网络CNN]
    B --> C[预训练模型迁移]
    C --> D[自然语言处理NLP]
    

环境安装

pip install torch torchvision matplotlib

提示:所有代码已在PyTorch 2.0+测试通过,建议结合官方文档实践。遇到问题时,先检查错误信息,再搜索相关关键词(如“PyTorch DataLoader shuffle作用”),逐步培养debug能力。