1 数据集说明
本研究使用的数据集包含10个不同犬种的图像集合。数据来源kaggle(犬种图像数据集 (kaggle.com))。数据集目录结构如下:
dataset/
:根目录,包含每个犬种的所有子目录。Golden_Retriever/
:包含100张金毛猎犬的图片。German_Shepherd/
:包含100张德国牧羊犬的图片。Labrador_Retriever/
:包含100张拉布拉多猎犬的图片。Bulldog/
:包含100张斗牛犬的图片。Beagle/
:包含100张比格犬图片。Poodle/
:包含100张贵宾犬图片。Rottweiler/
:包含100张罗威纳犬的图片。Yorkshire_Terrier/
:包含100张约克夏梗的图片。Boxer/
:包含100张拳师犬的图片。Dachshund/
:包含100张腊肠犬的图片。
每个子目录中包含100张JPG格式的图像文件。这些图像文件以犬种名称命名,例如:Golden_Retriever_1.jpg
, German_Shepherd_1.jpg
等。这些数据集为训练和评估不同深度学习模型提供了丰富的样本,通过这些图像,模型能够学习和识别不同犬种的特征,从而实现准确的分类。
2 CNN模型构建训练
2.1 CNN模型设计
卷积神经网络(CNN)是一种深度学习模型,广泛应用于图像识别任务。我们设计的CNN模型包括以下几个部分:
- 卷积层(Conv Layer):提取图像的局部特征。我们使用两个卷积层,每个卷积层后接一个ReLU激活函数。
- 池化层(Pooling Layer):通过最大池化操作减少特征图的维度,提高模型的计算效率。
- 全连接层(Fully Connected Layer):将提取的特征映射到最终的分类结果上。我们使用两个全连接层,第一个全连接层连接池化层的输出,第二个全连接层连接第一个全连接层的输出并输出分类结果。
import torch.nn as nn
import torch.optim as optim
from torchvision import models
# 定义CNN模型
class SimpleCNN(nn.Module):
def __init__(self, num_classes):
super(SimpleCNN, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 16 * 16, 1024),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(1024, num_classes)
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
2.2 模型训练
模型训练参数:
- 优化器:Adam优化器,学习率为0.001。
- 损失函数:交叉熵损失函数,用于多分类任务。</