VGG 网络详解

1.网络概述

在网络深度与网络性能的关系上,牛津大学视觉几何团队提出了一种深层次且性能良好的网络模型,即VGG网络模型。VGG很好地继承了AlexNet的衣钵,同时拥有着鲜明的特点,即网络层次较深。
牛津大学视觉几何团队在ILSVRC 2014上提出了VGGNet。VGGNet的网络结构简单、规整且高效。VGGNet较为典型的网络结构主要有VGG16和VGG19,本节主要介绍VGG16,其网络结构如表5-1所示。
VGGNet对输入图像的默认大小是224×224×3。从表5-1中可以看出,VGG16指该网络结构含有参数的网络层一共16层,即13个卷积层和3个全连接层,不包括池化层和softmax激活函数层。VGG16的卷积核大小是固定的3×3,不同卷积层的卷积核个数不同。最大池化层的池化窗口大小为2×2,步长为2。最后是3个全连接层,神经元个数分别为4096个、4096个和1000个。其中,第3层全连接层有1000个神经元,负责分类输出,最后一层为soft-max输出层。
 

2.网络特点

1.引入卷积组的概念:卷积核池化

2.层组化规律很强,层次提高

3.网络结构

VGG 网络结构
ConvNet Configuration
 A A-LRN B C D E

11 weights

layers

11 weights

layers

13 weights

layers

16 weights

layers

16weights

layers

19weights

layers

Input(224*224 RGB image)
Conv3-64

Conv3-64

LRN

Conv3-64

Conv3-64

Conv3-64

Conv3-64

Conv3-64

Conv3-64

Conv3-64

Conv3-64

maxpool
Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

Conv3-128

maxpool

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

Conv3-256

maxpool

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

maxpool

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

Conv3-512

maxpool
FC-4096
FC-4096
FC-1000
softmax

VGGNet有两种结构,分别为16层(见表5-1)和19层。从图5-5中可以看出,在VGGNet结构中,所有卷积层的卷积核尺寸都只有(3,3)。VGGNet中连续使用3组(3,3)卷积核(滑动步长为1)是因为它和使用1个(7,7)卷积核产生的效果相同(图5-6以一维卷积为例,解释效果相同的原理)。然而更深的网络结构可以学习到更复杂的非线性关系,从而使模型的训练效果更好。该操作带来的另一个好处是减少参数数量,因为对于一个有C个卷积核的卷积层来说,原来的参数个数为7×7×C,而新的参数个数为3×(3×3×C)。

3.使用tensflow构建VGG19

from tensorflow import keras
import tensorflow as tf

class Vgg_block(keras.layers.Layer):
    def __init__(self,units,filters,**kwargs):
        super().__init__(**kwargs)
        self.main_layer = []
        for i in range(units):
            self.main_layer.append(keras.layers.Conv2D(filters=filters,kernel_size=(3,2),
                                                       padding="same",strides=(1,1),
                                                       activation="relu"))
        self.main_layer.append(keras.layers.MaxPool2D(pool_size=(2,2)))
    def call(self,inputs):
        Z = inputs
        for layer in self.main_layer:
            Z = layer(Z)
        return Z 

model = keras.models.Sequential()
model.add(keras.layers.Input(shape=(224,224,3)))
model.add(Vgg_block(2,64))
model.add(Vgg_block(2,128))
model.add(Vgg_block(4,256))
model.add(Vgg_block(4,512))
model.add(Vgg_block(4,512))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(4096,activation="relu"))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(4096,activation="relu"))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(1000,activation="softmax"))


 

你可能感兴趣的:(图像分类,计算机视觉,目标检测,tensorflow,分类,图像处理)