迁移学习—基于猫狗数据集
一、数据预处理
- 数据准备:
- 创建一个新的目录cats_and_dogs_small,用于存储较小的数据集。
- 在cats_and_dogs_small目录下,创建三个子目录:train、validation和test,用于存储训练集、验证集和测试集的图像数据。
- 在train、validation和test目录下,分别创建了cats和dogs两个子目录,用于存储猫和狗的图像数据。
- 将原始数据集中的猫和狗的图像按照一定的比例分别复制到训练集、验证集和测试集的对应目录中。
具体的分配比例为:
- 训练集包含1000张猫的图像和1000张狗的图像。
- 验证集包含500张猫的图像和500张狗的图像。
- 测试集包含500张猫的图像和500张狗的图像。
二、数据处理
- 数据增强与归一化:
- 对于数据集图像,预处理步骤如下:
Resize: 将图像调整为指定的大小 (150, 150)。
RandomHorizontalFlip: 随机水平翻转图像,以增加数据集的多样性,帮助模型更好地泛化。
oTensor: 将图像转换为 PyTorch 的张量格式,这样可以在模型中进行处理。
Normalize: 对图像进行标准化,使用指定的均值和标准差(这通常是针对预训练模型的要求)。
- 加载数据集
使用 datasets.ImageFolder 加载训练集和验证集数据,这是PyTorch提供的用于加载文件夹结构数据集的工具。可以让每个类别的图像存储在不同的文件夹中。
三、选择网络模型
-
vgg16模型
对模型的最后一个全连接层进行了修改,以适应二分类任务(猫和狗)。在原始 VGG16 模型中,最后的全连接层输出的是 1000 个类别,因此您将其更改为输出 1 个类别(猫或狗)。
因为所使用的数据集较小,所以选择,冻结卷积层来防止模型过拟合。
- 冻结全部卷积层
基础模型: 使用预训练的 VGG16。
冻结层: 所有卷积层被冻结,避免更新。
修改分类器: 将最后的全连接层修改为输出单个神经元,适应二分类任务。
- 冻结一层
而让其他所有卷积层和全连接层可训练,选择冻结 VGG16 中的第五层卷积层
-
Resnet模型
- 解冻全部卷积层
解冻所有卷积层意味着在训练过程中,模型的卷积层权重将被更新。这与冻结卷积层形成对比,后者在训练过程中保持权重不变
- 解冻一层
解冻一层卷积层可以在保持一定泛化能力的同时,给予模型一定程度的灵活性来适应新数据集
四、模型评估
1、使用vgg16模型
1)冻结全部
损失:训练集的损失从0.1开始,随着训练周期的增加,损失逐渐下降,但下降速度逐渐减慢。验证集的损失从0.2开始,随着训练周期的增加,损失也有所下降,但在某些周期后开始上升 准确率:训练集的准确率从0.70开始,随着训练周期的增加,准确率逐渐上升,接近1.00。验证集的准确率从0.75开始,随着训练周期的增加,准确率也有所上升,但上升速度逐渐减慢,并且在某些周期后开始下降
2)冻结一层
与冻结全部相比,准确率略有所降低。
3、Resnet50模型
- 解冻一层
损失分析:损失值的范围从0到0.25,其中训练损失在周期结束时降至约0.05,而验证损失降至约0.10。 准确率分析: 准确率的范围从0.92到1.00,其中训练准确率在周期结束时接近1.00,而验证准确率略低于0.98。 模型在训练过程中损失在减少,准确率在提高,但训练准确率和验证准确率之间的差距表明模型可能存在过拟合的问题。
2)解冻全部
损失分析:损失值的范围从0到2.5,其中训练损失在周期结束时降至约0.15,而验证损失降至约0.20。
准确率分析:准确率的范围从0.92到1.00,其中训练准确率在周期结束时接近1.00,而验证准确率略低于0.99
训练损失和验证损失应该同步下降,训练准确率和验证准确率应该同步上升。这表明模型具有良好的泛化能力。