pytorch深度学习基础3

本章开始带大家了解ResNet

ResNet(残差网络)

ResNet,全称残差网络(Residual Network),是深度学习领域的一项重要突破,由微软研究院的研究者提出并在ImageNet图像分类比赛中取得显著成果。ResNet通过引入残差模块解决了随着网络深度增加导致的训练难度问题,即所谓的梯度消失梯度爆炸问题。以下是ResNet的核心概念和关键特点:

核心概念:残差学习

ResNet的核心思想是残差学习(Residual Learning),即学习输入数据与期望输出数据之间的残差,而不是直接学习输出数据。在ResNet中,每个层的作用是学习输入数据的残差,而不是直接产生输出。这种设计使得网络可以更容易地学习和优化深层网络中的特征。

关键特点:

  1. 残差模块:ResNet的基本构建单元是残差模块(Residual Block),如图1所示。每个残差模块包含两个3x3的卷积层和一个跨层的连接。跨层连接允许网络学习输入数据的直接映射,同时学习残差映射。

  2. 批量归一化:在每个残差模块中,ResNet使用了批量归一化(Batch Normalization)来加速训练过程并稳定网络的训练。

  3. 跳跃连接:为了解决梯度消失问题,ResNet在每个残差模块中使用了跳跃连接(Skip Connection),使得浅层的特征可以直接传递到深层,无需经过多次卷积操作。

  4. 深度可分离卷积:在某些版本的ResNet中,研究者使用了深度可分离卷积来进一步减少计算量和参数数量,提高模型的速度和效率。

应用和影响:

ResNet自提出以来,已被广泛应用于图像识别、物体检测、语义分割等多个领域,并在多个基准数据集上取得了领先的性能。它的成功推动了深度学习的快速发展,尤其是在非常深的网络结构中。许多后续的工作,如ResNeXt、DenseNet等都是在ResNet的基础上进行的改进和扩展。

结论:

ResNet作为深度学习领域的里程碑工作之一,通过引入残差学习框架成功解决了深度神经网络的训练难题。它的核心思想和架构设计至今仍对深度学习的研究和应用产生深远影响。

开始学习之前我们需要使用resnet101来实例化一个具有101层的卷积神经网络,现在我们创建一个网络实例,我们将传递一个参数,指示函数下载resnet101在ImageNet数据集上训练好的权重。

from torchvision import models
resnet = models.resnet101(pretrained=True)

运行完毕以后终端框出现一下界面代表正在下载权重,resnet101中含有4450万个参数,下载需要花一点时间下载完毕以后我们就可以打印返回模型的值

print(resnet)

在这里只截取一小段输出结果

我们首先要确定输入的图像,这里有个简单的办法可以把想要的图像进行展示出来

from PIL import Image
img = Image.open(path)
img.show()

代码中的path就是你存放照片的实际路径,这样一来该路径下的图片当运行代码时就,可以展现出来

 就像这样就大功告成了!

接下来,我们还需要对输入图像进行一个预处理操作,使其大小正确,使其值大致处于相同的数值范围,为此,TorchVision模块提供了转换操作,允许我们快速定义基本预处理函数的管道。

下面是定义函数的代码

# 定义基本预处理函数
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]
                                           )])

在这个实例当中,我们定义了一个预处理函数,将输入图像缩放到256*256个像素,围绕中心图像剪裁为224*224个像素,并将其转换为一个张量,对其RGB分量进行一个归一化处理,使其具有定义的均值和标准差。

下面我们就可以按照网络期望的方式对输入的张量进行重塑,剪裁和归一化处理。

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

准备完以上操作以后我们就可以运行我们的模型了!

在深度学习中,在新数据上运行训练过的模型的过程被称为推理,为了进行推理,我们需要将网络置于 eval 模式

resnet.eval()

现在eval设置好了,我们开始进行推理

out = resnet(batch_t)
print(out)

最后输出结果产生了1000个分数的向量,我们现在要找出得分最高的标签,要查看预测标签的列表,我们需要加载一个文本文件,按照训练中呈现给网络的顺序列出标签,然后我们从网络中产生最高得分的索引处挑选出标签。几乎所有用于图像识别的模型的输出形式都与我们即将使用的输出形式类似。

# 加载标签的文本文档
# 为ImageNet数据集类加载一个包含1k个标签的文件
with open("C:\\deep learning\\pytorch学习\\imagenet_classes.txt") as f:
    labels = [line.strip() for line in f.readlines()]
_,index = torch.max(out, 1)
percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
print(labels[index[0]],percentage[index[0]].item())
# 进行降序操作
_,indices = torch.sort(out,descending=True)
print([(labels[idx],percentage[idx].item()) for idx in indices[0][:5]])

以下是输出结果

 可以看到识别为苹果的概率也不高,才30%,导致此种原因可能是训练集中该类数据集较少

那我们不妨换个图片重新推理一下

 

 可以看到这次效果好多了,模型有96%的把握认为它是金毛,是不是很神奇

 像这种照片非常新颖,女主非常漂亮,训练集几乎不会出现,模型就容易出现严重的误识别。大家可以多换几张图片多尝试几下。

最后,总计一下,该网络成功与否在很大程度上取决于受试者是否在训练集中表现良好。如果我们提交一幅包含训练集之外的对象的图像,网络很可能会以相当高的可信度得出错误的答案。通过实验了解模型对未知数据的反应是很有用的。

加载模型的文本文件我放在百度网盘中,大家自行提取哈

通过百度网盘分享的文件:imagenet_classes.txt
链接:https://pan.baidu.com/s/13VD_KojXvh2QuEu1Ti_G3Q 
提取码:0618 
--来自百度网盘超级会员V1的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值