深度学习——VGG框架

110 阅读2分钟

VGG简介:

  • VGG可以看成是加深版的AlexNet,整个网络由卷积层和全连接层叠加而成,和AlexNet不同的是,VGG中使用的都是小尺寸的卷积核(3×3)

  • VGGNet使用的全部都是3x3的小卷积核和2x2的池化核,通过不断加深网络来提升性能。VGG可以通过重复使用简单的基础块来构建深度模型。

  • 实现VGG块,它的组成规律是: 连续使用多个相同的填充为1、卷积核大小为33的卷积层后,接上一个步幅为2、窗口形状为22的最大池化层。卷积层保持输入的高和宽不变,而池化层则对其减半。

  • 可以用vgg_block 函数来实现这个基础的VGG块,它可以指定卷积层的数量 num_convs 和每层的卷积核个数num_fi lters

  • 模型构建:

# 定义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:

image.png

构造一个高和宽均为224的单通道数据样本来看一下模型的架构:

image.png

手写数字势识别(后续补充)

因为ImageNet数据集较大训练时间较长,我们仍用前面的MNIST数据集来演示VGGNet。读取数据的时将图像高和宽扩大到VggNet使用的图像高和宽224。这个通过tf.image.resize_with_pad 来实现。