Pytorch深度学习入门(1)-如何使用Pytorch跑一个神经网络

目录

  • 0. Intro
  • 1. 深度学习与Pytorch
    • 1.1 深度学习
    • 1.2 Pytorch
  • 2. 预训练模型
    • 2.1 运行环境
    • 2.2 加载预训练模型
    • 2.3 使用网络进行图片分类
  • 3. 总结
  • 写在后面的话

0. Intro

本文是Pytorch入门系列的第一篇文章。本文主要通过使用Pytorch当中的预训练模型完成一个深度学习任务,让大家对Pytorch的基本使用与一个最基础的了解,通过这样一个相对顶层的方式作为开始,让大家对Pytorch在深度学习中的使用有一个整体的概念。

1. 深度学习与Pytorch

1.1 深度学习

深度学习是当下人工智能研究领域十分火热的一个研究领域,从分类上来说,深度学习属于机器学习的范畴,但当我们谈及深度学习和机器学习的时候,我们通常认为机器学习更偏向于传统的一些通过人为设计特征提取算法等方式让我们的学习机对数据进行学习的方法,而深度学习则使用神经网络(CNN、RNN等)进行学习机的设计。

1.2 Pytorch

对于深度学习任务来说,目前大多数研究者倾向于使用Python进行深度学习算法的实现,其中,PytorchTensorflow这两个深度学习三方库最为广泛的被使用。由于深度学习的算法原理,其计算具有一定的特性,这两个三方库都以**张量(Tensor)**这一基本的数据结构为基础数据结构,为深度学习算法开发量身打造。Tensor在深度学习领域实际上就是一个多维数组。相比于Numpy等科学计算的三方库所能表示的多维数组或者说是张量不同的是,在Pytorch和TensorFlow当中,我们可以使用CUDA、通过GPU加速计算过程,使我们的模型训练时间被大幅减少。

本文作为Pytorch的入门系列,通过使用一个Pytorch中预训练完成的神经网络为大家展示Pytorch的最基本用法,大家可以通过本文的内容对Pytorch有一个最基本的了解,也可以将本文的内容作为学习Pytorch的开始。通过一个已经训练好的模型展示Pytorch的功能作为开始,相较于一些教程直接以“张量”为开头会更为直观,跑一个预训练模型可以为我们以后独立设计或是优化神经网络算法起到一个很好的引导作用。

2. 预训练模型

2.1 运行环境

在这里就不对最基本的Python环境安装等步骤进行介绍了,大家可以自行查阅其他博客完成环境的安装。

本文用到的基本环境需求如下:

python 3.xPytorchPIL

大家可以通过自己习惯的方式进行环境的配置。

在完成环境安装后我们可以在Python环境下输入以下语句进行检查:

import torch
print(torch.__version__)

输出:

2.0.1+cu118

代表torch环境正常。

同时,如果我们想要使用CUDA对计算进行加速,而不是使用CPU进行计算的话,我们还要检查我们的CUDA环境(如使用CPU进行运算此步骤可以省略):

torch.cuda.is_available()

输出

True

2.2 加载预训练模型

由于我们刚刚接触Pytorch,此时让我们从零复现一个神经网络对于目前阶段来说有些困难,我们通过使用Pytorch当中预训练的一些成熟的神经网络完成一个简单的图片分类任务。本文的例子通过使用ResNet101完成了一个简单的图片分类任务。

首先,我们可以查看Pytorch当中包含的预训练完成的模型:

from torchvision import models
dir(models)

此时你可以在输出中看到很多的预训练完成的模型,但其中包括不同规模的相同原理的模型,大家可以通过上述代码查看已有的预训练模型。

Pytorch官网给出的图片分类预训练模型如下:

  • AlexNet

  • VGG

  • ResNet

  • SqueezeNet

  • DenseNet

  • Inception v3

  • GoogLeNet

  • ShuffleNet v2

  • MobileNet v2

  • ResNeXt

  • Wide ResNet

  • MNASNet

在本文中,我们使用到的神经网络是ResNet101

我们加载一个预训练好的模型到我们的环境当中:

resnet = models.resnet101(pretrained = True)

此时我们输入resnet查看我们的网络的基本信息:

Pytorch深度学习入门(1)-如何使用Pytorch跑一个神经网络_第1张图片

由于输出的参数过多,实际上包含了整个ResNet101的网络结构,大家可以在后续的学习中结合深度学习的理论学习对这一部分进行研究,实际上,现有的很多网络模型都是基于ResNet网络进行优化或创建的。

2.3 使用网络进行图片分类

我们接下来使用ResNet对图片进行分类,在这里我们使用了我们在网上随便找的一张狗狗的图片进行图片分类任务,大家可以使用我的这张图片或者选用自己喜欢的图片进行分类。

我们先定义一个方法对我们选用的图片进行格式上的控制,保证我们输入网络的图片格式符合我们设计的网络结构,图片处理流程代码如下:

from torchvision import transforms
preprocess = transforms.Compose({
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(
        mean = [0.485, 0.456, 0.406],
        std = [0.229, 0.224, 0.225]
    )
    })

这里面使用的一些参数是参照Pytorch官网对于预训练模型的教程写出的,大家此时可以简单阅读以下代码的内容,大概清楚处理流程即可,在后续的学习中我们可以对为什么要这样做进一步学习。本质上这一步就是完成了图片到张量的转换并进行了标准化

而后我们导入我们选择的图片:

from PIL import Image
img = Image.open('#此处替换为图片路径#PATH##')
img

Pytorch深度学习入门(1)-如何使用Pytorch跑一个神经网络_第2张图片

完成图片的导入之后,我们对图片进行处理并转换为我们想要的维度的张量(大家对张量的概念可能还不了解,在这里可以理解成将图片转换成模型想要的输入形式):

img_t = preprocess(img)
batch_t = torch.unsqueeze(img_t, 0)

在此之后,我们就可以将我们想要测试的图片输入到我们的神经网络模型当中,此时,我们需要对我们的模型做eval()操作,这一步是为了保证我们在使用测试数据对模型的效果进行测试时,不对我们模型中现有的参数进行修改,所以使用eval()保证在BN层和Dropout环节权重不发生改变。

resnet.eval()

此时输出仍然为模型参数:

Pytorch深度学习入门(1)-如何使用Pytorch跑一个神经网络_第3张图片

到这里我们已经成功的将ResNet101预训练网络导入到我们的环境当中,我们只需将测试数据代入到模型当中,就可以得出图像分类的结果:

out = resnet(batch_t)
out

此时的输出结果为一个张量

tensor([[-3.1583e+00, -3.6543e-01, -2.6967e+00, -3.9172e+00, -4.2027e+00, -2.9735e+00, -3.8106e+00, 1.2684e-01, 1.4177e+00, -9.3114e-01, 4.0984e-02, -1.2259e+00, -1.7279e-01, -1.6105e+00, -1.9749e+00, 3.3905e-01, 8.3172e-01, 4.7644e-01, -1.6620e+00, 4.6040e-01,

-1.6453e+00, 2.9777e-01, 8.0516e-01, -1.2634e+00, -1.5568e+00, -5.7130e-01, 2.2096e+00, -1.3222e+00, 2.8537e+00, 3.1790e+00]],
grad_fn=)

我们从输出的张量中无法直接看出任何信息,但通过导入的类别对应的文本文件,并将输出的张量和对应的类别进行对应,输出图片分类的结果

with open('imagenet_classes.txt的路径') as f:
    labels = [line.strip() for line in f.readlines()]

此处的imagenet_classes文件可以通过点击链接获得。

将数据导入每个类别对应的标签,就可以将我们输出的张量和类别相对应,并根据匹配度(概率)判断该图像的分类

_, index = torch.max(out, 1)
percentage = torch.nn.functional.softmax(out, dim = 1)[0] * 100
labels[index[0]], percentage[index[0]].item()

将概率最高的值对应的类别同步输出,就是ResNet预测的该图片所属的类别:

out:
(‘Lhasa, Lhasa apso’, 41.92831039428711)

这里需要说明的是,因为我们的图片是在网上随便找到的一张图片,尺寸清晰度等均比较随机,可以看到最终预测的概率相对来说低一些,在一些比较经典的示例代码中这个分类的最高可能的概率往往能达到90+,说明在该神经网络当中他们选择测试的图片的分类和其他分类各异性较强。但即使如此,ResNet101还是正确的预测了该狗狗所属的种类为拉萨犬。

我们可以观察一下ResNet101在完成这个图像分类时排名概率前5的类别;

_, indices = torch.sort(out, descending = True)
[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

[(‘Lhasa, Lhasa apso’, 41.92831039428711),
(‘Tibetan terrier, chrysanthemum dog’, 28.859094619750977),
(‘toy poodle’, 9.613190650939941),
(‘miniature poodle’, 6.245307445526123),
(‘Shih-Tzu’, 4.7625837326049805)]

经过对以上几个分类的了解,这几种也都是和拉萨犬的一些特征有一些相似之处的犬类,所以才会出现预测为该类别的概率也相对较高的情况。如果我们选择的测试图片的类别的各异性更强的话就会有更明显的效果。当然,对于一个优秀的神经网络模型来说,面对什么样的数据都能输出预想的结果才是我们想要的好模型。

3. 总结

上文我们通过导入一个预训练完成的模型完成了一个简单的分类任务,对Pytorch在深度学习领域的使用方式进行了一个演示。对于初学者来说,我们可以通过这个过程对我们所要完成的工作进行一个大致的了解。在以后的学习中,我们需要结合我们学习到的深度学习理论的知识,对我们如何创建一个深度学习网络模型、需要什么样的数据训练网络、如何对网络进行训练、如何在现有的成熟模型的基础之上优化模型,使其效果更好或在我们所要应用的领域有更好的表现,这都是我们通过更加深入的学习要完成的目标。

写在后面的话

本文是Pytorch入门的第一篇文章,本文的部分代码参考了deep learning with Pytorch,大家也可以将这本书作为Pytorch的入门教程。如果大家在阅读本文时遇到了问题或者有关于文章的建议,可以通过评论或私信的方式和我进行讨论,后续也会继续完成Pytorch入门的其他文章,如果本文对您有帮助,欢迎点击收藏并关注作者,您的收藏和关注是作者的创作动力哦!

你可能感兴趣的:(深度学习,pytorch,神经网络,python)