VGGNet

Posted JeJe_33

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VGGNet相关的知识,希望对你有一定的参考价值。

1.概述

VGG网络在2014年的图像分类竞赛中获得第二名,验证了小卷积核对特征的强大的提取能力,并且把卷积层深度推到了16-19层,使用3*3卷积核

2.网络结构


2.1 模型架构
以vgg16为例,16即13个卷积层+3个全连接层,需要注意的是,vgg输入大小为固定的224*224的rgb图像,数据格式转化如下图

需要注意的是,作者在原文中特意提到bn层并不会增加准确性,反而会增加计算复杂度,因此不采用归一化

3.代码

import torch
import torch.nn as nn
import cv2

class Vgg16(nn.Module):
    def __init__(self,num_classes):
        super().__init__()
        self.l1=self._conv2(3,63)
        self.l2=self._conv2(64,128)
        self.l3=self._conv3(128,256)
        self.l4=self._conv3(256,512)
        self.l5=self._conv3(512,512)
        self.classifier=self._linear(7*7*512,num_classes)

    def forward(self,x):
        l1=self.l1(x)
        l2=self.l2(l1)
        l3=self.l3(l2)
        l4=self.l4(l3)
        l5=self.l5(l4)
        c=self.classifier(l5)
        y=nn.Softmax(-1)(c)
        return y

        
    
    def _conv2(self,in_channel,out_channel):
        return nn.Sequential(nn.Conv2d(in_channel,out_channel,3,1,1),
        nn.ReLU(),
        nn.Conv2d(out_channel,out_channel,3,1,1),
        nn.ReLU(),
        nn.MaxPool2d(2,2)
        )
    def _conv3(self,in_channel,out_channel):
        return nn.Sequential(nn.Conv2d(in_channel,out_channel,3,1,1),
        nn.ReLU(),
        nn.Conv2d(out_channel,out_channel,3,1,1),
        nn.ReLU(),
        nn.Conv2d(out_channel,out_channel,3,1,1),
        nn.ReLU(),
        nn.MaxPool2d(2,2))
    def _linear(self,in_length,out):
        return(nn.Linear(in_length,4096),
        nn.ReLU(),
        nn.Linear(4096,4096),
        nn.ReLU(),
        nn.Linear(4096,out))

以上是关于VGGNet的主要内容,如果未能解决你的问题,请参考以下文章

VggNet架构重现与解析

TensorFlow实战——CNN(VGGNet19)——图像风格转化

手撕 CNN 经典网络之 VGGNet(PyTorch实战篇)

手撕 CNN 经典网络之 VGGNet(PyTorch实战篇)

手撕 CNN 经典网络之 VGGNet(PyTorch实战篇)

Tensorflow 实现VGGNet