VGGNet简介
VGG的全称是Visual Geometry Group,隶属于牛津大学科学与工程系。它发布了一系列从VGG开始的卷积网络模型,从VGG16到VGG19,可应用于人脸识别和图像分类。VGG对卷积网络深度研究的初衷是要了解卷积网络的深度如何影响大规模图像分类和识别的准确率和准确率。
提出该网络结构的论文网址:https://arxiv.org/pdf/1409.1556
PS:完整的VGG16搭建代码在最下面,心急的小伙伴可直接使用
VGGNet网络结构
VGGNet 设计的输入为 224x244×3 大小的 RGB 图像,所使用的主要是三个元素:卷积层、最大池化层和全连接层。使用的所有卷积核尺寸为 3x3,步长是固定的 1×1,padding为‘same'的方式,并采用 relu 函数作为激活函数。所用的五个最大池化层窗口尺寸均为 2×2,步长同为 2×2。最终连接3个全连接层,它们的神经元分别是4096,4096和1000,也都采用relu作为激活函数。根据卷积层数+全连接层数的不同,可以分为从VGG11到VGG19不等。最小的 VGG11 有 8 个卷积层和 3 个全连接层;最大的 VGG19 有 16 个卷积层和3 个全连接;VGG16则是13个卷积层和3个全连接层。
VGG16的详细结构图:
VGG16网络层的输入输出图:
相信到这里基本能够理解了VGG16的结构,在搭建它之前我们再来看看另外几个VGG的详细结构吧,VGG11、13、16、19网络层结构如下图所示:
从上图可以看出来VGG系列在整体结构上都是异曲同工的,下面我们来搭建VGG16网络,小伙伴们也可以结合上图和下面的代码搭建出其他的VGG模型。
VGGNet-16代码实现:
import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Model
def build_vgg16_model(input_shape):
input_tensor = Input(shape=input_shape)
# 第一块卷积层
x = Conv2D(64, (3, 3), padding='same', activation='relu')(input_tensor)
x = Conv2D(64, (3, 3), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
# 第二块卷积层
x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
# 第三块卷积层
x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
# 第四块卷积层
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
# 第五块卷积层
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
# 展平
x = Flatten()(x)
# 全连接层
x = Dense(4096, activation='relu')(x)
x = Dense(4096, activation='relu')(x)
# 输出层(分类), 多少分类就设置神经元是多少
output = Dense(1000, activation='softmax')(x)
# 构建模型
model = Model(inputs=input_tensor, outputs=output)
return model
input_shape = (224, 224, 3)
vgg16_model = build_vgg16_model(input_shape)
# 模型训练参数
epochs = 100
batch_size = 256 # 大了很需要计算资源,可以设置得小一些
# 定义优化器,在这里我们使用的是SGD
optimizer = tf.keras.optimizers.SGD(
learning_rate=0.001, # 可以根据你的需求调整学习率
momentun=0.9 #动量设置为0.9
)
# 编译模型, 也可以更换其他的loss
vgg16_model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
# 打印模型概览
vgg16_model.summary()
至此,我们就搭建好了VGGNet-16,最后我们打印了模型概览来与下面的详细参数表对比一下是否一致吧。