图像分类篇——使用pytorch搭建VGG网络


本文为学习记录和备忘录,对代码进行了详细注释,以供学习。
内容来源:
★github: https://github.com/WZMIAOMIAO/deep-learning-for-image-processing

★b站:https://space.bilibili.com/18161609/channel/index

★CSDN:https://blog.csdn.net/qq_37541097


1. VGG网络详解

1.1 VGG网络概述

VGG网络在2014年由牛津大学著名研究组VGG(Visual Geometry Group)提出。
论文全称:Very Deep Convolutional Networks For Large-scale Image Recognition.

论文链接:Very Deep Convolutional Networks for Large-Scale Image Recognition

论文的亮点是:通过堆叠多个3×3的卷积核来替代大尺度卷积核,即减少所需参数。具体来讲,可以通过堆叠2个3×3的卷积核替代5×5的卷积核,堆叠3个3×3的卷积核替代7×7的卷积核,两者之间拥有相同的感受野。

VGG网络是一个Deep CNN,具备CNN所有的功能,常用来提取特征图像。在Localization和Classification tasks都取得了很大的成就。

1.2 感受野

(1)感受野的含义

在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。通俗的解释是,输出feature map上的一个单元对应输入层上的区域大小。

(2)感受野的计算

计算公式:
F(i) = [F(i+1)-1]×Stride + Ksize
其中F(i)为第i层感受野,Stride为第i层的步距,Ksize为卷积核或池化核尺寸(默认Stride=1)。
下面举一个例子说明:
感受野
Feature map: F = 1;
Pool1: F = (1 - 1) x 2 + 2 = 2;
Conv1: F = (2 - 1) x 2 + 3 = 5;
即第3层1*1区域对应第2层上感受野为2x2,对应第1层上的感受野为5x5。

(3)总结

上面提到,VGG网络中,通过堆叠2个3x3的卷积核替代5x5的卷积核,堆叠3个3x3的卷积核替代7x7的卷积核。依据如下:
感受野计算公式F(i)=[F(i+1)-1]×Stride + Ksize,其中步长Stride=1,卷积核大小Ksize=3,则:
Feature map: F = 1
Conv3x3(3): F = (1 - 1) x 1 + 3 = 3
Conv3x3(2): F = (3 - 1) x 1 + 3 = 5
Conv3x3(1): F = (5 - 1) x 1 + 3 = 7
这样做的目的是减少所需参数,依据如下(假设输入输出channel为C):使用77的卷积核所需参数为7x7xCxC = 49C²,使用3个33卷积核3x(3x3xCxC) = 27C²。(此处第一个C表示输入特征矩阵深度,第二个C表示卷积核个数即输出矩阵深度)

1.3 VGG网络结构和详细参数

作者在文中给出了6个版本:
VGG网络详细参数
最常用的是版本D,即VGG16(16指卷积层和全连接层共16层),其网络结构如下图所示:
VGG16网络结构

  • 对于Conv3:kernel_size=3;stride=1;padding=1
  • 对于maxpool:size=2;stride=2

O U T s i z e = ( I N s i z e − F s i z e + 2 P ) / S + 1. OUTsize= (INsize-Fsize+2P)/S+1. OUTsize=(INsizeFsize+2P)/S+1.


2. Pytorch搭建

对于代码的解释都在注释中,方便对照查看学习。

2.1 model.py

可将VGG网络分为 提取特征网络结构(FC层之前) 和 分类网络结构(3个FC层)两个部分。
导入模块:

import torch.nn as nn
import torch

首先定义模型配置文件,在这里只搭建A、B、D、E四个版本的VGG网络模型。定义一个配置模型文件:cfgs字典。其中key代表模型,value代表具体配置,value中数字64表示卷积层中3×3卷积核的个数为64,M表示Maxpool,每一项表示一层操作。

cfgs = {
   
    'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}

有了配置文件,下一步则需要构建提取特征网络结构,定义函数make_feature,其传入的变量为配置文件的列表。

def make_features(cfg:
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值