Pytorch-以数字识别更好地入门深度学习

这篇具有很好参考价值的文章主要介绍了Pytorch-以数字识别更好地入门深度学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、数据介绍

二、下载数据 

三、可视化数据

四、模型构建

五、模型训练

六、模型预测


一、数据介绍

MNIST数据集是深度学习入门的经典案例,因为它具有以下优点:

1. 数据量小,计算速度快。MNIST数据集包含60000个训练样本和10000个测试样本,每张图像的大小为28x28像素,这样的数据量非常适合在GPU上进行并行计算。

2. 标签简单,易于理解。MNIST数据集的标签只有0-9这10个数字,相比其他图像分类数据集如CIFAR-10等更加简单易懂。

3. 数据集已标准化。MNIST数据集中的图像已经被归一化到0-1之间,这使得模型可以更快地收敛并提高准确率。

4. 适合初学者练习。MNIST数据集是深度学习入门的最佳选择之一,因为它既不需要复杂的数据预处理,也不需要大量的计算资源,可以帮助初学者快速上手深度学习。

综上所述,MNIST数据集是深度学习入门的经典案例,它具有数据量小、计算速度快、标签简单、数据集已标准化、适合初学者练习等优点,因此被广泛应用于深度学习的教学和实践中。

手写数字识别技术的应用非常广泛,例如在金融、保险、医疗、教育等领域中,都有很多应用场景。手写数字识别技术可以帮助人们更方便地进行数字化处理,提高工作效率和准确性。此外,手写数字识别技术还可以用于机器人控制、智能家居等方面  。

使用torch.datasets.MNIST下载到指定目录下:./data,当download=True时,如果已经下载了不会再重复下载,同train选择下载训练数据还是测试数据

官方提供的类:

class MNIST(
    root: str,
    train: bool = True,
    transform: ((...) -> Any) | None = None,
    target_transform: ((...) -> Any) | None = None,
    download: bool = False
)
Args:
    root (string): Root directory of dataset where MNIST/raw/train-images-idx3-ubyte
        and MNIST/raw/t10k-images-idx3-ubyte exist.
    train (bool, optional): If True, creates dataset from train-images-idx3-ubyte,
        otherwise from t10k-images-idx3-ubyte.
    download (bool, optional): If True, downloads the dataset from the internet and
        puts it in root directory. If dataset is already downloaded, it is not downloaded again.
    transform (callable, optional): A function/transform that takes in an PIL image
        and returns a transformed version. E.g, transforms.RandomCrop
    target_transform (callable, optional): A function/transform that takes in the
        target and transforms it.

二、下载数据 

# 导入数据集
# 训练集
import torch
from torchvision import datasets,transforms
from torch.utils.data import Dataset
train_loader = torch.utils.data.DataLoader(
    datasets.MNIST(root="./data",
                   train=True,
                   download=True,
                   transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])),
                    batch_size=64,
                    shuffle=True)

# 测试集
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST("./data",train=False,transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])),
    batch_size=64,shuffle=True
)

pytorch也提供了自定义数据的方法,根据自己数据进行处理

使用PyTorch提供的Dataset和DataLoader类来定制自己的数据集。如果想个性化自己的数据集或者数据传递方式,也可以自己重写子类。

以下是一个简单的例子,展示如何创建一个自定义的数据集并将其传递给模型进行训练:

import torch
from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        x = self.data[index]
        y = self.labels[index]
        return x, y

data = torch.randn(100, 3, 32, 32)
labels = torch.randint(0, 10, (100,))

my_dataset = MyDataset(data, labels)
my_dataloader = DataLoader(my_dataset, batch_size=4, shuffle=True)

详细完整流程可参考: Pytorch快速搭建并训练CNN模型?

三、可视化数据

mport matplotlib.pyplot as plt
import numpy as np
import torchvision
def imshow(img):
    img = img / 2 + 0.5 # 逆归一化
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg,(1,2,0)))
    plt.title("Label")
    plt.show()

# 得到batch中的数据
dataiter = iter(train_loader)
images,labels = next(dataiter)
# 展示图片
imshow(torchvision.utils.make_grid(images))

Pytorch-以数字识别更好地入门深度学习,Pytorch,Pytorch深度学习,深度学习,pytorch,人工智能,入门mnist

四、模型构建

定义模型类并继承nn.Module基类

# 构建模型
import torch.nn as nn
import torch
import torch.nn.functional as F
class MyNet(nn.Module):
    def __init__(self):
        super(MyNet,self).__init__()
        # 输入图像为单通道,输出为六通道,卷积核大小为5×5
        self.conv1 = nn.Conv2d(1,6,5)
        self.conv2 = nn.Conv2d(6,16,5)
        # 将16×4×4的Tensor转换为一个120维的Tensor,因为后面需要通过全连接层
        self.fc1 = nn.Linear(16*4*4,120)
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10)
    
    def forward(self,x):
        # 在(2,2)的窗口上进行池化
        x = F.max_pool2d(F.relu(self.conv1(x)),2)
        x = F.max_pool2d(F.relu(self.conv2(x)),2)
        # 将维度转换成以batch为第一维,剩余维数相乘为第二维
        x = x.view(-1,self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
    
    def num_flat_features(self,x):
        size = x.size()[1:]
        num_features = 1
        for s in size:
            num_features *= s
        return num_features
    
net = MyNet()
print(net)

输出: 

MyNet(
  (conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
  (fc1): Linear(in_features=256, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)

简单的前向传播

# 前向传播
print(len(images))
image = images[:2]
label = labels[:2]
print(image.shape)
print(image.size())
print(label)
out = net(image)
print(out)

输出: 

16
torch.Size([2, 1, 28, 28])
torch.Size([2, 1, 28, 28])
tensor([6, 0])
tensor([[ 1.5441e+00, -1.2524e+00,  5.7165e-01, -3.6299e+00,  3.4144e+00,
          2.7756e+00,  1.1974e+01, -6.6951e+00, -1.2850e+00, -3.5383e+00],
        [ 6.7947e+00, -7.1824e+00,  8.8787e-01, -5.2218e-01, -4.1045e+00,
          4.6080e-01, -1.9258e+00,  1.8958e-01, -7.7214e-01, -6.3265e-03]],
       grad_fn=<AddmmBackward0>)

计算损失:

# 计算损失
# 因为是多分类,所有采用CrossEntropyLoss函数,二分类用BCELoss
image = images[:2]
label = labels[:2]
out = net(image)
criterion = nn.CrossEntropyLoss()
loss = criterion(out,label)
print(loss)

输出:

tensor(2.2938, grad_fn=<NllLossBackward0>)

五、模型训练

# 开始训练
model = MyNet()
# device = torch.device("cuda:0")
# model = model.to(device)
import torch.optim as optim
optimizer = optim.SGD(model.parameters(),lr=0.01) # lr表示学习率
criterion = nn.CrossEntropyLoss()
def train(epoch):
    # 设置为训练模式:某些层的行为会发生变化(dropout和batchnorm:会根据当前批次的数据计算均值和方差,加速模型的泛化能力)
    model.train()
    running_loss = 0.0
    for i,data in enumerate(train_loader):
        # 得到输入和标签
        inputs,labels = data
        # 消除梯度
        optimizer.zero_grad()
        # 前向传播、计算损失、反向传播、更新参数
        outputs = model(inputs)
        loss = criterion(outputs,labels)
        loss.backward()
        optimizer.step()
        # 打印日志
        running_loss += loss.item()
        if i % 100 == 0:
            print("[%d,%5d] loss: %.3f"%(epoch+1,i+1,running_loss/100))
            running_loss = 0

train(10)

输出:

[11,    1] loss: 0.023
[11,  101] loss: 2.302
[11,  201] loss: 2.294
[11,  301] loss: 2.278
[11,  401] loss: 2.231
[11,  501] loss: 1.931
[11,  601] loss: 0.947
[11,  701] loss: 0.601
[11,  801] loss: 0.466
[11,  901] loss: 0.399

六、模型预测

# 模型预测结果
correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        images,labels = data
        outputs = model(images)
        # 最大的数值及最大值对应的索引
        value,predicted = torch.max(outputs.data,1)
        total += labels.size(0)
        # 对bool型的张量进行求和操作,得到所有预测正确的样本数,采用item将整数类型的张量转换为python中的整型对象
        correct += (predicted == labels).sum().item()
    print("predicted:{}".format(predicted[:10].tolist()))
    print("label:{}".format(labels[:10].tolist()))
    print("Accuracy of the network on the 10 test images: %d %%"% (100*correct/total))

imshow(torchvision.utils.make_grid(images[:10],nrow=len(images[:10])))

输出:

predicted:[1, 0, 7, 6, 5, 2, 4, 3, 2, 6]
label:[1, 0, 7, 6, 5, 2, 4, 8, 2, 6]
Accuracy of the network on the 10 test images: 91 %

Pytorch-以数字识别更好地入门深度学习,Pytorch,Pytorch深度学习,深度学习,pytorch,人工智能,入门mnist

对应类别的准确率:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
classes = [i for i in range(10)]

with torch.no_grad():# model.eval()
    for data in test_loader:
        images,labels = data
        outputs = model(images)
        value,predicted = torch.max(outputs,1)
        c = (predicted == labels).squeeze()
        # 对所有labels逐个进行判断
        for i in range(len(labels)):
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1
    print("class_correct:{}".format(class_correct))
    print("class_total:{}".format(class_total))

# 每个类别的指标
for i in range(10):
    print('Accuracy of -> class %d : %2d %%'%(classes[i],100*class_correct[i]/class_total[i]))

输出:文章来源地址https://www.toymoban.com/news/detail-681967.html

class_correct:[958.0, 1119.0, 948.0, 938.0, 901.0, 682.0, 913.0, 918.0, 748.0, 902.0]
class_total:[980.0, 1135.0, 1032.0, 1010.0, 982.0, 892.0, 958.0, 1028.0, 974.0, 1009.0]
Accuracy of -> class 0 : 97 %
Accuracy of -> class 1 : 98 %
Accuracy of -> class 2 : 91 %
Accuracy of -> class 3 : 92 %
Accuracy of -> class 4 : 91 %
Accuracy of -> class 5 : 76 %
Accuracy of -> class 6 : 95 %
Accuracy of -> class 7 : 89 %
Accuracy of -> class 8 : 76 %
Accuracy of -> class 9 : 89 %

到了这里,关于Pytorch-以数字识别更好地入门深度学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第60步 深度学习图像识别:误判病例分析(Pytorch)

    一、写在前面 上期内容基于Tensorflow环境做了误判病例分析(传送门),考虑到不少模型在Tensorflow环境没有迁移学习的预训练模型,因此有必要在Pytorch环境也搞搞误判病例分析。 本期以SqueezeNet模型为例,因为它建模速度快。 同样,基于GPT-4辅助编程,后续会分享改写过程。

    2024年02月10日
    浏览(49)
  • 第62步 深度学习图像识别:多分类建模(Pytorch)

    一、写在前面 上期我们基于TensorFlow环境做了图像识别的多分类任务建模。 本期以健康组、肺结核组、COVID-19组、细菌性(病毒性)肺炎组为数据集,基于Pytorch环境,构建SqueezeNet多分类模型,因为它建模速度快。 同样,基于GPT-4辅助编程,这次改写过程就不展示了。 二、多

    2024年02月11日
    浏览(40)
  • 人工智能深度学习100种网络模型,精心整理,全网最全,PyTorch框架逐一搭建

    大家好,我是微学AI,今天给大家介绍一下人工智能深度学习100种网络模型,这些模型可以用PyTorch深度学习框架搭建。模型按照个人学习顺序进行排序: 深度学习模型 ANN (Artificial Neural Network) - 人工神经网络:基本的神经网络结构,包括输入层、隐藏层和输出层。 学习点击地

    2024年02月14日
    浏览(54)
  • Pytorch实现基于深度学习的面部表情识别(最新,非常详细)

    基于深度学习的面部表情识别 (Facial-expression Recognition) 数据集cnn_train.csv包含人类面部表情的图片的label和feature。 在这里,面部表情识别相当于一个分类问题,共有7个类别。 其中label包括7种类型表情: 一共有28709个label,即包含28709张表情包。 每一行就是一张表情包4848=2304个

    2024年02月04日
    浏览(81)
  • 【深度学习】pytorch——快速入门

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ PyTorch是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练深度学习模型。下面是一些关于PyTorch的基本信息: 张量(Tensor)操作 :PyTorch中的核心对象是张量,它是一个多维数组。PyTorch提供了广泛的

    2024年02月06日
    浏览(44)
  • 第53步 深度学习图像识别:Bottleneck Transformer建模(Pytorch)

    一、写在前面 (1)Bottleneck Transformer \\\"Bottleneck Transformer\\\"(简称 \\\"BotNet\\\")是一种深度学习模型,在2021年由Google的研究人员在论文\\\"Bottleneck Transformers for Visual Recognition\\\"中提出。 BotNet的核心思想是 将Transformer模型的自注意力机制(Self-Attention Mechanism)引入到了ResNet模型的瓶颈结构

    2024年02月16日
    浏览(40)
  • 基于Pytorch深度学习的脑肿瘤分类识别(文末送书)

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 实验背景 实验目的 实验环境 实验过程 1.加载数据 2.训练模型 3.模型评估 源代码 文末

    2024年02月12日
    浏览(60)
  • 第64步 深度学习图像识别:多分类建模误判病例分析(Pytorch)

    一、写在前面 上期我们基于TensorFlow环境介绍了多分类建模的误判病例分析。 本期以健康组、肺结核组、COVID-19组、细菌性(病毒性)肺炎组为数据集,基于Pytorch环境,构建SqueezeNet多分类模型,分析误判病例,因为它建模速度快。 同样,基于GPT-4辅助编程。 二、误判病例分

    2024年02月10日
    浏览(45)
  • 深度学习06-pytorch从入门到精通

    PyTorch是一个基于Python的开源机器学习框架,由Facebook的人工智能研究团队开发并维护。它提供了丰富的工具和接口,用于构建和训练深度神经网络模型。 PyTorch的主要特点和优势包括: 动态图:PyTorch使用动态图机制,即在运行时构建计算图。这使得模型的构建和调试更加直观

    2024年02月12日
    浏览(45)
  • 第54步 深度学习图像识别:MLP-Mixer建模(Pytorch)

    一、写在前面 (1)MLP-Mixer MLP-Mixer(Multilayer Perceptron Mixer)是Google在2021年提出的 一种 新型的 视觉模型结构 。它的主要特点是 完全使用 多层感知机(MLP)来处理图像, 而不是使用常见的卷积(Convolution)或者自注意力(Self-Attention)机制。 MLP-Mixer的结构主要包括两种类型的

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包