【深度学习】VGG16网络结构复现 | pytorch |


前言

这篇文章按道理来说应该是很简单的,但是因为一个很小的bug,让我难受了一晚上,直到现在我也没找出原因。后面我会提到这个bug。
今天这篇文章主要用来手动搭建vgg16这个网路,以前都是直接调用的。VGG16网络是非常重要,尤其是后面U-net这种网络,是基于VGG-16

一、VGG16介绍

VGG16论文地址:https://arxiv.org/pdf/1409.1556.pdf
在这里插入图片描述
主要介绍(翻译一下摘要吧):
本文研究了在大规模图像识别环境中,卷积网络深度对卷积网络精度的影响。我们的主要贡献是使用一个非常小(3 × 3)卷积滤波器的架构对增加深度的网络进行彻底的评估,这表明通过将深度推到16-19个权重层,可以实现对现有技术配置的显著改进。这些发现是我们的 ImageNet 挑战2014提交的基础,我们的团队在本地化和分类轨道上分别获得了第一和第二名。我们还表明,我们的表示很好地推广到其他数据集,在那里他们实现了最先进的结果。我们已经公开了我们的两个性能最好的 ConverNet 模型,以促进深度视觉表示在计算机视觉中的应用的进一步研究。

在这里插入图片描述
这些网络结构中,D用的最多,今天我们也重点对D进行复现。

二、VGG16网络复现——pytorch

import torch.nn as nn
import torch
class VGG16(nn.Module):
    def __init__(self):
        super(VGG16,self).__init__()
        self.conv1=nn.Sequential(
            nn.Conv2d(3,64,3,1,1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.Conv2d(64,64,3,1,1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2,2)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(64, 128, 3, 1, 1),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, 3, 1, 1),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2)
        )
        self.conv3 = nn.Sequential(
            nn.Conv2d(128, 256, 3, 1, 1),
            nn.BatchNorm2d(256),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, 3, 1, 1),
            nn.BatchNorm2d(256),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, 3, 1, 1),
            nn.BatchNorm2d(256),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2)
        )
        self.conv4 = nn.Sequential(
            nn.Conv2d(256, 512, 3, 1, 1),
            nn.BatchNorm2d(512),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, 3, 1, 1),
            nn.BatchNorm2d(512),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, 3, 1, 1),
            nn.BatchNorm2d(512),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2)
        )
        self.conv5 = nn.Sequential(
            nn.Conv2d(512, 512, 3, 1, 1),
            nn.BatchNorm2d(512),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, 3, 1, 1),
            nn.BatchNorm2d(512),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, 3, 1, 1),
            nn.BatchNorm2d(512),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2)
        )
        self.feature=nn.Sequential(
            self.conv1,
            self.conv2,
            self.conv3,
            self.conv4,
            self.conv5
        )
        self.fc=nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, 1000)
        )
    def forward(self,x):
        x=self.feature(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x
vgg = VGG16()
print(vgg)
x=torch.rand(1,3,224,224)
y=vgg(x)
print(y.shape)

最后rand随机生成一个张量进行测试:x=torch.rand(1,3,224,224)一个3通道的224X224图

打印的网络结果图如下:(中间省略一部分)
在这里插入图片描述
在这里插入图片描述

最后输出的y的shape为:
在这里插入图片描述
符合预期结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
<h3>回答1:</h3><br/>VGG16是一种深度卷积神经网络,由Oxford大学的研究团队开发。它的网络结构非常简单,由16层卷积层和3层全连接层组成。其中,卷积层使用3x3的卷积核,步长为1,padding为1,池化层使用2x2的最大池化。VGG16的输入为224x224的RGB图像,输出为100个类别的概率分布。在训练过程中,VGG16使用了dropout和数据增强等技术,以避免过拟合。在PyTorch中,可以使用torchvision.models.vgg16()函数来构建VGG16网络。 <h3>回答2:</h3><br/>VGG16是一个经典的卷积神经网络模型,在ImageNet数据集上取得了很好的表现。它的名称来源于它的设计者——牛津大学视觉几何组(Visual Geometry Group,简称VGG),以及它的层数16层(13层卷积层和3层全连接层)。 VGG16网络结构包含13层卷积层和3层全连接层,其中使用了小尺寸卷积核(3x3)和池化操作(2x2)来提取图像的特征,同时使用了ReLU激活函数增强非线性能力。具体来说,它的网络结构如下: 输入层:该层接收原始图像并进行预处理,包括进行裁剪、缩放和归一化操作。 卷积层1-2:这两层使用64个卷积核,步长为1个像素,padding为1个像素,采用ReLU激活函数。输出特征图的尺寸为224x224x64。 池化层1:使用2x2的池化核,步长为2个像素,进行下采样操作,输出特征图的尺寸为112x112x64。 卷积层3-4:这两层使用128个卷积核,步长为1个像素,padding为1个像素,采用ReLU激活函数。输出特征图的尺寸为112x112x128。 池化层2:使用2x2的池化核,步长为2个像素,进行下采样操作,输出特征图的尺寸为56x56x128。 卷积层5-7:这三层使用256个卷积核,步长为1个像素,padding为1个像素,采用ReLU激活函数。输出特征图的尺寸为56x56x256。 池化层3:使用2x2的池化核,步长为2个像素,进行下采样操作,输出特征图的尺寸为28x28x256。 卷积层8-10:这三层使用512个卷积核,步长为1个像素,padding为1个像素,采用ReLU激活函数。输出特征图的尺寸为28x28x512。 池化层4:使用2x2的池化核,步长为2个像素,进行下采样操作,输出特征图的尺寸为14x14x512。 卷积层11-13:这三层使用512个卷积核,步长为1个像素,padding为1个像素,采用ReLU激活函数。输出特征图的尺寸为14x14x512。 池化层5:使用2x2的池化核,步长为2个像素,进行下采样操作,输出特征图的尺寸为7x7x512。 全连接层1-3:这三层分别包含4096个神经元,其中第1、2层使用ReLU激活函数,并使用dropout方法来防止过拟合。 输出层:该层包含1000个神经元,对应ImageNet数据集的1000个类别,采用softmax函数进行分类。 VGG16网络结构的优点是简单易懂,且适用于许多计算机视觉任务。在实际应用中,我们可以使用预训练的VGG16模型对图像进行分类、目标检测等处理,也可以针对具体任务对VGG16网络结构进行微调。在使用pytorch训练VGG16模型时,我们可以使用torch.nn模块中的Conv2d、MaxPool2d、Linear等函数建立网络层,并采用CrossEntropyLoss等函数计算损失。 <h3>回答3:</h3><br/>VGG16是一种经典的深度卷积神经网络模型,在计算机视觉中应用广泛。它是由牛津大学的Simonyan与Zisserman于2014年提出的,是当时ImageNet图像分类任务的冠军,其模型结构简单、易于理解,因此被广泛使用。本文将详细介绍VGG16网络结构PyTorch中的实现。 1. VGG16网络结构 VGG16网络包含16个卷积层,由多个卷积层和池化层组成,以及两个全连接层。网络模型的输入为3通道彩色图像,大小为224x224。每个卷积层旁边都跟着一个ReLU激活函数,它的作用是激活输出值。 具体的结构如下: 1) 输入层:224x224x3的三通道彩色图像; 2) Conv3-64:3x3的卷积核,64个过滤器,stride=1,padding=1,输出尺寸为224x224x64; 3) Conv3-64:3x3的卷积核,64个过滤器,stride=1,padding=1,输出尺寸为224x224x64; 4) MaxPool2x2:2x2池化核,步长为2,输出尺寸为112x112x64。 重复6次,共7个卷积层和池化层: 5) Conv3-128:3x3的卷积核,128个过滤器,stride=1,padding=1,输出尺寸为112x112x128; 6) Conv3-128:3x3的卷积核,128个过滤器,stride=1,padding=1,输出尺寸为112x112x128; 7) MaxPool2x2:2x2池化核,步长为2,输出尺寸为56x56x128。 8) Conv3-256:3x3的卷积核,256个过滤器,stride=1,padding=1,输出尺寸为56x56x256; 9) Conv3-256:3x3的卷积核,256个过滤器,stride=1,padding=1,输出尺寸为56x56x256; 10) Conv3-256:3x3的卷积核,256个过滤器,stride=1,padding=1,输出尺寸为56x56x256; 11) MaxPool2x2:2x2池化核,步长为2,输出尺寸为28x28x256。 12) Conv3-512:3x3的卷积核,512个过滤器,stride=1,padding=1,输出尺寸为28x28x512; 13) Conv3-512:3x3的卷积核,512个过滤器,stride=1,padding=1,输出尺寸为28x28x512; 14) Conv3-512:3x3的卷积核,512个过滤器,stride=1,padding=1,输出尺寸为28x28x512; 15) MaxPool2x2:2x2池化核,步长为2,输出尺寸为14x14x512。 16) Conv3-512:3x3的卷积核,512个过滤器,stride=1,padding=1,输出尺寸为14x14x512; 17) Conv3-512:3x3的卷积核,512个过滤器,stride=1,padding=1,输出尺寸为14x14x512; 18) Conv3-512:3x3的卷积核,512个过滤器,stride=1,padding=1,输出尺寸为14x14x512; 19) MaxPool2x2:2x2池化核,步长为2,输出尺寸为7x7x512。 20) Flatten:将7x7x512的特征图展平成25088的向量; 21) FC-4096:全连接层,输入为25088,输出为4096; 22) FC-4096:全连接层,输入为4096,输出为4096; 23) FC-1000:全连接层,输入为4096,输出为1000个值(对应ImageNet数据集上的1000个类别)。 2. VGG16网络结构PyTorch中的实现 在PyTorch中,可以使用torchvision.models模块中的VGG16函数来使用该模型。使用时需要注意,该模型默认使用ImageNet数据集训练,如果需要使用自己的数据集,需要自己进行适当修改。 具体实现代码如下: 首先,导入PyTorch和torchvision模块: import torch import torchvision.models as models 然后,加载预训练的VGG16模型: vgg16 = models.vgg16(pretrained=True) 预测图像时,需要将图像转换为模型所需的格式: transform = transforms.Compose([ transforms.Resize(224), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) 使用transform将输入图像转换后,就可以使用模型进行预测: img = Image.open('test.jpg') img_tensor = transform(img) img_tensor = img_tensor.unsqueeze(0) output = vgg16(img_tensor) predicted_class = torch.argmax(output, dim=1) 以上代码中,将test.jpg图像加载进来,使用transform将图像转换后,将其作为模型的输入,在模型中进行预测,最终输出该图像所属的类别。 总结 本文详细介绍了VGG16网络模型的结构以及在PyTorch中的实现方法。VGG16网络模型基于卷积层和池化层构建,具有较高的识别精度,特别适用于图像分类任务。在使用PyTorch进行实现时,除了加载模型以外,还需对数据进行必要的预处理,包括缩放、裁剪、归一化等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天一定要洛必达

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值