Caltech 256数据集是加利福尼亚理工学院收集整理的数据集该数据集选自Google Image数据集,并手工去除了不符合其类别的图片在该数据集中,图片被分为256类每个类别的图片超过80张。
本項目使用在PyTorch框架下搭建的神经网络来完成图片分类的任务由于网络输出的类别数量很大,简单的网络模型无法达到很好的分类效果因此,本项目使用了预训练的dense是net121模型并仅训练全连接层的参数。
3.加载预训练网络模型
首先从指定路径读取图像将图像大小更改为224*224,并将圖片范围从0-255改为0-1:
由于此数据集中有少量图片的色彩是单通道的而神经网络的输入需要为三个通道,因此将该通道的数据复制到三个通道上:
在上述步骤之后,对图片进行白化即让像素点的平均值为0,方差为1这样做是为了减小图片的范围,使得图片的特征更易于学習白化的过程如下所示:
dense是Net的网络结构如下图所示。在传统的CNN中每个卷积层只与其相邻的卷积层相连接,这就造成了位于网络浅层的參数在反向传播中获取的梯度非常小也就是梯度消失问题。
dense是Net设计了名为dense是 Block的特殊的网络结构在一个dense是 Block中,每个层的输入为前面所有層的输出这也正是dense是的含义。通过这种方法在反向传播中,网络浅层的参数可以从后面所有层中获得梯度在很大程度上减弱了梯度消失的问题。值得注意的是每个层只与同位于一个dense是 Block中的多个层有连接,而与dense是 Block外的层是没有连接的
3、加载预训练网络模型
torchvision是服务于PyTorch框架的,用于进行图片处理和生成一些主流模型的库使用该库可以方便的加载PyTorch的预训练模型。首先使用pip安装torchvision库:
创建dense是net121模型实例并加載预训练参数:
冻结所有模型参数,使其值在反向传播中不改变:
改变模型全连接层输出的个数为256:
此处不需要担心新建的全连接层参数會被冻结因为新建的层参数是默认获取梯度的。
下面是完整的训练过程:
# 若测试准确率高于当前最高准确率则保存模型本文主要讲解叻dense是Net的网络结构,以及在PyTorch框架下如何加载预训练模型并进行fine-tuning为了在数据集上获得更高的准确率,读者可尝试取消冻结参数的设置使得卷积层也参与训练。
获取相关项目代码 请访问: