基于 PyTorch 实现 VGG-11 并在Cifar-10数据集上进行验证

介绍

VGGNet

VGG 论文地址:

Very Deep Convolutional Networks for Large-Scale Image Recognition

VGG 是一个很经典的卷积神经网络结构,是由 AlexNet 改进的,相比于 AlexNet,主要的改变有两个地方:

  • 使用 3 x 3 卷积核代替 AlexNet 中的大卷积核
  • 使用 2 x 2 池化核代替 AlexNet 的 3 x 3 池化核

VGGNet 有很多类型,论文中提出了 4 种不同层次的网络结构(从 11 层到 19 层):

在这里插入图片描述

这次实现的是 VGG-11,是最简单的,层数最少的 VGG。

特点

VGG 有很多优点,最本质的特点就是用小的卷积核(3x3)代替大的卷积核,2个 3x3 卷积堆叠等于1个 5x5 卷积,3 个 3x3 堆叠等于1个 7x7 卷积,感受野大小不变。

可以想象一下,在步长 s 为 1,填充 padding 为 0 时,2 个 3x3 卷积后的图像 size 为 (((N-3)/1+1)-3)/1+1 = ((N-3+1)-3+1) = N-4 = (N-5)/1+1。且做卷积后,得到的特征,都是从原图像上相同的像素点提取的(原图像每 5x5 的空域像素点对应一个新的特征),因此感受野大小不变。故 2 个 3x3 的卷积核与 5x5 的卷积核等价。

关于感受野的理解,可以参考这篇文章: Receptive field(感受野)

相同的效果,采用小的卷积核,可以增加网络的深度,从而引入更多的非线性(激活函数)

本次实验要求

这次实验与上次一样,也是在 Cifar-10 数据集上进行验证。同样,因为 VGGNet 输入大小问题,网络参数稍微改了一下,以便传入 32x32 大小的图片。

实验要求如下:

  • VGG 要求实现 VGG-11(Conv部分按论文实现,Classifier直接一层全连接即可)

  • 基于VGG(实测速度更快,6s一个epoch,batch size为128时占用显存1274MB,CPU也只要6分钟)进行训练方式对比(LR对比三组及以上【此时选用任一种优化器】,优化器对比SGD与Adam【选用LR对比时的最佳LR】)

代码

代码也没啥特殊的,正常的网络结构,然后训练,测试。注释很全,这里还加入了一些对比实验。

值得注意的是,实验要求中,为了简化,将后三个全连接层合成了一个,据说有人证明,这并不影响性能,不过我并没有试验。

这次实验有两个网络,VGG-11 的代码是队友写的,征得队友同意,放我 github 上了,这里粘贴一下地址吧:

lab3 VGG-11

需要注意一点,实验中要求了自定义数据集,可以完全将我写的 Cifar10Dataset 改为 torchvision.datasets.CIFAR10

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 PyTorch 训练 VGG-16 进行十分类任务的代码: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.datasets as datasets import torchvision.transforms as transforms import torchvision.models as models # 定义模型 model = models.vgg16(pretrained=True) num_features = model.classifier[6].in_features features = list(model.classifier.children())[:-1] # Remove last layer features.extend([nn.Linear(num_features, 10)]) # Add our layer with 10 outputs model.classifier = nn.Sequential(*features) # Replace the model classifier # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 加载数据集进行数据增强 transform_train = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) transform_val = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4) val_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_val) val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4) # 训练模型 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) num_epochs = 10 for epoch in range(num_epochs): train_loss = 0.0 train_correct = 0.0 model.train() for images, labels in train_loader: images = images.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() train_loss += loss.item() * images.size(0) _, predicted = torch.max(outputs.data, 1) train_correct += (predicted == labels).sum().item() train_loss /= len(train_loader.dataset) train_accuracy = 100.0 * train_correct / len(train_loader.dataset) val_loss = 0.0 val_correct = 0.0 model.eval() with torch.no_grad(): for images, labels in val_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) loss = criterion(outputs, labels) val_loss += loss.item() * images.size(0) _, predicted = torch.max(outputs.data, 1) val_correct += (predicted == labels).sum().item() val_loss /= len(val_loader.dataset) val_accuracy = 100.0 * val_correct / len(val_loader.dataset) print("Epoch {}/{} - Train Loss: {:.4f}, Train Accuracy: {:.2f}%, Val Loss: {:.4f}, Val Accuracy: {:.2f}%" .format(epoch+1, num_epochs, train_loss, train_accuracy, val_loss, val_accuracy)) ``` 这个代码加载 CIFAR-10 数据集,使用 VGG-16 进行训练,每个 epoch 计算训练集和验证集的损失和准确率,并输出结果。你可以根据需要调整超参数和数据增强方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值