基于pytorch框架实现手写图片的分类(代码片段)

记录机器学习,深度学习的小菜鸡 记录机器学习,深度学习的小菜鸡     2023-03-08     382

关键词:

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

基于pytorch框架实现手写图片的分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客
🍦 参考文章:Pytorch实战 | 第P4周:猴痘病识别
🍖 原作者:K同学啊|接辅导、项目定制

1,device

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import torchvision

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

device

简介: torchvision包是服务于pytorch深度学习框架的,用来生成图片,视频数据集,和一些流行的模型类和预训练模型.
torchvision由以下四个部分组成:

torchvision.datasets : Data loaders for popular vision datasets
torchvision.models : Definitions for popular model architectures, such as AlexNet, VGG, and ResNet and pre-trained models.
torchvision.transforms : Common image transformations such as random crop, rotations etc.
torchvision.utils : Useful stuff such as saving tensor (3 x H x W) as image to disk, given a mini-batch creating a grid of images, etc.
 

2.读入数据

代码如下(示例):

'''torchvision.datasets.MNIST('root',
                               train=True训练集, 
                               transform=torchvision.transforms.ToTensor(), # Change the data type to tensor 
                               download=True,训练集,false测试集)'''
train_ds = torchvision.datasets.MNIST('data',
                                      train=True,
                                      transform=torchvision.transforms.ToTensor(), # Change the data type to tensor
                                      download=True)
test_ds  = torchvision.datasets.MNIST('data',
                                      train=False,
                                      transform=torchvision.transforms.ToTensor(), # Change the data type to tensor
                                      download=True)
batch_size = 32
'''torch.utils.data.DataLoader(dataset,
                                       batch_size每批取样数量
                                       shuffle=True是否洗牌)'''
train_dl = torch.utils.data.DataLoader(train_ds,
                                       batch_size=batch_size,
                                       shuffle=True)
test_dl = torch.utils.data.DataLoader(test_ds,
                                      batch_size=batch_size)

imgs, labels = next(iter(train_dl))
print(imgs.shape)

torch.Size([32, 1, 28, 28]) — [batch_size, channel, height, weight]
iter() 函数

用来生成迭代器。
以下是 iter() 方法的语法:

iter(object[, sentinel])
参数
object -- 支持迭代的集合对象。
sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。

数据可视化

import numpy as np
plt.figure(figsize=(20, 5))
for i, imgs in enumerate(imgs[:20]):
    # squeeze the dimention
    npimg = np.squeeze(imgs.numpy())
    # plot the images
    plt.subplot(2, 10, i+1)
    plt.imshow(npimg, cmap=plt.cm.binary)
    plt.axis("off")


3,构建cnn模型

import torch.nn.functional as F

num_classes = 10


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        # Feature Extraction Network
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3)  # (input_channel, output_channel, kernel_size)
        self.pool1 = nn.MaxPool2d(2)  # Max Pooling Layer
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
        self.pool2 = nn.MaxPool2d(2)

        # Classification Network
        self.fc1 = nn.Linear(1600, 64)
        self.fc2 = nn.Linear(64, num_classes)

    def forward(self, x):
        x = self.pool1(F.relu(self.conv1(x)))
        x = self.pool2(F.relu(self.conv2(x)))

        x = torch.flatten(x, start_dim=1)

        x = F.relu(self.fc1(x))
        x = self.fc2(x)

        return x

我们首先通过继承nn.Module定义我们的CNN Class,然后在__init__里创建CNN的每个layer。神经网络所有运算通过forward函数实现。这个CNN例子中一共是两个2维卷积层和两个全连接线性层,通过一些激活函数(activation function)做连接,最后输出softmax分类结果。

这里笔者是把所有神经网络层放在___init___中,所有的激活函数都放在了forward里。当然也可以通过nn.Sequential()将这些激活函数和神经网络层一并按顺序放在__init__里。

torch.nn.Conv2d(in_channels, out_channels, kernel_size,
                stride=1, padding=0, dilation=1, groups=1,
                bias=True, padding_mode='zeros')

in_channels (int):输入图像通道数

out_channels (int):卷积产生的通道数

kernel_size (int or tuple):卷积核尺寸

stride (int, optional):卷积步长,默认为 1

加载打印模型

from torchinfo import summary
model = Model().to(device)
summary(model)
model = Model().to(device)将模型转移到GPU中,在gpu中运行

4,训练模型

4.1,设置超参数

loss_fn = nn.CrossEntropyLoss()设置损失函数

4.2,优化器 http://t.csdn.cn/fLZVElr表示学习率;momentum表示冲量因子;weight_decay表示权重衰减系数(将使用L2正则项);nesterov表示使用Nesterov冲量;


# Loss function
loss_fn = nn.CrossEntropyLoss()
learn_rate = 1e-2
# optimizer
opt = torch.optim.SGD(model.parameters(), lr=learn_rate)


def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)  # 60000
    num_batches = len(dataloader)  # 60000 / 32 = 1875

    train_loss, train_acc = 0, 0
    for X, y in dataloader:
        X, y = X.to(device), y.to(device)

        # calculate the prediction error
        pred = model(X)  # output of the Network
        loss = loss_fn(pred, y)  # calculate the Loss based on the loss function

        # Backword
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # Record the acc and loss
        train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()
        train_loss += loss.item()

    train_acc /= size
    train_loss /= num_batches

    return train_acc, train_loss


def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)  # 10000
    num_batches = len(dataloader)  # 10000 / 32 = 313

    test_loss, test_acc = 0, 0
    # Stop the gradient calculation
    with torch.no_grad():
        for imgs, target in dataloader:
            imgs, target = imgs.to(device), target.to(device)

            # Loss
            pred = model(imgs)
            loss = loss_fn(pred, target)

            test_loss += loss.item()
            test_acc += (pred.argmax(1) == target).type(torch.float).sum().item()

    test_acc /= size
    test_loss /= num_batches

    return test_acc, test_loss


epochs = 5
train_loss = []
train_acc = []
test_loss = []
test_acc = []

for epoch in range(epochs):
    model.train()
    epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt)

    model.eval()
    epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)

    train_acc.append(epoch_train_acc)
    train_loss.append(epoch_train_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)

    template = ('Epoch::2d, Train_acc::.1f%, Train_loss::.3f, Test_acc::.1f%,Test_loss::.3f')
    print(template.format(epoch + 1, epoch_train_acc * 100, epoch_train_loss, epoch_test_acc * 100, epoch_test_loss))
print('Done')

5,结果评价

总结

以上就是今天要讲的内容,本文仅仅简单介绍了pytorch框架的使用

嘿~全流程带你基于pytorch手撸图片分类“框架“--huclassify(代码片段)

文章目录前言使用项目结构训练过程准备数据集与配置进入训练训练显示使用模型编码实现配置文件读取配置文件HU数据集解析器其他使用模型LeNet训练实现识别使用实现总结前言鸽了两天,从星期二晚上就开始说要发布这篇... 查看详情

ai常用框架和工具丨13.pytorch实现基于cnn的手写数字识别

代码实例,PyTorch实现基于CNN的手写数字识别,希望对您有所帮助。文章目录环境说明一、模型训练1.1导入相关依赖1.2选择使用的硬件1.3超参数配置1.4准备训练集和测试集1.5模型创建1.6模型评估指标1.7模型训练1.8模型测试1.9模型... 查看详情

ai常用框架和工具丨13.pytorch实现基于cnn的手写数字识别

代码实例,PyTorch实现基于CNN的手写数字识别,希望对您有所帮助。文章目录环境说明一、模型训练1.1导入相关依赖1.2选择使用的硬件1.3超参数配置1.4准备训练集和测试集1.5模型创建1.6模型评估指标1.7模型训练1.8模型测试1.9模型... 查看详情

ai常用框架和工具丨13.pytorch实现基于cnn的手写数字识别

代码实例,PyTorch实现基于CNN的手写数字识别,希望对您有所帮助。文章目录环境说明一、模型训练1.1导入相关依赖1.2选择使用的硬件1.3超参数配置1.4准备训练集和测试集1.5模型创建1.6模型评估指标1.7模型训练1.8模型测试1.9模型... 查看详情

pytorch实现基于charrnn的文本分类与生成(代码片段)

Pytorch实现基于CharRNN的文本分类与生成标签:deep-learningpytorchnlp1简介本篇主要介绍使用pytorch实现基于CharRNN来进行文本分类与内容生成所需要的相关知识,并最终给出完整的实现代码。2相关API的说明pytorch框架中每种网络... 查看详情

图像分类基于pytorch搭建lstm实现mnist手写数字体识别(单向lstm,附完整代码和数据集)(代码片段)

写在前面:首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。提起LSTM大家第一反应是在NLP的数据集上比较常见,不过在... 查看详情

图像分类猫狗分类实战—基于pytorch框架的迁移学习(resnet50模型实现分类实战)(代码片段)

...讲解的特别详细,适合零基础入门。一、前置准备1、pytorch环境搭建pytorch环境安装:StartLocally|PyTorch复制这个代码到pytorch到pycharm环境进行安装:2、数据集介绍在当前目录创建一个dataset文件夹,用来存放数据集。... 查看详情

pytorch深度学习实践_p9_多分类问题_pytorch手写实现数字辨识(代码片段)

pytorch手写实现数字辨识知识点补充view()在PyTorch中view函数作用为重构张量的维度,相当于numpy中的resize()的功能torch.nn.CrossEntropyLoss()求交叉熵,并且其中嵌套了log和softmax函数所以i神经网络最后一层不用再用softmax激活torch.m... 查看详情

pt之transformer:基于pytorch框架利用transformer算法针对imdb数据集实现情感分类的应用案例代码解析(代码片段)

PT之Transformer:基于PyTorch框架利用Transformer算法针对IMDB数据集实现情感分类的应用案例代码解析目录基于PyTorch框架利用Transformer算法针对IMDB数据集实现情感分类的应用案例思路设计(1)、数据准备(2)、数据预处理(3)、模型构建(... 查看详情

[pytorch系列-29]:神经网络基础-全连接浅层神经网络实现10分类手写数字识别(代码片段)

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/details/120607797目录前言深度学习模型框架第1章业务领域分析1.1 步骤1-1:... 查看详情

6.2pytorch图像的多分类--手写字体识别(代码片段)

欢迎订阅本专栏:《PyTorch深度学习实践》订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础... 查看详情

使用pytorch框架自己制作做数据集进行图像分类(代码片段)

第一章:Pytorch制作自己的数据集实现图像分类第一章:Pytorch框架制作自己的数据集实现图像分类第二章:Pytorch框架构建残差神经网络(ResNet)第三章:Pytorch框架构建DenseNet神经网络提示:本文代码,含有部... 查看详情

如何用pytorch实现一个分类器?(代码片段)

学习目标了解分类器的任务和数据样式掌握如何用Pytorch实现一个分类器分类器任务和数据介绍构造一个将不同图像进行分类的神经网络分类器,对输入的图片进行判别并完成分类.本案例采用CIFAR10数据集作为原始图片数据.CIFAR10数... 查看详情

基于pytorch平台实现对mnist数据集的分类分析(前馈神经网络softmax)基础版(代码片段)

基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)基础版文章目录基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)基础版前言一、基于“前馈神经网络”模型,分类分析... 查看详情

用pytorch实现多层感知机(mlp)(全连接神经网络fc)分类mnist手写数字体的识别(代码片段)

1.导入必备的包1importtorch2importnumpyasnp3fromtorchvision.datasetsimportmnist4fromtorchimportnn5fromtorch.autogradimportVariable6importmatplotlib.pyplotasplt7importtorch.nn.functionalasF8fromtorch.utils.da 查看详情

pytorch实现简单的分类器(代码片段)

作为目前越来越受欢迎的深度学习框架,pytorch基本上成了新人进入深度学习领域最常用的框架。相比于TensorFlow,pytorch更易学,更快上手,也可以更容易的实现自己想要的demo。今天的文章就从pytorch的基础开始,帮助大家实现成... 查看详情

pytorch实现基于charrnn的文本分类与生成(代码片段)

Pytorch实现基于CharRNN的文本分类与生成标签:deep-learningpytorchnlp1简介本篇主要介绍使用pytorch实现基于CharRNN来进行文本分类与内容生成所需要的相关知识,并最终给出完整的实现代码。2相关API的说明pytorch框架中每种网络... 查看详情

基于torchtext的pytorch文本分类(代码片段)

...量的预处理和大量的计算资源。在这篇文章中,我们使用PyTorch来进行多类文本分类,因为它有如下优点:PyTorch提供了一种强大的方法来实现复杂的模型体系结构和算法,其预处理量相对较少,计算资源(包括执行时 查看详情