经典卷积神经网络结构——VGG网络结构详解(卷积神经网络入门,Keras代码实现)

原文链接
https://blog.csdn.net/qq_33037903/article/details/88774615

背景简介

2012年 AlexNet 在 ImageNet 上显著的降低了分类错误率,深度神经网络进入迅速发展阶段。在2014年牛津大学机器人实验室尝试构建了更深的网络,文章中称为"VERY DEEP CONVOLUTIONAL NETWORKS",如VGG16,有16层,虽然现在看起来稀疏平常,但与 AlexNet 相比,翻了几倍。这个阶段,主要是没有解决网络太深梯度反向传播消失的问题,且受限于GPU等硬件设备的性能,所以深度网络不易于训练。不过,VGG 显然是当时最好的图像分类模型,斩获 ILSVRC 比赛冠军。顺便说下,2012年之后,标准数据集主要是ImageNet,到后来又有微软的COCO数据集。

原论文地址

https://arxiv.org/pdf/1409.1556.pdf
文章发在 ICLR( International Conference on Learning Representations) 2015会议上,截止目前引用次数为27081

个人github实现

https://github.com/uestcsongtaoli/vgg_net

模型介绍

这里重点介绍VGG16


VGG 16

上图上半部分相对直观,下半部分是一种常见的普通网络结构的表示方法,下半部分最后一层不应该是4096,应该是分类问题的类别数目 num_classes。
该模型可以简单分为5个 stage,(我猜测这种思想来自于 AlexNet 的5层卷积,可以参考我写的关于AlexNet的文章结构介绍部分)每层两卷积核池化组成,最后接3层全连接用于分类。

先定义 conv block 包括卷积、BatchNormalization 和 Activation:

def conv_block(layer, filters, kernel_size=(3, 3), strides=(1, 1), padding='same', name=None):
    x = Conv2D(filters=filters,
               kernel_size=kernel_size,
               strides=strides,
               padding=padding,
               kernel_initializer="he_normal",
               name=name)(layer)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    return x

Stage 1

  1. 卷积层Conv_1_1
  2. 卷积层Conv_1_2
  3. 池化层 max_pool_1
    x = conv_block(input_layer, filters=64, kernel_size=(3, 3), name="conv1_1_64_3x3_1")
    x = conv_block(x, filters=64, kernel_size=(3, 3), name="conv1_2_64_3x3_1")
    x = MaxPool2D(pool_size=(2, 2), strides=(2, 2), name="max_pool_1_2x2_2")(x)
    

Stage 2

  1. 卷积层Conv_2_1
  2. 卷积层Conv_2_2
  3. 池化层 max_pool_2
    x = conv_block(x, filters=128, kernel_size=(3, 3), name="conv2_1_128_3x3_1")
    x = conv_block(x, filters=128, kernel_size=(3, 3), name="conv2_2_128_3x3_1")
    x = MaxPool2D(pool_size=(2, 2), strides=(2, 2), name="max_pool_2_2x2_2")(x)
    

Stage 3

  1. 卷积层Conv_3_1
  2. 卷积层Conv_3_2
  3. 卷积层Conv_3_3
  4. 池化层 max_pool_3
    x = conv_block(x, filters=256, kernel_size=(3, 3), name="conv3_1_256_3x3_1")
    x = conv_block(x, filters=256, kernel_size=(3, 3), name="conv3_2_256_3x3_1")
    x = conv_block(x, filters=256, kernel_size=(1, 1), name="conv3_3_256_3x3_1")
    x = MaxPool2D(pool_size=(2, 2), strides=(2, 2), name="max_pool_3_2x2_2")(x)
    

Stage 4

  1. 卷积层Conv_4_1
  2. 卷积层Conv_4_2
  3. 卷积层Conv_4_3
  4. 池化层 max_pool_4
    x = conv_block(x, filters=512, kernel_size=(3, 3), name="conv4_1_512_3x3_1")
    x = conv_block(x, filters=512, kernel_size=(3, 3), name="conv4_2_512_3x3_1")
    x = conv_block(x, filters=512, kernel_size=(1, 1), name="conv4_3_512_3x3_1")
    x = MaxPool2D(pool_size=(2, 2), strides=(2, 2), name="max_pool_4_2x2_2")(x)
    

Stage 5

  1. 卷积层Conv_5_1
  2. 卷积层Conv_5_2
  3. 卷积层Conv_5_3
  4. 池化层 max_pool_5
    x = conv_block(x, filters=512, kernel_size=(3, 3), name="conv5_1_512_3x3_1")
    x = conv_block(x, filters=512, kernel_size=(3, 3), name="conv5_2_512_3x3_1")
    x = conv_block(x, filters=512, kernel_size=(1, 1), name="conv5_3_512_3x3_1")
    x = MaxPool2D(pool_size=(2, 2), strides=(2, 2), name="max_pool_5_2x2_2")(x)
    

FC Layers

3 层全连接,最后接 softmax 分类

    # FC layer 1
    x = Flatten()(x)
    x = Dense(2048)(x)
    x = BatchNormalization()(x)
    x = Dropout(0.5)(x)
    x = Activation("relu")(x)
    
    # FC layer 2
    x = Dense(1024)(x)
    x = BatchNormalization()(x)
    x = Dropout(0.5)(x)
    x = Activation("relu")(x)
    
    # FC layer 3
    x = Dense(num_classes)(x)
    x = BatchNormalization()(x)
    x = Activation("softmax")(x)

全连接层最后的 units 个数可以根据实际问题修改,我觉得4096对于10个类别的分类太多了,简单的处理了下,减少了一般的参数,毕竟实验室机器不太好呀!

这是原论文中不同深度的VGG网络结构


VGG architecture

个人理解

  1. 看完 VGG 你会觉得就是在 AlexNet 网络上没一层进行了改造,5个 stage 对应 AlexNet 中的5层卷积,3层全连接仍然不变。
  2. 图片输入的大小还是沿用了 224x224x3
  3. 网络更深,训练出来的效果确实比 AlexNet 有所提升
  4. 常用的 trick 都加进去了: max_pooling/batch_normalization/dropout(我没加)
  5. 调参主要是,初始化用了 he_normal;使用了不同的优化器 optimizer, 如 adamax 等
  6. 由于网络在如今看来并不是太深,所以有些任务的基础骨架仍然选择VGG

更多参考资料

  1. Reading the VGG Network Paper and Implementing It From Scratch with Keras
    https://hackernoon.com/learning-keras-by-implementing-vgg16-from-scratch-d036733f2d5
  2. VGG Convolutional Neural Networks Practical
    原文作者的网络,讲解详细,源码是 MATLAB
    http://www.robots.ox.ac.uk/~vgg/practicals/cnn/index.html
  3. Convolutional Neural Network with VGG Architecture
    清晰的结构图
    https://betweenandbetwixt.com/2018/12/23/convolutional-neural-network-with-vgg-architecture/
  4. VGG in TensorFlow
    https://www.cs.toronto.edu/~frossard/post/vgg16/

代码

  1. VGG16 – Implementation Using Keras
    https://engmrk.com/vgg16-implementation-using-keras/
  2. VGG16 model for Keras
    https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3
  3. VGG16 model for TensorFlow
    https://github.com/machrisaa/tensorflow-vgg/blob/master/vgg16.py
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 这个小说,我陆陆续续看了四年,于昨晚看完。这是一本作者为了考察真实情况而做了卧底潜入上饶的传销窝点亲自体会。 我敬...
    索尼格格阅读 1,098评论 0 0
  • 文/魏千洛 更新一篇,证明我还活着! 或许,你觉得打新股这件事,离我们好远,你得有股票账户吧?!你得有配额吧?!你...
    千洛读书阅读 898评论 15 7
  • PDF转word,相信很多人都会用到吧,不管你说是学生党和上班族,写论文要用到,工作要用到,甚至是自由职业也可能要...
    办公教程阅读 2,110评论 1 4
  • 今早5点50,我还在迷迷糊糊睡觉,接到领导电话,我一看时间和领导名字就知道是通知我值班了。 是真忘了,压根没记着这...
    丁冬哒哒阅读 345评论 0 4