当前位置:   article > 正文

Pytorch使用VGG16模型进行预测猫狗二分类

Pytorch使用VGG16模型进行预测猫狗二分类

目录

1. VGG16

1.1 VGG16 介绍

1.1.1 VGG16 网络的整体结构

 1.2 Pytorch使用VGG16进行猫狗二分类实战

1.2.1 数据集准备

1.2.2 构建VGG网络

1.2.3 训练和评估模型


 

1. VGG16

1.1 VGG16 介绍

深度学习已经在计算机视觉领域取得了巨大的成功,特别是在图像分类任务中。VGG16是深度学习中经典的卷积神经网络(Convolutional Neural Network,CNN)之一,由牛津大学的Karen Simonyan和Andrew Zisserman在2014年提出。VGG16网络以其深度和简洁性而闻名,是图像分类中的重要里程碑。

VGG16是Visual Geometry Group的缩写,它的名字来源于提出该网络的实验室。VGG16的设计目标是通过增加网络深度来提高图像分类的性能,并展示了深度对于图像分类任务的重要性。VGG16的主要特点是将多个小尺寸的卷积核堆叠在一起,从而形成更深的网络。

1.1.1 VGG16 网络的整体结构

VGG16网络由多个卷积层和全连接层组成。它的整体结构相对简单,所有的卷积层都采用小尺寸的卷积核(通常为3x3),步幅为1,填充为1。每个卷积层后面都会跟着一个ReLU激活函数来引入非线性。

VGG16网络主要由三个部分组成:

  1. 输入层:接受图像输入,通常为224x224大小的彩色图像(RGB)。

  2. 卷积层:VGG16包含13个卷积层,其中包括五个卷积块。

  3. 全连接层:在卷积层后面是3个全连接层,用于最终的分类。

VGG16网络结构如下图:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDc5MTk2NA==,size_16,color_FFFFFF,t_70#pic_center

1、一张原始图片被resize到(224,224,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64),再2X2最大池化,输出net为(112,112,64)。
3、conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128),再2X2最大池化,输出net为(56,56,128)。
4、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256),再2X2最大池化,输出net为(28,28,256)。
5、conv4三次[3,3]卷积网络,输出的特征层为512,输出net为(28,28,512),再2X2最大池化,输出net为(14,14,512)。
6、conv5三次[3,3]卷积网络,输出的特征层为512,输出net为(14,14,512),再2X2最大池化,输出net为(7,7,512)。
7、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)。共进行两次。
8、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)。
最后输出的就是每个类的预测。

 1.2 Pytorch使用VGG16进行猫狗二分类实战

在这一部分,我们将使用PyTorch来实现VGG16网络,用于猫狗预测的二分类任务。我们将对VGG16的网络结构进行适当的修改,以适应我们的任务。

1.2.1 数据集准备

首先,我们需要准备用于猫狗二分类的数据集。数据集可以从Kaggle上下载,其中包含了大量的猫和狗的图片。在下载数据集后,我们需要将数据集划分为训练集和测试集。训练集文件夹命名为train,其中建立两个文件夹分别为cat和dog,每个文件夹里存放相应类别的图片。测试集命名为test,同理。

  1. import torch
  2. import torchvision
  3. import torchvision.transforms as transforms
  4. # 定义数据转换
  5. transform = transforms.Compose([
  6. transforms.Resize((224, 224)),
  7. transforms.ToTensor(),
  8. transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
  9. ])
  10. # 加载数据集
  11. train_dataset = ImageFolder("train", transform=transform)
  12. test_dataset = ImageFolder("test", transform=transform)
  13. train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
  14. test_loader = DataLoader(test_dataset, batch_size=batch_size)

1.2.2 构建VGG网络

  1. import torch.nn as nn
  2. class VGG16(nn.Module):
  3. def __init__(self):
  4. super(VGG16, self).__init__()
  5. self.features = nn.Sequential(
  6. # Block 1
  7. nn.Conv2d(3, 64, kernel_size=3, padding=1),
  8. nn.ReLU(inplace=True),
  9. nn.Conv2d(64, 64, kernel_size=3, padding=1),
  10. nn.ReLU(inplace=True),
  11. nn.MaxPool2d(kernel_size=2, stride=2),
  12. # Block 2
  13. nn.Conv2d(64, 128, kernel_size=3, padding=1),
  14. nn.ReLU(inplace=True),
  15. nn.Conv2d(128, 128, kernel_size=3, padding=1),
  16. nn.ReLU(inplace=True),
  17. nn.MaxPool2d(kernel_size=2, stride=2),
  18. # Block 3
  19. nn.Conv2d(128, 256, kernel_size=3, padding=1),
  20. nn.ReLU(inplace=True),
  21. nn.Conv2d(256, 256, kernel_size=3, padding=1),
  22. nn.ReLU(inplace=True),
  23. nn.Conv2d(256, 256, kernel_size=3, padding=1),
  24. nn.ReLU(inplace=True),
  25. nn.MaxPool2d(kernel_size=2, stride=2),
  26. # Block 4
  27. nn.Conv2d(256, 512, kernel_size=3, padding=1),
  28. nn.ReLU(inplace=True),
  29. nn.Conv2d(512, 512, kernel_size=3, padding=1),
  30. nn.ReLU(inplace=True),
  31. nn.Conv2d(512, 512, kernel_size=3, padding=1),
  32. nn.ReLU(inplace=True),
  33. nn.MaxPool2d(kernel_size=2, stride=2),
  34. # Block 5
  35. nn.Conv2d(512, 512, kernel_size=3, padding=1),
  36. nn.ReLU(inplace=True),
  37. nn.Conv2d(512, 512, kernel_size=3, padding=1),
  38. nn.ReLU(inplace=True),
  39. nn.Conv2d(512, 512, kernel_size=3, padding=1),
  40. nn.ReLU(inplace=True),
  41. nn.MaxPool2d(kernel_size=2, stride=2),
  42. )
  43. self.classifier = nn.Sequential(
  44. nn.Linear(512 * 7 * 7, 4096),
  45. nn.ReLU(inplace=True),
  46. nn.Dropout(),
  47. nn.Linear(4096, 4096),
  48. nn.ReLU(inplace=True),
  49. nn.Dropout(),
  50. nn.Linear(4096, 2) # 输出层,二分类任务
  51. )
  52. def forward(self, x):
  53. x = self.features(x)
  54. x = torch.flatten(x, 1) # 展开特征图
  55. x = self.classifier(x)
  56. return x
  57. # 初始化VGG16模型
  58. vgg16 = VGG16()

在上述代码中,我们定义了一个VGG16类,其中self.features部分包含了5个卷积块,self.classifier部分包含了3个全连接层。

1.2.3 训练和评估模型

  1. import torch.optim as optim
  2. # 定义超参数
  3. batch_size = 32
  4. learning_rate = 0.001
  5. num_epochs = 10
  6. model = VGG16()
  7. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  8. model.to(device)
  9. # 定义损失函数和优化器
  10. criterion = nn.CrossEntropyLoss()
  11. optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9)
  12. # 训练模型
  13. total_step = len(train_loader)
  14. for epoch in range(num_epochs):
  15. for i, (images, labels) in enumerate(train_loader):
  16. images = images.to(device)
  17. labels = labels.to(device)
  18. # 前向传播
  19. outputs = model(images)
  20. loss = criterion(outputs, labels)
  21. # 反向传播和优化
  22. optimizer.zero_grad()
  23. loss.backward()
  24. optimizer.step()
  25. if (i + 1) % 100 == 0:
  26. print(f"Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{total_step}], Loss: {loss.item()}")
  27. torch.save(model,'model/vgg16.pth')
  28. # 测试模型
  29. model.eval()
  30. with torch.no_grad():
  31. correct = 0
  32. total = 0
  33. for images, labels in test_loader:
  34. images = images.to(device)
  35. labels = labels.to(device)
  36. outputs = model(images)
  37. print(outputs)
  38. _, predicted = torch.max(outputs.data, 1)
  39. total += labels.size(0)
  40. correct += (predicted == labels).sum().item()
  41. print(f"Accuracy on test images: {(correct / total) * 100}%")

在训练模型时,我们使用交叉熵损失函数(CrossEntropyLoss)作为分类任务的损失函数,并采用随机梯度下降(SGD)作为优化器。同时,我们将模型移动到GPU(如果可用)来加速训练过程。

 

 


 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/957661
推荐阅读
相关标签
  

闽ICP备14008679号