卷积神经网络实验二:CNN实现猫狗分类任务

前言

在上一篇文章《卷积神经网络实验一:多层感知机进行猫狗分类-CSDN博客》中,我们通过多层感知机进行猫狗分类实验,证明了多层感知机的结构限制了模型的性能上限。因此在这篇文章中我们进一步在原有多层感知机不变的结构上增加卷积层进行实验,测试增加卷积层的效果和作用。

实验环境继续使用FunHPC | 算力简单易用 AI乐趣丛生这个平台提供的免费P4显卡进行实验,感谢这个平台对于学生用户的支持。FunHPC算力平台显卡在全网中都较为便宜,并且学生用户认证可以使用这个平台免费提供的P4显卡,单次最长使用时间为24小时,没有总时间限制。

由于本次实验是在上篇文章的继续之上继续实验,因此存在大量重复内容,为了避免不必要的重复,本文只详细介绍修改的内容,其他没有写的内容请参考《卷积神经网络实验一:多层感知机进行猫狗分类-CSDN博客》这篇文章。

一、实验基础

1、运行环境:

2、数据来源:

https://www.microsoft.com/en-us/download/details.aspx?id=54765

3、数据介绍:

这个数据集包含了从Petfinder.com收集的大量猫和狗的图片,这些图片由美国各地的动物收容所的工作人员手动分类。

数据集的目的是用于图像识别任务,特别是用于训练机器学习模型来区分猫和狗的图片。这个数据集常用于图像分类、物体识别和深度学习领域的研究和竞赛。

数据集的特点包括:

  • 大规模:数据集包含超过三万张图片。
  • 高质量:图片由人工分类,确保了数据的准确性。
  • 多样性:图片包括不同品种、不同年龄和不同姿态的猫和狗。
  • 研究价值:数据集不仅用于竞赛,也用于学术研究。

二、模型修改

相对多层感知机,我们在模型设计上增加了两个卷积层。

  • 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
  • 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = 50 * 35 * 35  # 根据卷积后的特征图大小来设置

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 2)

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))

        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

在特征传递的过程中:

  • 初始输入尺寸为 (3, 150, 150)
  • 经过 conv1 (5x5 卷积,步长 1,未使用 padding) 输出 (20, 146, 146)
  • 经过 max_pool2d (2x2 池化,步长 2) 输出 (20, 73, 73)
  • 经过 conv2 (4x4 卷积,步长 1) 输出 (50, 70, 70)
  • 经过 max_pool2d (2x2 池化,步长 2) 输出 (50, 35, 35)
  • 最终衔接多层感知机,此时特征输入的大小为 50 * 35 * 35

三、实验结果分析

同样,迭代五次之后,发现只有训练损失快速降低,但是测试损失在先降后增。

很显然,CNN也是出现了过拟合!!

通过混淆矩阵可以发现,虽然模型的效果没有预想的那么好,但还是可以看出,卷积神经网络模型相比多层感知机的性能提升了很多。在保证多层感知机的结构不变的情况下,增加卷积层的确更有利于特征的提取。 

  四、总结

在经历了两轮实验后,我们深入探讨了模型架构对性能的显著影响,并充分展示了卷积层在特征提取方面的强大能力。然而,为了确保实验结果的可比性,我们并未对模型结构进行优化。在模型训练过程中,我们面临了模型过拟合的挑战,这影响了模型的泛化能力。

为了进一步提升模型性能,我们计划采取一系列策略来优化模型结构,并改进训练过程。这将有助于模型更好地学习和泛化。

敬请期待我们即将发布的《卷积神经网络实验三:模型优化》,我们将在其中分享我们的发现和策略。

猜你喜欢

转载自blog.csdn.net/qq_28413709/article/details/143088624