关于VGGNet网络结构浅谈(主要是VGG16结构)

文章目录

    • 1.首先看一下论文中一张表:
    • 2.VGG16网络结构解释:
    • 3.网络构成详解:
    • 4.VGG16使用的卷积核大小都是3x3的,使用比之前小的卷积核有什么作用:
    • 5.Tensorflow2.6.0实现VGG16网络结构:

1.首先看一下论文中一张表:

关于VGGNet网络结构浅谈(主要是VGG16结构)_第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结构:
关于VGGNet网络结构浅谈(主要是VGG16结构)_第2张图片
关于VGGNet网络结构浅谈(主要是VGG16结构)_第3张图片
图片来源:
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
(一)第一层:
关于VGGNet网络结构浅谈(主要是VGG16结构)_第4张图片

注解:
(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:
关于VGGNet网络结构浅谈(主要是VGG16结构)_第5张图片

(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
关于VGGNet网络结构浅谈(主要是VGG16结构)_第6张图片
(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
关于VGGNet网络结构浅谈(主要是VGG16结构)_第7张图片
(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
关于VGGNet网络结构浅谈(主要是VGG16结构)_第8张图片
(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):
关于VGGNet网络结构浅谈(主要是VGG16结构)_第9张图片
(1)改用为4096个神经元,首先经过Dense层;
(2)经过激活函数ReLU层;
(3)使用Dropout:防止过拟合,随机的断开其中的一些连接(只是逻辑上断开)。


(七)全连接层:
关于VGGNet网络结构浅谈(主要是VGG16结构)_第10张图片

(1)改用为4096个神经元,首先经过Dense层;
(2)经过激活函数ReLU层;
(3)使用Dropout:防止过拟合,随机的断开其中的一些连接(只是逻辑上断开)。


(八)最后一层全连接层:

关于VGGNet网络结构浅谈(主要是VGG16结构)_第11张图片
(1)改用为1000个神经元,首先经过Dense层;


(九)最后经过softmax层:
关于VGGNet网络结构浅谈(主要是VGG16结构)_第12张图片
输出1000个类别概率值:

4.VGG16使用的卷积核大小都是3x3的,使用比之前小的卷积核有什么作用:

请看我这篇文章:
https://mydreamambitious.blog.csdn.net/article/details/123027344
其中有一点就是增大感受野:两个3x3的卷积核可以替代一个5x5的卷积核;三个3x3的卷积核可以替代一个7x7的卷积核
关于VGGNet网络结构浅谈(主要是VGG16结构)_第13张图片
注解:其中VGG16的参数量是非常大的,其中主要的参数都集中在了全连接层:

关于VGGNet网络结构浅谈(主要是VGG16结构)_第14张图片
如果去掉全连接层的话,参数量为:
关于VGGNet网络结构浅谈(主要是VGG16结构)_第15张图片
参数近相差十倍。

5.Tensorflow2.6.0实现VGG16网络结构:

import os
import keras
from tensorflow.keras import layers

#但是在这里我添加了BatchNormalization
model_vgg16=keras.Sequential([
    #网络的输入
    layers.InputLayer(input_shape=(224,224,3)),

    layers.Conv2D(64,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(64,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2,2]),

    layers.Conv2D(128,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(128,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2,2]),

    layers.Conv2D(256,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(256,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(256,kernel_size=[3,3],strides=[1,1],padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2,2]),

    layers.Conv2D(512, kernel_size=[3, 3], strides=[1, 1], padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(512, kernel_size=[3, 3], strides=[1, 1], padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(512, kernel_size=[3, 3], strides=[1, 1], padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2, 2]),

    layers.Conv2D(512, kernel_size=[3, 3], strides=[1, 1], padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(512, kernel_size=[3, 3], strides=[1, 1], padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),

    layers.Conv2D(512, kernel_size=[3, 3], strides=[1, 1], padding='same'),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=[2, 2]),

    #这里也可以使用全局平均池化
    layers.GlobalAveragePooling2D(),
    # layers.Flatten(),
    layers.Dense(4096),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),

    layers.Dense(4096),
    layers.Activation('relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),

    layers.Dense(1000),
    layers.Activation('softmax'),
])
#输出网络的结构
# model_vgg16.summary()

关于VGGNet网络结构浅谈(主要是VGG16结构)_第16张图片
关于VGGNet网络结构浅谈(主要是VGG16结构)_第17张图片
关于VGGNet网络结构浅谈(主要是VGG16结构)_第18张图片
关于VGGNet网络结构浅谈(主要是VGG16结构)_第19张图片
关于VGGNet网络结构浅谈(主要是VGG16结构)_第20张图片

你可能感兴趣的:(python,计算机视觉)