AlexNet 》 VGG 》 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版本变化: