【深度学习】PyTorch框架入门指南,基于ResNet网络上手第一个AI模型

部署运行你感兴趣的模型镜像

一、环境准备

1.软硬件环境要求

预装有PyTorch,支持GPU的Jupyter Notebook

2.准备运行环境

2.1 Colab 在线Jupyter Notebook运行环境

Colab地址 https://colab.research.google.com/#

2.2 新建你的第一个Notebook,准备开启PyTorch之旅

二、上手第一个PyTorch模型

1.ResNet

1.1 引入TorchVision.models 预定义模型

from torchvision import models 
dir(models)

解读

  • dir(models) 命令用于列出 Python 中 models 模块或目录下的所有属性和方法。

  • 首字母大写,代表许多流行模型的Python类

  • 首字母小写,代表函数,返回类实例化后的模型

  • 同个模型实例支持不同参数集,

    • 如resnet101代表101层网络的ResNet实例

    • resnet18则代表18层网络

1.2 初始化resnet101模型,带上训练好的权重数据

resnet = models.resnet101(pretrained=True) 
resnet

解读

  • pretrained=Ture,表示模型已完成数据集的预训练

  • 该数据集包含120万幅图像,和1000个类别

  • ResNet101模型的组成结构

    • Bottleneck模块,总共101个,包含卷积和其他模块

1.3 导入图片,并预处理图片格式

from torchvision import transforms
from PIL import Image

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]
        )
    ]
)

img = Image.open("/content/bobby.jpg")


img_t = preprocess(img)    

import torch

batch_t = torch.unsqueeze(img_t, 0)    #图片张量归一化处理

解读

  • 导入图片img

  • 通过预处理管理,处理图像 preprocess(img)

  • 按照网络模型期望的方式,对图片的张量进行重塑、裁剪和归一化处理 torch.unsqueeze()

1.3.1 输出图片的Tensor

1.3.2 图片张量化数据
tensor([[[[-0.6281, -0.6452, -0.6623,  ...,  0.0056, -0.0287, -0.0629],
          [-0.7137, -0.6965, -0.6965,  ...,  0.0227,  0.0227,  0.0056],
          [-0.7137, -0.7137, -0.7137,  ...,  0.0398,  0.0741,  0.0569],
          ...,
          [ 1.4440,  1.4269,  1.4783,  ...,  0.6049,  0.6221,  0.6906],
          [ 1.4269,  1.4440,  1.4783,  ...,  0.6906,  0.6734,  0.7077],
          [ 1.4612,  1.4783,  1.5297,  ...,  0.6906,  0.7248,  0.7591]],

         [[-1.2829, -1.2829, -1.2829,  ..., -0.6352, -0.6702, -0.7052],
          [-1.2654, -1.2654, -1.2654,  ..., -0.6176, -0.6527, -0.7052],
          [-1.2479, -1.2479, -1.2654,  ..., -0.6176, -0.6001, -0.6527],
          ...,
          [ 0.7829,  0.8004,  0.8704,  ..., -0.2850, -0.2675, -0.2150],
          [ 0.7654,  0.8354,  0.9055,  ..., -0.2150, -0.2150, -0.1625],
          [ 0.8004,  0.8529,  0.9230,  ..., -0.1800, -0.1275, -0.0749]],

         [[-1.4907, -1.4559, -1.4210,  ..., -1.0376, -1.0898, -1.1421],
          [-1.5081, -1.4559, -1.4210,  ..., -1.0376, -1.0898, -1.1421],
          [-1.4907, -1.4733, -1.4559,  ..., -1.0376, -1.0550, -1.0898],
          ...,
          [-0.5321, -0.5147, -0.4624,  ..., -1.3687, -1.2816, -1.1596],
          [-0.5321, -0.4798, -0.4275,  ..., -1.2816, -1.2293, -1.1073],
          [-0.4624, -0.4101, -0.3578,  ..., -1.2467, -1.1421, -1.0550]]]])

1.4 运行模型

1.4.1 网络设置eval模式
resnet.eval()

解读

  • 在新数据上运行训练过的模型,这个过程叫推理(inference)

  • 为了进行推理,需将网络模型置为eval模式

1.4.2 用ResNet模型处理图片
out = resnet(batch_t)

out

解读

  • ResNet模型对进行预处理管道的图像,进行归一化处理

  • 涉及4450万个参数操作,最终产生一个拥有1000个分数的向量

1.5 模型输出预测结果

1.5.1 加载ImageNet数据集类1000个标签文件
with open('/content/imagenet_classes.txt') as f:
  labels = [line.strip() for line in f.readlines()]

labels

ImageNet 1000个标签索引

 https://zhuanlan.zhihu.com/p/522690833

1.5.2 输出out张量中最高分对应的索引
index = torch.max(out, 1)
index

解读

  • torch.max() ,获取张量中最高分对应的索引

1.5.3 输出模型最高置信度的预测
percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100

labels[index[0]], percentage[index[0]].item()

解读

  • torch.nn.functional.softmax(),将输出归一化到[0, 1],除以总和

  • 最高分预测,96%把握是金毛

('golden retriever', 96.57186889648438)

1.5.4 输出前五置信度的模型预测
_, indices = torch.sort(out, descending=True)
[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

解读

  • 使用torch.sort()函数,进行升序或降序排列

  • 返回置信度最高的5个预测

[('golden retriever', 96.57186889648438),
 ('Labrador retriever', 2.6082561016082764),
 ('cocker spaniel, English cocker spaniel, cocker', 0.26996272802352905),
 ('redbone', 0.17958852648735046),
 ('tennis ball', 0.10991960018873215)]

通过模型输出的预测结果,可以看出,模型有96%的把握,图片中是一只金毛,确实是对的。

三、小结

至此,我们便利用ResNet网络模型,完成一次图像分类,并输出准确的预测结果。

从测试结果来,最高分预测是,96%把握是金毛,看来这模型预测是挺准的~

ResNet模型背后的故事

ResNet网络模型,在2015年的ImageNet图像分类比赛中获胜,横扫当时各种榜单。

该模型使用的残差网络,是计算机视觉CV领域的最重要的技术突破之一,解决深度神经网络中梯度消失问题,即网络层数越多,模型预测效果可能越不准确,极大推动深度神经网络的发展。

ResNet残差网络技术,大大推动了模型训练与算法的发展,使得模型可以训练得更深,预测也更加精准,为AGI时代的到来按下加速键,为kaiming大神点赞!!

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值