我的 PyTorch 与机器学习入门笔记
最近有朋友问我:“机器学习到底怎么入门?感觉特别神秘,数学公式一大堆,看了就头疼。” 其实吧,它真没那么玄乎。机器学习就像教小猫用猫砂——你不是硬生生掰着它的爪子去刨,而是把它抱进去几次,让它自己发现“哦,这里可以解决问题”。 电脑也一样,你给它看足够多的例子(数据),它自己就能琢磨出规律来。
今天,我就把自己从完全懵圈到能做出第一个猫猫识别模型的全过程分享给你。我们不聊空洞的理论,就说人话,聊实操,聊我踩过的那些坑。
我们聊聊这些
- 机器学习到底是什么?(别被名词吓到)
- 数学不好真的学不了吗?(我的亲身经历)
- 从哪里开始动手才不会放弃?
- PyTorch为什么像毛线球一样好玩?
- 亲手做出你的第一个“AI小猫”
- 接下来该往哪儿走?
一、先搞清它到底是什么(别被名词吓到)
“机器学习”这个词听起来像科幻片,但本质特别简单。
想象一下,你想教自家猫猫认识你新买的玩具老鼠。
笨办法(传统编程):你写一本《老鼠识别手册》,规定“有长尾巴、小耳朵、胡须的是老鼠”。但万一玩具有的尾巴短呢?你就得不停改手册。
聪明办法(机器学习):你干脆给猫猫看100张老鼠照片和100张非老鼠照片,每张都告诉它“这是老鼠”或“这不是”。看多了,猫猫自己就总结出了老鼠的特征(可能连你都没想到的特征组合)。下次看到新玩具,它就能自己判断了。
机器学习就是这个“聪明办法”的电脑版。 你给它数据和答案(“监督学习”),它自己找规律。你只给它数据不给答案,它自己把相似的东西分堆(“无监督学习”)。
我当初的误解: 我以为要自己设计出所有规则。后来发现,我的工作其实是:1)准备高质量的数据(干净的照片),2)选一个合适的“学习框架”(PyTorch就是其中之一),3)调整“教学方式”(调参数)。规则是电脑自己学的。
二、数学不好真的学不了吗?(我当初也怕这个)
坦白说,我看到矩阵求导和概率密度函数时,也想把书扔了。
但我发现一个秘密:你不需要成为数学家才能用机器学习,就像你不需要成为汽车工程师才能开车。
关键在于理解意图,而不是推导过程。
- 线性代数(矩阵运算):你只要知道,电脑喜欢把数据排成整齐的方块(矩阵)来批量计算,这样比一个一个算快无数倍。
y = Wx + b这个公式,你理解为“用一套权重W和偏置b,把输入数据x变换成预测结果y”就够了。PyTorch里的torch.mm()就是干这个的。 - 微积分(梯度、导数):核心是“找最快下山的路”。模型怎么知道自己错了?怎么调整?靠的就是计算梯度(坡度),然后往坡度下降最快的方向挪一小步。好消息是:PyTorch的
autograd自动帮你算好了所有梯度。 你只需要告诉它“开始算梯度吧”(loss.backward()),它就像自动驾驶一样帮你搞定。 - 概率统计:主要是理解“不确定性”。模型说这张图有85%的概率是猫,15%是狗。这比硬生生说“这是猫”更合理。
我的策略是“用到再学,不求甚解”。 先跑通一个代码,看到 loss在下降,有成就感了。再回头问:“刚才那个 optimizer.step()里,模型到底是怎么更新权重的?” 这时候去看数学,动力十足,理解也深。
三、从哪里开始动手才不会放弃?(路线图来了)
直接啃教材和论文,99%的人会放弃。咱们得边玩边学。
第一阶段:搭好你的“猫爬架”(1-2周)
这是基础,不能跳过,但可以速通。
- Python环境:安装Anaconda,它像一个大工具箱,什么都给你准备好了。创建一个新环境叫
pytorch_playground,专用于学习。 - 三个必会库:
- NumPy:处理数组和矩阵。学会创建数组、切片、做加减乘除。把它想象成乐高积木板。
- Pandas:处理表格数据(比如Excel)。学会读CSV文件、查看头尾数据、筛选列。这是你整理“猫猫资料卡”的工具。
- Matplotlib:画图。学会画折线图(看损失下降)、散点图。可视化能让你“看见”模型在学习。
# 一个快速的 NumPy + Matplotlib 体验
import numpy as np
import matplotlib.pyplot as plt
# 造一些数据:猫猫的体重(kg)和每天睡眠时长(小时)
cat_weight = np.array([3.5, 4.2, 2.8, 5.1, 3.9])
cat_sleep = np.array([15, 14, 16, 13, 14.5])
plt.scatter(cat_weight, cat_sleep)
plt.xlabel('Weight (kg)')
plt.ylabel('Sleep (hours)')
plt.title('Do Heavier Cats Sleep More?')
plt.show()
# 看,是不是立刻有数据科学那味儿了?
第二阶段:理解机器学习的“猫语”(2-3周)
别急着上神经网络。先玩熟这几个核心概念:
- 回归:预测一个连续值。比如根据猫猫的年龄、品种,预测它的体重。
- 分类:预测一个类别。比如根据图片,判断是“猫”还是“狗”。
- 训练/验证/测试集:把你的数据分成三份。
- 训练集:给模型看的教材。
- 验证集:随堂小考,用来调整教学难度(调参)。
- 测试集:最终期末考试,评估模型真实水平。千万不能偷看!
- 损失函数:模型考了多少分。分越低越好。
- 优化器:根据考试分数,告诉模型该怎么改错题(更新权重)。
我建议你在这里,用最原始的Python和NumPy,不借助任何框架,实现一个最简单的线性回归。 这会让你彻底理解“梯度下降”到底在干嘛。虽然代码只有二三十行,但完成后的通透感无与伦比。
第三阶段:欢迎来到PyTorch游乐场(3-4周)
终于到主角了!为什么选PyTorch?因为它动态、直观、调试友好,就像搭积木,搭错了立刻知道是哪块出了问题。
第一周:和Tensor交朋友
Tensor就是PyTorch里的“超级NumPy数组”,还能记录计算过程以便求梯度。
import torch
# 创建一个Tensor,并告诉PyTorch:请记录它的所有操作,我要算梯度!
x = torch.tensor([1.0, 2.0], requires_grad=True)
y = x ** 2 + 2 # 一个计算
loss = y.sum() # 一个标量损失
loss.backward() # 魔法开始!自动计算所有梯度
print(x.grad) # 查看x的梯度
# 输出:tensor([2., 4.]) # 因为 d(x^2)/dx = 2x
看,自动微分就这么简单。backward()就像对模型说:“从你犯的错(loss)开始,倒着往回找,看看是谁的责任(梯度)。”
第二周:组装你的第一个神经网络
PyTorch用 nn.Module来定义网络,特别有组织。
import torch.nn as nn
class MyFirstCatNet(nn.Module):
def __init__(self):
super().__init__()
# 定义网络层,像搭乐高
self.fc1 = nn.Linear(784, 128) # 全连接层:784个输入,128个输出
self.fc2 = nn.Linear(128, 10) # 输出10个类别(比如0-9的数字)
self.relu = nn.ReLU() # 激活函数,让网络能学习复杂规律
def forward(self, x):
# 定义数据怎么流动
x = self.fc1(x)
x = self.relu(x) # 经过一个“激活阀门”
x = self.fc2(x)
return x
net = MyFirstCatNet()
print(net)
# 它就是一个你自己定义的、可以训练的函数!
第三、四周:完成第一个端到端项目
用经典的MNIST手写数字数据集。PyTorch的 DataLoader像是一个自动喂食器,帮你把数据分批、打乱顺序喂给模型。
关键流程就四步,在一个循环里:
for epoch in range(10): # 把所有数据看10遍
for data, label in train_loader: # 从喂食器取一批
optimizer.zero_grad() # 清空上一批的梯度残留
output = net(data) # 前向传播:让模型做预测
loss = criterion(output, label) # 算考了多少分
loss.backward() # 反向传播:分析错题
optimizer.step() # 优化器:根据错题分析更新权重
print(f'Epoch {epoch}, Loss: {loss.item():.4f}')
看着 loss一点点下降,那种“猫猫终于学会用猫砂了”的成就感,就是坚持下去的最大动力。
四、亲手试试看:做一个猫狗分类器(雏形)
我建议你第一个像样的项目做图像分类,不是因为简单,而是因为可视化强,成就感来得快。
- 找一个数据集:Kaggle上的“Dogs vs Cats”或者用
torchvision.datasets.CIFAR10(里面有猫、狗、车等10类)。 - 用现成的模型:别从头造轮子。用
torchvision.models里的resnet18,把最后的全连接层改成输出2类(猫/狗)。这叫迁移学习,相当于让一个读过万卷书的学霸,专门学猫狗知识,事半功倍。 - 关注核心代码:
# 加载预训练模型,并“冻住”前面的层,只训练最后的自定义层
model = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)
for param in model.parameters():
param.requires_grad = False # 冻住!不让这些层更新
# 替换最后一层
model.fc = nn.Linear(model.fc.in_features, 2) # 输出2类
- 如果成功了,试试调整学习率、多解冻几层网络训练。
- 如果卡住了,99%的问题出在:
- 数据没归一化(用
transforms.Normalize) - 标签不对应(检查DataLoader输出的label范围)
- 学习率太大或太小(试试0.001, 0.0003)
- 数据没归一化(用
五、聊了这么多,接下来该往哪儿走?
我们从“机器学习是什么鬼”聊到了怎么用PyTorch搭出第一个能跑的模型。
当然,这只是个开始。 就像猫猫刚学会用猫砂,离成为捕猎高手还远。前面还有卷积网络(CNN,专看图片)、循环网络(RNN,专处理文字和时间序列)、Transformer(现在最火的架构)等等好玩的“高级玩具”等着你。
如果你接下来只想做一件事,我建议:去Kaggle找个最简单的比赛(比如泰坦尼克号生存预测),用PyTorch完整做一遍。 从数据清洗、定义模型、训练验证到提交结果。这个闭环体验,比看十篇教程都有用。
我为你准备的工具包
最后,分享一些我的学习资源:
- 书:《动手学深度学习》(PyTorch版)。有中文,有Jupyter Notebook代码,免费在线。
- 课:PyTorch官方教程(零基础友好)。Stanford CS231n(计算机视觉神课,理解概念极佳)。
- 社区:PyTorch论坛、Stack Overflow(提问前先搜)。知乎和Reddit的r/MachineLearning有很多讨论。
- 练手:Kaggle、天池。GitHub上搜‘pytorch tutorial’或‘pytorch beginner project’。
机器学习这条路,有时候会觉得像在走迷宫,尤其是调参调得焦头烂额的时候。但每次突破一点,看到模型终于识别出屏幕上那只小猫的瞬间,所有的抓狂都值了。
最关键的,就是现在动手,跑起你的第一行代码。 理论可以在错误中补,但观望永远不会进步。