深度学习案例分享 | 手写数字识别 - PyTorch 实现

3 篇文章 0 订阅
3 篇文章 0 订阅

大家好,我是小寒。

今天我们来分享第二个深度学习案例:手写数字识别。

原文链接

MNIST 手写数字识别数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology,NIST)。这个数据集由250个不同人手写的数字构成, 其中50%来自高中生, 50%来自美国人口普查局(the Census Bureau) 的工作人员。MNIST 是图像分类中使用最广泛的数据集。

1.加载数据集

MNIST 手写数字识别数据集中的图像是一个28*28 的灰度图像。我们通过 pytorch 的内置函数将 MNIST 下载并读到内存中。

# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,
# 并除以255使得所有像素的数值均在0到1之间
trans = transforms.ToTensor()
mnist_train = torchvision.datasets.MNIST(root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.MNIST(root="../data", train=False, transform=trans, download=True)

MNIST由10个类别的图像组成,每个类别由训练数据集(train dataset)中的6000张图像和测试数据集(test dataset)中的1000张图像组成。

len(mnist_train), len(mnist_test)
60000,10000
可视化数据集

我们来显示看一下数据集中的图像样本是什么样的。

通过如下方式,我们来可视化的展示训练集中前几个样本。

# 显示数据集
mnist_show = torchvision.datasets.MNIST(root="../data", train=True, transform=torchvision.transforms.ToTensor(), download=True)
images, label = next(iter(data.DataLoader(mnist_show, 20, shuffle=True)))
#多张图合并成一张图片
images_example = torchvision.utils.make_grid(images,nrow=5)
images_example = images_example.numpy().transpose(1,2,0) # 将图像的通道值置换到最后的维度,符合图像的格式
plt.imshow(images_example )
plt.show()

2.模型架构

这里我们使用只有一个隐藏层的多层感知机(MLP)来进行手写数字的识别。

模型架构如下图所示。

这里定义了两层的的神经网络,第⼀层是隐藏层,它包含 256 个隐藏单元,并使⽤了 ReLU 激活函数。第⼆层是输出层。

#这里使用多层感知机来进行手写数字的识别
net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))
3.初始化模型参数

以均值为 0 和标准差为 0.1的高斯分布来随机初始化权重。

# PyTorch 不会隐式地调整输⼊的形状。因此,
# 我们在线性层前定义了展平层(flatten),来调整⽹络输⼊的形状
def init_weights(m):
    if type(m) == nn.Linear:
        #以均值为 0 和标准差为 0.1 随机初始化权重。
        nn.init.normal_(m.weight, std=0.1)

4.定义损失函数

由于是分类问题,所以损失函数使用交叉熵损失。

loss = nn.CrossEntropyLoss(reduction='none')

5.定义优化器

使用 SGD(批量梯度下降算法)来进行优化,这里设置学习率为0.01

trainer = torch.optim.SGD(net.parameters(), lr=0.01)

6.训练和预测

class Accumulator:
    """在n个变量上累加"""
    def __init__(self, n):
        self.data = [0.0] * n
    def add(self, *args):
        self.data = [a + float(b) for a, b in zip(self.data, args)]
    def reset(self):
        self.data = [0.0] * len(self.data)
    def __getitem__(self, idx):
         return self.data[idx]

print("随机初始化后,测试集的准确率为")
print(evaluate_accuracy(net, test_iter))

#训练
def train_epoch_ch3(net, train_iter, loss, updater):
    """训练模型⼀个迭代周期(定义⻅第3章)"""
    # 将模型设置为训练模式
    if isinstance(net, torch.nn.Module):
        net.train()
    # 训练损失总和、训练准确度总和、样本数
    metric = Accumulator(3)
    for X, y in train_iter:
        #进行预测
        y_hat = net(X)
        #计算损失
        l = loss(y_hat, y)
        if isinstance(updater, torch.optim.Optimizer):
        # 使⽤PyTorch内置的优化器和损失函数
            updater.zero_grad()
            l.mean().backward()
            updater.step()
        else:  # 使⽤定制的优化器和损失函数
            l.sum().backward()
            updater(X.shape[0])
    metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
    # 返回训练损失和训练精度
    return metric[0] / metric[2], metric[1] / metric[2]

train_losss=[]
train_accs=[]

def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):
        """训练模型"""
        for epoch in range(num_epochs):
            train_metrics = train_epoch_ch3(net, train_iter, loss, updater)
            train_loss, train_acc = train_metrics
            print(f'epoch {epoch + 1}, loss {float(train_loss):f}')
            train_losss.append(train_loss)
            train_accs.append(train_acc)

num_epochs = 15
print("开始训练:")
train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

输出:

随机初始化后,测试集的准确率为
0.0997
开始训练:
epoch 1, loss 1.719787
epoch 2, loss 1.028229
epoch 3, loss 0.708345
epoch 4, loss 0.633207
epoch 5, loss 0.545152
epoch 6, loss 0.517245
epoch 7, loss 0.435589
epoch 8, loss 0.378610
epoch 9, loss 0.398382
epoch 10, loss 0.355470
epoch 11, loss 0.292634
epoch 12, loss 0.303913
epoch 13, loss 0.297712
epoch 14, loss 0.316524
epoch 15, loss 0.227925

7.评估及测试

def show_image(num_epochs,train_ls,train_acc):
    plt.plot(np.arange(1, num_epochs + 1), train_ls,label='train_loss')
    plt.plot(np.arange(1, num_epochs + 1), train_acc,label='train_accuracy')
    plt.xlabel('epoch')
    plt.legend()
    plt.show()
show_image(num_epochs,train_losss,train_accs)

test_acc = evaluate_accuracy(net, test_iter)
print(f'test_acc {float(test_acc):f}')

输出:

test_acc 0.910300

损失变化和准确率变化如下图所示。

最后

今天简单介绍了一个如何用 Pytorch 训练一个简单的房价预测。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch深度学习简明实战电子版是一本帮助读者入门深度学习框架PyTorch的书籍。本书内容详细,分为四个部分,分别是:PyTorch初步、图像分类、目标检测以及深度强化学习,能够帮助读者系统地学习深度学习的基础知识、理解和掌握PyTorch框架下的常用模型和算法,并能够在实践中应用这些模型和算法解决实际问题。 在PyTorch初步部分,本书介绍了PyTorch框架的基本使用方法和特点,包括如何创建和操作张量、构建计算图、定义和训练模型等方面的内容。图像分类部分介绍了卷积神经网络(CNN)的基础理论和实现方法,并使用PyTorch框架构建了一个CNN模型,用于解决图像分类问题。目标检测部分介绍了目标检测的基础知识和Mask R-CNN算法,并使用PyTorch实现了Mask R-CNN模型,应用于目标检测问题。深度强化学习部分介绍了深度强化学习的基本理论和实现方法,并使用PyTorch框架实现了深度Q网络(DQN)算法,应用于OpenAI Gym游戏环境中。 本书的内容涵盖了深度学习的多个方面,适合广大读者学习和实践。同时,本书使用Python语言和PyTorch框架,使得读者能够快速上手,掌握深度学习的基础知识和PyTorch框架的用法。最后,本书提供了大量实例代码和练习题,帮助读者深入理解和应用所学知识。 ### 回答2: PyTorch深度学习简明实战电子版是一本介绍PyTorch深度学习框架的实战教程。本书分为三个部分,第一部分是基础知识,包括PyTorch的基本操作、张量、自动求导、线性回归模型等内容;第二部分介绍深度学习的常用模型,包括卷积神经网络、循环神经网络、生成对抗网络等;第三部分是应用案例,包括图像分类、目标检测、自然语言处理等。 书中的案例非常实用,深入浅出地介绍了每个模型的实现原理和使用方法。而且,书中使用的数据集是实际的数据集,例如MNIST手写数字识别、CIFAR-10图像分类等,能够充分体现PyTorch在实际应用中的优势。 本书的特色在于其简洁明了的讲解方式,将深度学习框架PyTorch的基本操作及其应用形象生动地展现出来。此外,本书还提供了丰富的代码实现、调试和性能优化技巧,为读者提供了一系列实用的工具来应对实际问题。 总之,PyTorch深度学习简明实战电子版是一本非常实用的教材,不仅能够帮助读者快速掌握PyTorch的各项功能,还能够让读者在实践中深入理解深度学习实现原理。该书对于人工智能相关行业的从业者、学生以及对深度学习感兴趣的读者都是一本值得阅读的好书。 ### 回答3: PyTorch深度学习简明实战电子版是一本针对深度学习初学者推出的实战教程,主要原因是PyTorch是一个非常适合于初学者的深度学习框架,其将深度学习任务分解成容易理解和实现的步骤。此书包含了丰富的实际应用案例,以及详细的实现代码和运行结果分析。通过阅读本书,读者可以学习到深度学习的核心概念,如神经网络、梯度下降、损失函数等,并且能够了解如何使用PyTorch中的各种工具来构建和训练深度神经网络。本书还着重强调了PyTorch的动态图机制,这一点与其他深度学习框架的静态图机制不同,动态图机制允许我们更加直观地进行模型设计和调试。在本书中,作者还涉及了一些高级技术,如循环神经网络、深度卷积网络等,从而为读者提供更加全面的知识体系。总之,PyTorch深度学习简明实战电子版是一本值得推荐的实战教程,既适合初学者入门,也可以帮助专业人士深入了解PyTorch的实际应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值