CNN经典网络之VGG剖析

AlexNetVGG 》 Inception 》 ResNet 》 Inception-ResNet 》 ResNeXt 》 DenseNet 》DPN ( Dual Path Network )

牛津大学的研究人员于2014年提出了VGG模型,旨在提供比AlexNet更深的模型以提升图像分类精度。
牛津大学的研究人员发现采用3×3卷积核的卷积层已经能够很好地提取图像特征,所以他们大量的使用了卷积层,所以VGG的一大特征就是卷积层很多。

VGG16


Block-1:
卷积层
  input=(N,224,224,3)
    kernal_shape=(3,3,3)
    kernals=64个
    stride_shape=(1,1)
    padding=“SAME”
    激活函数=ReLu
  过程解释:
    1、因为padding=“SAME”,所以需要进行填充
    input_spatial_shape=[224,224]
    output_spatial_shape[0] = ceil(input_spatial_shape[0] / strides[0])=ceil(224/1)=224
    output_spatial_shape[1] = ceil(input_spatial_shape[1] / strides[1])=ceil(224/1)=224
    output_spatial_shape=(224,224)
    反推填充后的大小:
    padded_size[0]=output_spatial_shape[0]+kernal_size[0]-1=224+3-1=226
    padded_size[1]=output_spatial_shape[1]+kernal_size[1]-1=224+3-1=226
    padded_size=[226,226]
    也就是说:224+上面1行+下面1行=226,224+左面1列+右面1列=226
  output=(N,224,224,64)
卷积层
  input=(N,224,224,64)
    kernal_shape=(3,3,64)
    kernals=64个
    stride_shape=(1,1)
    padding=“SAME”
    激活函数=ReLu
  output=(N,224,224,64)
MaxPooling层:
  input=(N,224,224,64)
    pool_shape=(2,2),
    stride=(1,1),
    padding=‘VALID’
  output=(N,112,112,64)

Block-2:
卷积层 X2
  input=(N,112,112,64)
    kernal_shape=(3,3,64)
    kernals=128个
    stride_shape=(1,1)
    padding=“SAME”
    激活函数=ReLu
  output=(N,112,112,128)
MaxPooling层:
  input=(N,112,112,128)
    pool_shape=(2,2),
    stride=(1,1),
    padding=‘VALID’
  output=(N,56,56,128)
Block-3:
卷积操作 X3
  input=(N,56,56,128)
    kernal_shape=(3,3,128)
    kernals=256个
    stride_shape=(1,1)
    padding=“SAME”
    激活函数=ReLu
  output=(N,56,56,256)
MaxPooling层:
  input=(N,56,56,256)
    pool_shape=(2,2),
    stride=(1,1),
    padding=‘VALID’
  output=(N,28,28,256)
Block-4:
卷积层 X3
  input=(N,28,28,256)
    kernal_shape=(3,3,256)
    kernals=512个
    stride_shape=(1,1)
    padding=“SAME”
    激活函数=ReLu
  output=(N,28,28,512)
MaxPooling层:
  input=(N,28,28,512)
    pool_shape=(2,2),
    stride=(1,1),
    padding=‘VALID’
  output=(N,14,14,512)
Block-5:
卷积层 X3
  input=(N,14,14,512)
    kernal_shape=(3,3,512)
    kernals=512个
    stride_shape=(1,1)
    padding=“SAME”
    激活函数=ReLu
  output=(N,14,14,512)
MaxPooling层:
  input=(N,14,14,512)
    pool_shape=(2,2),
    stride=(1,1),
    padding=‘VALID’
  output=(N,7,7,512)
Block-6:
全连接层
    进行flat操作input=(N,25088)
    kernal_shape=(25088,) # 即权重
    kernals=4096个,
    stride=(1,1),
    padding=“VALID”,
    激活函数=ReLu
  output=(N,4096)
Dropout层:
  input=(N,4096)
  output=(N,4096)
Block-7:
全连接层
    input=(N,4096)
    kernal_shape=(4096,) # 即权重
    kernals=4096个,
    stride=(1,1),
    padding=“VALID”,
    激活函数=ReLu
  output=(N,4096)
Dropout层:
  input=(N,4096)
  output=(N,4096)
Block-8:
全连接层
    input=(N,4096)
    kernal_shape=(4096,) # 即权重
    kernals=1000个,
    stride=(1,1),
    padding=“VALID”,
    激活函数=softmax
  output=(N,1000)

总结:可以看到VGG16并没有什么骚操作,其创新就是连续使用多个相同的卷积层,以及最后连续3个全连接层,这也使得其参数过大!

VGG19

可以看到VGG19并比VGG16有更多的卷积层,分别在第3、4、5层多增加了一层卷积!

VGG优点

  • VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)
  • 几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5或7x7)卷积层好
  • 验证了通过不断加深网络结构可以提升性能

VGG缺点

  • VGG耗费更多计算资源,并且使用了更多的参数,其中绝大多数的参数都是来自于第一个全连接层,VGG可是有3个全连接层啊,导致了更多的内存占用!

开源库:tensorflow-vgg

VGG版本变化:

猜你喜欢

转载自blog.csdn.net/weixin_38052918/article/details/107726082
今日推荐