VGG论文复现,pytorch代码

VERY DEEP CONVOLUTIONAL NETWORKS(VGG)


虽然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。AlexNet网络包含5个卷积层,3个全连接层,只是定义了层,而在V`GG中,首次提出通过使用循环和子程序,将神经网络的卷积、全连接等层堆叠成块进行使用。

VGG改进

小卷积核

在ALexNet中,作者使用了 11 × 11 11 \times11 11×11 5 × 5 5 \times5 5×5的卷积核来提取图像的特征,但大卷积核计算量大,并不能详细提取出图像的语义信息。在VGG网络中,作者使用了成组出现的小卷积核,如下图所示,使用了两个 3 × 3 3 \times 3 3×3的卷积核代替了一个 5 × 5 5 \times 5 5×5的卷积,来提取图像的语义信息。

在这里插入图片描述

参数量

使用一组小卷积核来替代大卷积核可以明显减少参数量,避免模型出现过拟合的现象。

两个 3 × 3 3\times3 3×3的卷积核与一个 5 × 5 5\times5 5×5卷积核的参数量对比,如下式所示,可以看出小卷积核组的参数明显比大卷积核参数小!
3 × 3 : 3 × 3 × 3 × 96 × 2 = 5184 5 × 5 : 5 × 5 × 3 × 96 = 7220 3 \times3: 3\times3\times3\times96\times2=5184\\ 5 \times5: 5\times5\times3\times96=7220 3×3:3×3×3×96×2=51845×5:5×5×3×96=7220

结果

VGG网络在ILSVRC-2012 数据集上取的了下图的效果,表格中第一列代表VGG的模型规模。

在这里插入图片描述

下图为VGG网络与其他网络的对比,可以看出使用VGG网络可以超过其他方法。

在这里插入图片描述

模型结构

VGG块

经典卷积神经网络的基本组成部分是下面的这个序列:

  1. 带填充以保持分辨率的卷积层;
  2. 非线性激活函数,如ReLU;
  3. 池化层,如最大池化层。

而一个VGG块与之类似,由一系列卷积层组成,后面再加上用于空间下采样的最大池化层。在最初的VGG论文中,作者使用了带有 3 × 3 3 × 3 3×3卷积核、填充为1(保持高度和宽度)的卷积层,和带有 2 × 2 2 × 2 2×2池化窗口、步幅为2(每个块后的分辨率减半)的最大池化层。这样做的意义是,一方面可以减少参数,另一方面相当于进行了更多的非线性映射,可以增加网络的拟合/表达能力。

import torch
from torch import nn
def vgg_block(num_convs, in_channels, out_channels): # 卷积层的数量num_convs、输入通道的数量in_channels和输出通道的数量out_channels
    layers = []
    for _ in range(num_convs):
        layers.append(nn.Conv2d(in_channels, out_channels,
                                kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
    layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
    return nn.Sequential(*layers)

如下图所示,最左边为AlexNet网络,包含5个卷积和3个全连接。中间则为VGG块,每个块包含1个卷积层、1个池化层和1个激活函数层。最右边就是一个VGG网络,包含多个VGG块,

在这里插入图片描述

网络结构

在所有的VGG网络中,VGG16和VGG19最为常见,在此文档中,如果没有特殊说明,均以VGG16网络进行讲解。VGG16包含13个卷积层,13个卷积层分成了5个VGG块,3个全连接层。

在这里插入图片描述

流程

在这里插入图片描述

假设输入的图像尺寸为 X = [ 16 , 3 , 224 , 224 ] X=[16,3,224,224] X=[16,3,224,224],其中16为batch size,3为通道数,224为图像的宽和高。

第一个卷积块:图像经过两个卷积核为 3 × 3 3\times3 3×3,步长为1,padding=1的卷积层,图像的尺寸变成了 X = [ 16 , 64 , 224 , 224 ] X=[16,64,224,224] X=[16,64,224,224]

在第一个卷积块结束后,经过一个最大化池化层,滤波器为2x2,步长为2,图像的尺寸变成了 X = [ 16 , 64 , 112 , 112 ] X=[16,64,112,112] X=[16,64,112,112]

第二个卷积块:图像经过两个卷积核为 3 × 3 3\times3 3×3,步长为1,padding=1的卷积层,图像的尺寸变成了 X = [ 16 , 128 , 112 , 112 ] X=[16,128,112,112] X=[16,128,112,112]

在第二个卷积块结束后,经过一个最大化池化层,滤波器为2x2,步长为2,图像的尺寸变成了 X = [ 16 , 128 , 56 , 56 ] X=[16,128,56,56] X=[16,128,56,56]

第三个卷积块:图像经过三个卷积核为 3 × 3 3\times3 3×3,步长为1,padding=1的卷积层,图像的尺寸变成了 X = [ 16 , 256 , 56 , 56 ] X=[16,256,56,56] X=[16,256,56,56]

在第三个卷积块结束后,经过一个最大化池化层,滤波器为2x2,步长为2,图像的尺寸变成了 X = [ 16 , 256 , 28 , 28 ] X=[16,256,28,28] X=[16,256,28,28]

第四个卷积块:图像经过三个卷积核为 3 × 3 3\times3 3×3,步长为1,padding=1的卷积层,图像的尺寸变成了 X = [ 16 , 512 , 28 , 28 ] X=[16,512,28,28] X=[16,512,28,28]

在第四个卷积块结束后,经过一个最大化池化层,滤波器为2x2,步长为2,图像的尺寸变成了 X = [ 16 , 512 , 14 , 14 ] X=[16,512,14,14] X=[16,512,14,14]

第五个卷积块:图像经过三个卷积核为 3 × 3 3\times3 3×3,步长为1,padding=1的卷积层,图像的尺寸变成了 X = [ 16 , 512 , 14 , 14 ] X=[16,512,14,14] X=[16,512,14,14]

在第五个卷积块结束后,经过一个最大化池化层,滤波器为2x2,步长为2,图像的尺寸变成了 X = [ 16 , 512 , 7 , 7 ] X=[16,512,7,7] X=[16,512,7,7]

然后Flatten(),将数据拉平成向量,变成一维 512 × 7 × 7 = 25088 512\times7\times7=25088 512×7×7=25088

再经过两层1x1x4096,一层1x1x1000的全连接层(共三层),经ReLU激活

最后通过softmax输出1000个预测结果

代码

https://github.com/Li2Silence/

参考文献

Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.
eep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.

<think>好的,我现在需要处理用户关于FCN论文复现的请求。用户之前已经问过相关问题,现在需要更具体的复现代码实现方法。首先,我应该回顾之前的对话,确保信息连贯。 用户提到了几个引用,其中引用[1]提到了通过论文链接找到Community Code,进入paperwithcode网站,有两个FCN的链接,需要选择红框内的那个,也就是Pytorch实现的最高星项目。引用[2]和[3]是关于复现过程的博客和教程,可能包含步骤指导和环境配置。 用户当前的问题是询问如何查找FCN论文复现代码或实现方法。我需要综合之前的引用内容,给出具体的步骤。首先,可能需要指导用户访问paperwithcode网站,找到正确的代码库。然后推荐高星项目,比如pochih的FCN实现,并说明其优势,如结构清晰、依赖少等。 另外,引用[3]提到的博客提供了详细的复现步骤,包括数据集准备、代码结构、训练和测试流程,这些都需要整理成步骤说明。同时,用户可能需要环境配置的帮助,比如使用AutoDL平台,这部分在引用[3]的博客中有涉及,应该提及。 还要注意用户可能遇到的常见问题,比如依赖安装、数据集路径设置、预训练模型的使用等,需要给出解决方案。最后,生成相关问题,帮助用户深入理解,比如优化方法、不同框架实现对比等。 需要确保回答结构清晰,分步骤说明,并且引用正确来源。同时,检查是否遗漏了用户可能需要的其他信息,比如代码测试的具体命令,或者如何可视化结果。保持回答简洁,但覆盖主要步骤和资源,让用户能够顺利复现FCN模型。</think>关于FCN(全卷积网络)论文复现方法和代码实现,以下是分步骤的解决方案: ### 一、代码获取与框架选择 1. **官方推荐实现**:在paperwithcode网站中,推荐使用pytorch框架的$pochih/FCN-pytorch$项目[^1],该实现具有以下特点: - 代码结构清晰(仅需3个核心文件) - 依赖库少(仅需pytorch + torchvision) - 支持Cityscapes/VOC2012数据集 ```python # 克隆仓库 git clone https://github.com/pochih/FCN-pytorch.git ``` 2. **数据集准备**: - **Cityscapes数据集**:需注册下载`gtFine_trainvaltest.zip`和`leftImg8bit_trainvaltest.zip`[^1] - **VOC2012数据集**:包含原始图片和语义分割标注 $$ \text{数据集目录结构:}\begin{cases} \text{JPEGImages/}\\ \text{SegmentationClass/}\\ \text{ImageSets/Segmentation/} \end{cases} $$ ### 二、核心实现要点 1. **网络结构**: ```python class FCN8s(nn.Module): def __init__(self, num_classes): super().__init__() # 骨干网络使用VGG16的卷积部分 self.features = vgg16(pretrained=True).features # 全卷积层设计 self.conv6 = nn.Conv2d(512, 4096, kernel_size=1) self.conv7 = nn.Conv2d(4096, 4096, kernel_size=1) self.upscore2 = nn.ConvTranspose2d(4096, 512, 4, stride=2, bias=False) # 跳跃连接结构... ``` 2. **关键技术创新**: - 反卷积层实现上采样:$ \text{conv2d\_transpose}(kernel=64, stride=32) $ - 跳跃连接融合特征:$\text{pool3} \oplus \text{pool4} \oplus \text{conv7}$ - 像素级分类损失函数: $$ \mathcal{L} = -\frac{1}{N}\sum_{i=1}^N \sum_{h,w} y^{(i)}_{h,w}\log(\hat{y}^{(i)}_{h,w}) $$ ### 三、训练与验证 1. **参数设置**: ```python optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5) ``` 2. **训练命令示例**: ```bash python train.py --dataset cityscapes --batch-size 8 --epochs 50 ``` 3. **效果验证**: - 在VOC2012验证集上可达到62.1% mIoU - 可视化输出示例: $$ \text{输入} \rightarrow \text{特征图} \rightarrow \text{上采样} \rightarrow \text{语义分割图} $$ ### 四、常见问题解决 1. **依赖问题**:需安装特定版本库 ```bash pip install torch==1.7.1 torchvision==0.8.2 ``` 2. **显存不足**:减小`batch_size`(建议≥4) 3. **数据集路径**:修改`dataloader.py`中的`data_path`参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值