vgg16总共有16层,13个卷积层和3个全连接层,第一次经过64个卷积核的两次卷积后,采用一次pooling,第二次经过两次128个卷积核卷积后,再采用pooling,再重复两次三个512个卷积核卷积后,再pooling,最后经过三次全连接。附上,官方的vgg16网络结构图:
首先需要看懂上图中的一些式子含义,如conv3-64,conv3-125
此处引用大佬的一张图片来说明:
上图,非常清晰地展示了每经过一次卷积或pooling后,所需要占用的内存,以及需要传送的权重值个数。
什么是卷积?最直观的解释,直接上图(引用网上最火的图片)
image为需要进行卷积的图片,而convolved feature为卷积后得到的特征图;那么什么是卷积的过滤器也就是filter呢?图中黄色矩阵即为filter,image为5X5大小的一维图像,filter为3X3大小的一维矩阵;卷积过程是:filter与image对应位置相乘再相加之和,得到此时中心位置的值,填入第一行第一列,然后在移动一个格子(stride=1),继续与下一个位置卷积…最后得到是3X3X1的矩阵。
——这里需要注明:卷积后的结果矩阵维度=(image矩阵维数-filter矩阵维数+2xpad)/2+1,对应上图即宽width:3=(5-3+2x0)/1+1,高height:3=(5-3+2x0)/1+1;
如果还不懂,请接着看下图(为博主自己手写的卷积过程图)
在这里补充经过padding填充,那么卷积后图片大小不会发生改变,如5X5的图像大小,padding=1变成7X7,再用3X3的filter进行卷积,那么卷积后的宽高为(7-3+2x1)/1+1=7。
什么是maxpool?最大池化就是取filter对应区域内最大像素值替代该像素点值,其作用是降维。在这里,池化使用的滤波器都是2*2大小,因此池化后得到的图像大小为原来的1/2。下图为最大池化过程:
介绍完基本概念之后,就开始进入到理解VGG16的网络模型了
由于224不太好计算,那么这里使用input图片大小为300x300x3举例:
图片:
首先两个黄色的是卷积层,是VGG16网络结构十六层当中的第一层(Conv1_1)和第二层(Conv1_2),合称为Conv1。
那么,第一层怎么将300x300x3的矩阵变成一个300x300x64的呢??
假设RGB图像为蓝色框,橙色方块为3x3x3的卷积核(即filter),那么卷积后得到的图像应为298x298x1(此处没有进行padding,步长为1),但是经过填充一圈的矩阵,所以得到的结果为300x300x1,在这层中有64个卷积核,那么原来的300x300x1就变成了300x300x64。
在上面的结构图可以看到,第一层卷积后要经过pooling,才到第二层,那么:
这层,pooling使用的filter是2x2x64,且步长为2,那么得到的矩阵维数刚好为原来的一半,第三个维度64不改变,因为那个指的是filter个数。
我们从上面的过程中知道了,input为300x300x3的图片,经过第一层之后变成150x150x64,那么第二层里面有128个卷积核,可以推出经过第二层后得到是75x75x128。
可知,第三层有256个卷积核,那么得到就是75x75x256
这里75是奇数,经过pad之后变成偶数76,那么就得到结果为38x38x256
其余的过程与上述一样,最终得到10x10x512。
在全连接层中的每一个节点都与上一层每个节点连接,把前一层的输出特征都综合起来。在VGG16中,第一个全连接层FC1有4096个节点,上一层pool之后得到是10x10x512=51200个节点,同样第二个全连接层FC2也有4096个节点,最后一个FC3有1000个节点。
上述对VGG16进行了初步深入的理解,还有很多知识点没写,不足之处请多多原谅。