一、环境准备
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大神点赞!!

1537

被折叠的 条评论
为什么被折叠?



