深入理解fastai项目:从MNIST手写数字分类入门深度学习

深入理解fastai项目:从MNIST手写数字分类入门深度学习

fastbook The fastai book, published as Jupyter Notebooks fastbook 项目地址: https://gitcode.com/gh_mirrors/fa/fastbook

计算机视觉的基础:像素

在计算机视觉模型中,理解计算机如何处理图像是第一步。我们将使用计算机视觉领域最著名的数据集之一——MNIST手写数字数据集进行实验。这个数据集由美国国家标准与技术研究院收集,并由Yann Lecun及其同事整理成机器学习数据集。

MNIST数据集中的图像都是28×28像素的灰度图像。让我们看看如何用Python表示和处理这些图像:

from fastai.vision.all import *
path = untar_data(URLs.MNIST_SAMPLE)
threes = (path/'train'/'3').ls().sorted()
im3 = Image.open(threes[1])

当我们用PIL库打开图像后,可以将其转换为NumPy数组或PyTorch张量来查看实际的像素值:

array(im3)[4:10,4:10]  # 查看图像左上角6×6区域的像素值
tensor(im3)[4:10,4:10]  # 同样的内容,但表示为PyTorch张量

从像素到张量:深度学习的数据基础

在深度学习中,我们主要使用张量(tensor)来表示数据。张量是多维数组的泛化,可以看作是NumPy数组的扩展。PyTorch张量特别适合深度学习,因为它们:

  1. 可以自动计算梯度(用于反向传播)
  2. 可以高效地在GPU上运行
  3. 提供了丰富的张量操作函数

对于MNIST图像,每个28×28的图片可以表示为一个二维张量,数值范围通常是0(黑色)到255(白色)。

构建基础分类器:3和7的分类

我们的目标是构建一个能区分数字3和7的简单分类器。首先,我们需要加载所有3和7的图片:

threes = (path/'train'/'3').ls().sorted()
sevens = (path/'train'/'7').ls().sorted()

然后,我们将这些图像转换为张量并堆叠起来:

three_tensors = [tensor(Image.open(o)) for o in threes]
seven_tensors = [tensor(Image.open(o)) for o in sevens]
stacked_threes = torch.stack(three_tensors).float()/255
stacked_sevens = torch.stack(seven_tensors).float()/255

这里我们将像素值从0-255缩放到0-1之间,这是深度学习中的常见做法。

理解广播机制

广播(broadcasting)是PyTorch和NumPy中的一项强大功能,它允许不同形状的张量进行算术运算。例如,我们可以计算所有3的平均图像:

mean3 = stacked_threes.mean(0)

这里,mean(0)表示在第0维度(图像数量维度)上取平均,得到一个28×28的平均3图像。广播机制会自动处理不同形状张量之间的运算。

损失函数与模型评估

为了评估我们的模型性能,我们需要定义损失函数。对于分类问题,一个简单的选择是平均绝对误差(MAE):

def mnist_distance(a, b):
    return (a - b).abs().mean((-1,-2))

这个函数计算两幅图像之间的平均像素差异。我们可以用它来比较测试图像与平均3和平均7的距离,然后选择距离更近的作为预测结果。

随机梯度下降(SGD)简介

虽然上面的方法有效,但它不是"学习"得来的。真正的深度学习使用随机梯度下降(SGD)来自动调整模型参数。基本思想是:

  1. 初始化一些随机参数(权重)
  2. 计算这些参数在当前数据上的损失
  3. 计算损失相对于参数的梯度
  4. 沿着梯度相反方向小幅调整参数(因为我们要最小化损失)
  5. 重复这个过程直到损失足够小

在fastai中,这个过程被高度抽象化,但理解其底层原理非常重要。

神经网络的基本数学原理

最简单的神经网络可以看作是一系列矩阵乘法和非线性变换的组合。对于我们的MNIST分类器,可以这样表示:

  1. 将28×28图像展平为784维向量
  2. 与权重矩阵相乘(假设输出是1维)
  3. 加上偏置项
  4. 应用激活函数(如sigmoid)得到0-1之间的预测值

这个预测值可以解释为图像是3的概率。

完整训练流程

在fastai中,完整的训练流程可以简化为:

dls = ImageDataLoaders.from_folder(path)
learn = cnn_learner(dls, resnet18, pretrained=False,
                    loss_func=F.cross_entropy, metrics=accuracy)
learn.fit_one_cycle(1, 0.1)

虽然这看起来简单,但背后包含了我们讨论的所有概念:张量操作、广播、损失函数、SGD优化等。

结语

通过这个MNIST手写数字分类的示例,我们深入探讨了深度学习的基础概念。理解这些底层原理对于成为优秀的深度学习实践者至关重要。虽然现代深度学习框架如fastai提供了高级API,但知其然且知其所以然才能让我们更好地解决实际问题。

fastbook The fastai book, published as Jupyter Notebooks fastbook 项目地址: https://gitcode.com/gh_mirrors/fa/fastbook

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常琚蕙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值