resnet50(ResNet50模型)

resnet50(ResNet50模型)大家好 今天和大家分享一些如何使用 Pytorch 搭建 ResNet50 卷积神经网络模型 并使用迁移学习的思想训练网络 完成鸟类图片的预测 ResNet 的原理 nbsp 和 TensorFlow2 nbsp 实现方式 可以看我之前的两篇博文 这里就不详细说明原理了 ResNet18 34 nbsp ResNet50 nbsp

大家好,我是讯享网,很高兴认识大家。



大家好,今天和大家分享一些如何使用 Pytorch 搭建 ResNet50 卷积神经网络模型,并使用迁移学习的思想训练网络,完成鸟类图片的预测。

ResNet 的原理 TensorFlow2 实现方式可以看我之前的两篇博文,这里就不详细说明原理了。

ResNet18、34: 

ResNet50: 


首先导入网络构建过程中所有需要用到的工具包,本小节的所有代码写在 ResNet.py 文件中

残差单元的结构如下图所示,一种是基本模块,即输入特征图的尺寸和输出特征层的尺寸相同,两个特征图可以直接叠加;一种是下采样模块,即主干部分对输入特征图使用 stride=2 的下采样卷积,使得输入特征图的尺寸变成原来的一半,那么残差边部分也需要对输入特征图进行下采样操作,使得输入特征图经过残差边处理后的 shape 能和主干部分处理后的特征图 shape 相同,从而能够将残差边输出和主干输出直接叠加。

ResNet50 推理Demo resnet50详解_深度学习
讯享网

以下图基本残差块为例,先对输入图像使用 1*1 卷积下降通道数,在低维空间下使用 3*3 卷积提取特征,然后再使用 1*1 卷积上升通道数,残差连接输入和输出,将叠加后的结果进过 relu 激活函数。

ResNet50 推理Demo resnet50详解_深度学习_02

代码如下:


我们已经成功构建完单个残差单元的类,而残差结构就是由多个残差单元堆叠而来的,ResnNet50 中有 4 组残差结构,每个残差结构分别堆叠了 3,4,6,3 个残差单元,如下图所示。

第一个残差结构中的第一个残差单元只需要调整输入特征图的通道数,不需要改变特征图的尺寸;而其他三个的残差结构的第一个残差单元不仅需要对输入特征图调整通道数,还要对输入特征图进行下采样操作

ResNet50 推理Demo resnet50详解_cnn_03

代码如下:


 [3,4,6,3] 代表四个残差结构中分别堆叠了多少个残差单元,include_top=True 代表包含网络的分类层,默认是1000个分类,即全连接层输出预测结果。网络结构如下图所示:

ResNet50 推理Demo resnet50详解_深度学习_04

网络的参数量和计算量如下:


首先我们需要将接下来所有用到的文件包,文件路径,先写好了方便统一管理。使用迁移学习的方法训练网络。


首先定义训练集和验证集的数据预处理函数。将输入图像的尺寸变成模型要求的 224*224 大小,然后再将像素值类型从 numpy 变成 tensor 类型,并归一化处理,像素值大小从 [0,255] 变换到 [0,1],再调整输入图像的维度,从 [h,w,c] 变成 [c,h,w];接着对图像的每个颜色通道做标准化处理使像素值满足以0.5为均值,0.5为方差的正态分布

预处理之后就构造训练集和验证集,指定 batch_size=32,代表训练时每个 step 训练32张图片


接下来查看一下数据集中构造的图片和标签是什么样的,这里要注意的是在预处理时已经对整个数据集做了归一化和以 0.5 为均值 0.5 为方差做的标准化这里需要做一次反标准化,img = img / 2 + 0.5,变会归一化之后的结果不然画出来的图太抽象了。

ResNet50 推理Demo resnet50详解_cnn_05

ResNet50 推理Demo resnet50详解_ResNet50 推理Demo_06

绘制前9张图片及其标签:

ResNet50 推理Demo resnet50详解_cnn_07


首先导入我们构建的 resnet50 网络模型,它默认有 1000 个分类,也就是网络的最后一个全连接层的输出结果和我们当前的任务不一样。

通过 torch.load() 将权重文件加载到内存中,再通过 net.load_state_dict() 将网络的每一层权重加载上来。此时的全连接层是1000分类,因此我们将它修改为4分类的,通过 net.fc.in_features 获取最后一个全连接层的输入通道数,然后再重写这个全连接层 net.fc = nn.Linear(in_channel, 4) 将其输出神经元个数改成4个


这里要注意的就是网络训练和测试的模式不一样,训练时 Dropout 层随机杀死神经元,BN层计算在 batch 维度上计算均值和方差验证时 Dropout 层不起作用,BN 层去整个训练集计算得到的均值和方差。通过 net.train() 和 net.eval()切换训练和验证模式

训练过程如下:


首先将工具包和文件路径先写好,便于统一管理


这里采用和验证集相同的预处理方法,由于只预测一张图像,因此在送入网络之前需要给图像增加 batch 维度,[c,h,w]==>[b,c,h,w]

需要预测的图像及其标签

ResNet50 推理Demo resnet50详解_python_08


在网络前向传播之前将模型设置为验证模式 model.eval()只做前向传播的操作,不进行梯度更新操作 with torch.no_grad(): 不计算梯度。

经过前向传播后,图像的shape变成 [b,4],由于这里的 batch_size=1,因此将可以将batch维度挤压掉,得到由4个元素组成的向量,代表图片属于四个类别的分数。

预测结果如图:

ResNet50 推理Demo resnet50详解_cnn_09

小讯
上一篇 2025-04-18 08:04
下一篇 2025-05-15 18:23

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/182864.html