1.首先看一下论文中一张表:
注解: (1)可以看到表中从左->右网络结构逐渐变得更深和复杂;层数从11->11->13->16->16->19; (2)所有的激活函数使用的都是ReLU函数; (3)层与层之间的间隔使用Max Pool(最大池化); (4)使用的卷积核大小都是3*3的卷积,通道数逐渐增加(因为宽和高在变小,所以通道数增加对特征的保留更好); (5)根据卷积层来设计其中子层的数量; (6)最后接的都是全连接层,神经元为4096->4096->1000,最后使用softmax函数输出1000类别概率;
VGG16之特征提取和网络参数的查看(偏置和权重): https://mydreamambitious.blog.csdn.net/article/details/123928764(其中包含了详细的网络结构)
2.VGG16网络结构解释:
以下两幅图都是VGG16结构: 图片来源: https://blog.csdn.net/xiaobumi123/article/details/105550967 https://blog.csdn.net/qq_37939213/article/details/90380639 注解: (1)VGG16包含16个层,其中第一个卷积层是由:2个conv3-64组成,后接一个maxpool层; (2)第二层由两个:conv3-128组成,后接一个maxpool层; (3)第三层由三个:conv3-256组成,后接一个maxpool层; (4)第四层由三个:conv3-512组成,后接一个maxpool层; (5)第五层由三个:conv3-512组成,后接一个maxpool层; (6)最后是三个全连接层:其中包含两个FC4096和一个FC1000(类别数)。 所以这就是VGG16名字的由来。
3.网络构成详解:
首先是输入层:2242443 (一)第一层:
注解: (1)首先输入图片大小为224x224x3(这个可以通过成剪裁实现);
img_path='images/train/dog/1.jpg'
#导入图片并将图像剪裁为299*299
img=image.load_img(img_path,target_size=(224,224))
(2)输入图片时候使用64个3x3(kernel_size)的卷积核大小进行卷积,得到的特征图大小为224x224x64。 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(224+21-3)/1+1=224.所以最后得到的特征图大小为224x224x64. 甚至我们的高宽步长可以不用设置一样,当然这里需要一样。 (3)使用激活函数ReLU进非线性变换。 (4)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(224+21-3)/1+1=224.所以最后得到的特征图大小为224x224x64. (5)再进行激活:ReLU (6)最后就是最大池化: 使用大小为2x2,步长为strides=2的池化单元进行最大池化。input_size+2padding-kernel_size)/strides+1=(224+20-2)/2+1=112. 输出的特征图大小为:112x112x64.
(二):输入特征图大小112x112x64:
(1)输入图片时候使用128个3x3(kernel_size)的卷积核大小进行卷积,得到的特征图大小为112x112x128。 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(112+21-3)/1+1=112.所以最后得到的特征图大小为112x112x128. 甚至我们的高宽步长可以不用设置一样,当然这里需要一样。 (2)使用激活函数ReLU进非线性变换。 (3)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(112+21-3)/1+1=112.所以最后得到的特征图大小为112x112x128. (4)再进行激活:ReLU (5)最后就是最大池化: 使用大小为2x2,步长为strides=2的池化单元进行最大池化。input_size+2padding-kernel_size)/strides+1=(112+20-2)/2+1=56. 输出的特征图大小为:56x56x256.
(三):输入特征图大小为:56x56x256 (1)输入图片时候使用256个3x3(kernel_size)的卷积核大小进行卷积,得到的特征图大小为56x56x256。 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(56+21-3)/1+1=56.所以最后得到的特征图大小为56x56x256. 甚至我们的高宽步长可以不用设置一样,当然这里需要一样。 (2)使用激活函数ReLU进非线性变换。 (3)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(56+21-3)/1+1=56.所以最后得到的特征图大小为56x56x256. (4)再进行激活:ReLU (5)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(56+21-3)/1+1=56.所以最后得到的特征图大小为56x56x256. (6)再进行激活:ReLU (7)最后就是最大池化: 使用大小为2x2,步长为strides=2的池化单元进行最大池化。input_size+2padding-kernel_size)/strides+1=(56+20-2)/2+1=28. 输出的特征图大小为:28x28x256.
(四):输入的特征图大小为:28x28x256 (1)输入图片时候使用512个3x3(kernel_size)的卷积核大小进行卷积,得到的特征图大小为28x28x512。 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(28+21-3)/1+1=28.所以最后得到的特征图大小为28x28x512. 甚至我们的高宽步长可以不用设置一样,当然这里需要一样。 (2)使用激活函数ReLU进非线性变换。 (3)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(28+21-3)/1+1=28.所以最后得到的特征图大小为28x28x512. (4)再进行激活:ReLU (5)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(28+21-3)/1+1=28.所以最后得到的特征图大小为28x28x512. (6)再进行激活:ReLU (7)最后就是最大池化: 使用大小为2x2,步长为strides=2的池化单元进行最大池化。input_size+2padding-kernel_size)/strides+1=(28+20-2)/2+1=14. 输出的特征图大小为:14x14x512.
(五):输入的特征图大小为:14x14x512 (1)输入图片时候使用512个3x3(kernel_size)的卷积核大小进行卷积,得到的特征图大小为14x14x512。 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(14+21-3)/1+1=14.所以最后得到的特征图大小为14x14x512. 甚至我们的高宽步长可以不用设置一样,当然这里需要一样。 (2)使用激活函数ReLU进非线性变换。 (3)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(14+21-3)/1+1=14.所以最后得到的特征图大小为14x14x512. (4)再进行激活:ReLU (5)再进行卷积: 填充:padding=1(padding=‘same’);步长:strides=[1,1] 计算公式:(input_size+2padding-kernel_size)/strides+1=(14+21-3)/1+1=14.所以最后得到的特征图大小为14x14x512. (6)再进行激活:ReLU (7)最后就是最大池化: 使用大小为2x2,步长为strides=2的池化单元进行最大池化。input_size+2padding-kernel_size)/strides+1=(14+20-2)/2+1=7. 输出的特征图大小为:7x7x512.
(六):全连接层(输入的特征图大小为7x7x512): (1)改用为4096个神经元,首先经过Dense层; (2)经过激活函数ReLU层; (3)使用Dropout:防止过拟合,随机的断开其中的一些连接(只是逻辑上断开)。
(七)全连接层:
(1)改用为4096个神经元,首先经过Dense层; (2)经过激活函数ReLU层; (3)使用Dropout:防止过拟合,随机的断开其中的一些连接(只是逻辑上断开)。
(八)最后一层全连接层:
(1)改用为1000个神经元,首先经过Dense层;
(九)最后经过softmax层: 输出1000个类别概率值:
4.VGG16使用的卷积核大小都是3x3的,使用比之前小的卷积核有什么作用:
请看我这篇文章: https://mydreamambitious.blog.csdn.net/article/details/123027344 其中有一点就是增大感受野:两个3x3的卷积核可以替代一个5x5的卷积核;三个3x3的卷积核可以替代一个7x7的卷积核 注解:其中VGG16的参数量是非常大的,其中主要的参数都集中在了全连接层:
如果去掉全连接层的话,参数量为: 参数近相差十倍。
|