第四次作业:CNN实战
1.数据下载
2.数据预处理
完成数据下载之后,需要对数据进行一些预处理:
图片将被整理成 224 × 224 × 3 的大小,同时还将进行归一化处理。
设置VGG的格式
同时加载图像的数据。
将数据拆分为训练集和有效集;
顺便取一小部分数据用来做可视化。
在把这几张图片打印出来看看效果:
打印图片和对应结果:
input_try是5张244x244x3(RGB三通道)的小图片;
lable_try是这五张图片对应的标签,都是0,说明,这五张照片都是猫;
其中规定:标签为0是猫,1是狗。
3.创建VGG
接下来的dic_imagenet是各种动物的标签。
来源自下载的模型中会对数据有一个分类的总概率分布,有5000种分类,dic_imagenet适合最终的分类概率有关的一个数。
就如代码中print(dic_imagenet)所展示的,是各种动物的标签
接着
打印出结果,观测可知:
结果为5行(因为一共是5张图片嘛),1000列的数据,每一列在不同dic_imagenet 目标识别的结果。
结果非常奇葩,有负数,有正数。
为了好看(至少让数据看起来像一个概率),我们把结果输入到 Softmax 函数。
4.修改最后一层网络,冻结前面层的参数
首先说明为什么要这么做?
因为我们使用的模型是现成的、预训练好的模型,所以大部分的模型参数我们都不需要动,只需要动最后全连接层输出部分的参数就可以了(也就是修改最后一层网络)。
因此
需要把最后的 nn.Linear 层由1000类,替换为2类。
为了在训练中冻结前面层的参数,需要设置 required_grad=False。
这样,反向传播训练梯度时,前面层的权重就不会自动更新了。训练中,只会更新最后一层的参数。
5、训练全连接层
虽然VGG大部分层数参数不需要更改,但是毕竟最后输出还是要靠全连接层,最后一层的参数是发生变动的(相当于前面99%的网络都别人训练好的,我就训练最后的1%),所以我们还是需要训练、并测试全连接层。
6、测试整个模型
现在整个模型都训练好了,那就理所应当的跑一跑,测试而已。
现在输入的是Valid集,因为它自带标签,可以用来统计一些误差数据。
7.可视化输出结果
至此,完成VGG网络的搭建并分类应用。
8.数据下载
下载官方提供的数据并解压
9.数据处理
11.运行结果
csv文件中的数据如下:
结果提交