更新时间:2023年10月13日18时15分 来源:传智教育 浏览次数:
VGG可以看成是加深版的AlexNet,整个网络由卷积层和全连接层叠加而成,和AlexNet不同的是,VGG中使用的都是小尺寸的卷积核(3×3),其网络架构如下图所示:
VGGNet使用的全部都是3x3的小卷积核和2x2的池化核,通过不断加深网络来提升性能。VGG可以通过重复使用简单的基础块来构建深度模型。
在tf.keras中实现VGG模型,首先来实现VGG块,它的组成规律是:连续使用多个相同的填充为1、卷积核大小为[Math Processing Error]3×3的卷积层后接上一个步幅为2、窗口形状为[Math Processing Error]2×2的最大池化层。卷积层保持输入的高和宽不变,而池化层则对其减半。我们使用vgg_block函数来实现这个基础的VGG块,它可以指定卷积层的数量num_convs和每层的卷积核个数num_filters:
# 定义VGG网络中的卷积块:卷积层的个数,卷积层中卷积核的个数 def vgg_block(num_convs, num_filters): # 构建序列模型 blk = tf.keras.models.Sequential() # 遍历所有的卷积层 for _ in range(num_convs): # 每个卷积层:num_filter个卷积核,卷积核大小为3*3,padding是same,激活函数是relu blk.add(tf.keras.layers.Conv2D(num_filters,kernel_size=3, padding='same',activation='relu')) # 卷积块最后是一个最大池化,窗口大小为2*2,步长为2 blk.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2)) return blk
VGG16网络有5个卷积块,前2块使用两个卷积层,而后3块使用三个卷积层。第一块的输出通道是64,之后每次对输出通道数翻倍,直到变为512。
# 定义5个卷积块,指明每个卷积块中的卷积层个数及相应的卷积核个数 conv_arch = ((2, 64), (2, 128), (3, 256), (3, 512), (3, 512))
因为这个网络使用了13个卷积层和3个全连接层,所以经常被称为VGG-16,通过制定conv_arch得到模型架构后构建VGG16:
# 定义VGG网络def vgg(conv_arch): # 构建序列模型 net = tf.keras.models.Sequential() # 根据conv_arch生成卷积部分 for (num_convs, num_filters) in conv_arch: net.add(vgg_block(num_convs, num_filters)) # 卷积块序列后添加全连接层 net.add(tf.keras.models.Sequential([ # 将特征图展成一维向量 tf.keras.layers.Flatten(), # 全连接层:4096个神经元,激活函数是relu tf.keras.layers.Dense(4096, activation='relu'), # 随机失活 tf.keras.layers.Dropout(0.5), # 全连接层:4096个神经元,激活函数是relu tf.keras.layers.Dense(4096, activation='relu'), # 随机失活 tf.keras.layers.Dropout(0.5), # 全连接层:10个神经元,激活函数是softmax tf.keras.layers.Dense(10, activation='softmax')])) return net# 网络实例化net = vgg(conv_arch)
我们构造一个高和宽均为224的单通道数据样本来看一下模型的架构:
# 构造输入X,并将其送入到net网络中 X = tf.random.uniform((1,224,224,1)) y = net(X) # 通过net.summay()查看网络的形状 net.summay()
网络架构如下:
Model: "sequential_15" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= sequential_16 (Sequential) (1, 112, 112, 64) 37568 _________________________________________________________________ sequential_17 (Sequential) (1, 56, 56, 128) 221440 _________________________________________________________________ sequential_18 (Sequential) (1, 28, 28, 256) 1475328 _________________________________________________________________ sequential_19 (Sequential) (1, 14, 14, 512) 5899776 _________________________________________________________________ sequential_20 (Sequential) (1, 7, 7, 512) 7079424 _________________________________________________________________ sequential_21 (Sequential) (1, 10) 119586826 ================================================================= Total params: 134,300,362 Trainable params: 134,300,362 Non-trainable params: 0 __________________________________________________________________