0%

深度学习-2day

预训练神经网络

网络上有很多是已经经过数据集训练的微型ai,非常的有趣,我们可以把预先训练的神经网络看作是一个接受输入并生成输出的程序,该程序的行为是有神经网络的结构以及它在训练过程中所看到的例子决定的,即期望的输入-输出对,或者期望输出满足的特性,使用现成的模型是快速启动深度学习的一种方法,节省了很多的时间

一个识别图像主体的预训练网络

作为对深度学习的第一次尝试,一个非常先进的深度神经网络是非常有必要的,有许多预先训练过的网络都可以通过源代码库进行访问呢,我本次尝试的是一个在imagenet数据集上的子集训练过的,

具体来说,图像识别的任务包括获取一个输入图像,并从1000个类别中生成5个白哦前的列表,按可信度排序描述图像的内容

获取一个预先训练好的网络

我所使用的网络是从torchvision中获取的,该项目包含一些表现优异的,关于计算机视觉的神经网络架构,可以方便得访问数据集和其他工具,首先加载并运行两个网络,一个是AlexNet,它是在图像是被方面早期具有突破性得网络之一,然后是残差网络,简称ResNet

1
2
3
4
5
In[1]
from torchvision import models
我们可以看看有多少模型
print(dir(models))
# Out[2]: ['AlexNet', 'DenseNet', 'Inception3', 'ResNet', 'SqueezeNet', 'VGG', ... 'alexnet', 'densenet', 'densenet121', ... 'resnet', 'resnet101', 'resnet152', ... ]

AlexNet

按照现在得标准,这是一个相当小得网络,但它非常适合着眼于神经网络,在AlexNet架构中,输入图像从左侧进入并且依次进入5个过滤器,每一个过滤器生成一些输出图像,经过每个过滤器后,图像会被缩小,在过滤器堆栈中,最后一个过滤器产生得图像被排列成一个拥有4096个元素得一维向量,并被分类以产生1000个输出,每个输出对应一个类

我们可以创建一个AlexNet类得实例,

1
alexnet = models.AlexNet()

此时,alexnet是一个可运行得对象,可以像函数一样调用它

ResNet

现在创建一个网络实例,传递一个参数,指示函数下载resnet101在imagenet数据集上训练好得权重

1
resnet = models.resnet101(pretrained=True) 

准备运行

1
resnet

再输入图像之前,我们必须要对输入得图像进行预处理,使其大小正确,torchvision模块提供了转换得操作,允许我们快速定义基本预处理函数得管道

1
2
3
4
5
6
7
8
9
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]
)])

这个函数我解释一下,将输入得图像缩放到256x256个像素,围绕中心将图像裁剪为224x224个像素,并将其转化为一个张量,对其rgb分量进行归一化处理,使其具有定义得均值和标准差,张量是一种pytorch多维数组,然后我们就可以加载图像了

1
2
from PIL import Image 
img = Image.open("C:\\Users\\admin\\Pictures\\Camera Roll\\9C4F0A6EAC509071628AC3EF8D36CD8F.jpg")

通过管道传递图像

1
img_t = preprocess(img) 

然后我们可以按照网络期望得方式对输入得张量进行重塑

1
import torch batch_t = torch.unsqueeze(img_t, 0) 

现在可以运行模型了

运行模型

为了进行推理,需要将网络置于eval模式

1
resnet.eval()

准备进行推理

1
2
out = resnet(batch_t) 
out

最终产生一个有1000个分数得向量,要查看预测标签得列表,我们需要架子啊一个文本文件,挑选出标签,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 如果您想自动下载标签文件
import requests
import os

# 检查是否已经有标签文件
labels_path = "e:\\code\\.idea\\pytorch\\imagenet_classes.txt"
if not os.path.exists(labels_path):
# 从GitHub下载标签文件
url = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"
response = requests.get(url)
if response.status_code == 200:
with open(labels_path, 'wb') as f:
f.write(response.content)
print(f"标签文件已下载到 {labels_path}")
# 读取下载的标签文件
with open(labels_path) as f:
labels = [line.strip() for line in f.readlines()]
else:
print("无法下载标签文件,使用内置的部分标签")
else:
# 读取已有的标签文件
with open(labels_path) as f:
labels = [line.strip() for line in f.readlines()]

最后就直接输出结果

1
2
3
4
5
6
7
8
# 获取预测结果
_, indices = torch.sort(out, descending=True)
percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
print("预测的前5个类别:")
for idx in indices[0][:5]:
print(f"{labels[idx]}: {percentage[idx].item():.2f}%")
_, indices = torch.sort(out, descending=True)
[(labels[idx],percentage[idx].item()) for idx in indices[0][:5]]

输出结果如下

1
2
3
4
5
wig: 14.47%
stethoscope: 13.13%
kimono: 10.52%
hair slide: 10.51%
academic gown: 5.38%

识别结果如上,还是比较精准得吧

菜🐕初探神经网络