目录

  VGGNet网络结构

  论文中还讨论了其他结构

  参考资料


2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得了ILSVRC2014比赛分类项目的第二名(第一名是GoogLeNet,也是同年提出的)和定位项目的第一名。

VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它图片数据上的泛化性也非常好。到目前为止,VGG仍然被用来提取图像特征。
VGGNet可以看成是加深版本的AlexNet,都是由卷积层、全连接层两大部分构成。

VGGNet网络结构

VGGNet比AlexNet的网络层数多,不再使用尺寸较大的卷积核,如11*11、7*7、5*5,而是只采用了尺寸为3*3的卷积核,VGG-16的卷积神经网络结构如下:

对应代码为:

import tensorflow as tf
import numpy as np # 输入
x = tf.placeholder(tf.float32, [None, 224, 224, 3])
# 第1层:与64个3*3*3的核,步长=1,SAME卷积
w1 = tf.Variable(tf.random_normal([3, 3, 3, 64]), dtype=tf.float32, name='w1')
conv1 = tf.nn.relu(tf.nn.conv2d(x, w1, [1, 1, 1, 1], 'SAME'))
# 结果为224*224*64 # 第2层:与64个3*3*64的核,步长=1,SAME卷积
w2 = tf.Variable(tf.random_normal([3, 3, 64, 64]), dtype=tf.float32, name='w2')
conv2 = tf.nn.relu(tf.nn.conv2d(conv1, w2, [1, 1, 1, 1], 'SAME'))
# 结果为224*224*64 # 池化1
pool1 = tf.nn.max_pool(conv2, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')
# 结果为112*112*64 # 第3层:与128个3*3*64的核,步长=1,SAME卷积
w3 = tf.Variable(tf.random_normal([3, 3, 64, 128]), dtype=tf.float32, name='w3')
conv3 = tf.nn.relu(tf.nn.conv2d(pool1, w3, [1, 1, 1, 1], 'SAME'))
# 结果为112*112*128 # 第4层:与128个3*3*128的核,步长=1,SAME卷积
w4 = tf.Variable(tf.random_normal([3, 3, 128, 128]), dtype=tf.float32, name='w4')
conv4 = tf.nn.relu(tf.nn.conv2d(conv3, w4, [1, 1, 1, 1], 'SAME'))
# 结果为112*112*128 # 池化2
pool2 = tf.nn.max_pool(conv4, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')
# 结果为56*56*128 # 第5层:与256个3*3*128的核,步长=1,SAME卷积
w5 = tf.Variable(tf.random_normal([3, 3, 128, 256]), dtype=tf.float32, name='w5')
conv5 = tf.nn.relu(tf.nn.conv2d(pool2, w5, [1, 1, 1, 1], 'SAME'))
# 结果为56*56*256 # 第6层:与256个3*3*256的核,步长=1,SAME卷积
w6 = tf.Variable(tf.random_normal([3, 3, 256, 256]), dtype=tf.float32, name='w6')
conv6 = tf.nn.relu(tf.nn.conv2d(conv5, w6, [1, 1, 1, 1], 'SAME'))
# 结果为56*56*256 # 第7层:与256个3*3*256的核,步长=1,SAME卷积
w7 = tf.Variable(tf.random_normal([3, 3, 256, 256]), dtype=tf.float32, name='w7')
conv7 = tf.nn.relu(tf.nn.conv2d(conv6, w7, [1, 1, 1, 1], 'SAME'))
# 结果为56*56*256 # 池化3
pool3 = tf.nn.max_pool(conv7, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')
# 结果为28*28*256 # 第8层:与512个3*3*256的核,步长=1,SAME卷积
w8 = tf.Variable(tf.random_normal([3, 3, 256, 512]), dtype=tf.float32, name='w8')
conv8 = tf.nn.relu(tf.nn.conv2d(pool3, w8, [1, 1, 1, 1], 'SAME'))
# 结果为28*28*512 # 第9层:与512个3*3*512的核,步长=1,SAME卷积
w9 = tf.Variable(tf.random_normal([3, 3, 512, 512]), dtype=tf.float32, name='w9')
conv9 = tf.nn.relu(tf.nn.conv2d(conv8, w9, [1, 1, 1, 1], 'SAME'))
# 结果为28*28*512 # 第10层:与512个3*3*512的核,步长=1,SAME卷积
w10 = tf.Variable(tf.random_normal([3, 3, 512, 512]), dtype=tf.float32, name='w10')
conv10 = tf.nn.relu(tf.nn.conv2d(conv9, w10, [1, 1, 1, 1], 'SAME'))
# 结果为28*28*512 # 池化4
pool4 = tf.nn.max_pool(conv10, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')
# 结果为14*14*512 # 第11层:与512个3*3*256的核,步长=1,SAME卷积
w11 = tf.Variable(tf.random_normal([3, 3, 512, 512]), dtype=tf.float32, name='w11')
conv11 = tf.nn.relu(tf.nn.conv2d(pool4, w11, [1, 1, 1, 1], 'SAME'))
# 结果为14*14*512 # 第12层:与512个3*3*512的核,步长=1,SAME卷积
w12 = tf.Variable(tf.random_normal([3, 3, 512, 512]), dtype=tf.float32, name='w12')
conv12 = tf.nn.relu(tf.nn.conv2d(conv11, w12, [1, 1, 1, 1], 'SAME'))
# 结果为14*14*512 # 第13层:与512个3*3*512的核,步长=1,SAME卷积
w13 = tf.Variable(tf.random_normal([3, 3, 512, 512]), dtype=tf.float32, name='w13')
conv13 = tf.nn.relu(tf.nn.conv2d(conv12, w13, [1, 1, 1, 1], 'SAME'))
# 结果为14*14*512 # 池化5
pool5 = tf.nn.max_pool(conv13, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID')
# 结果为7*7*512 # 拉伸为25088
pool_l5_shape = pool5.get_shape()
num = pool_l5_shape[1].value * pool_l5_shape[2].value * pool_l5_shape[3].value
flatten = tf.reshape(pool5, [-1, num])
# 结果为25088*1 # 第14层:与4096个神经元全连接
fcW1 = tf.Variable(tf.random_normal([num, 4096]), dtype=tf.float32, name='fcW1')
fc1 = tf.nn.relu(tf.matmul(flatten, fcW1)) # 第15层:与4096个神经元全连接
fcW2 = tf.Variable(tf.random_normal([4096, 4096]), dtype=tf.float32, name='fcW2')
fc2 = tf.nn.relu(tf.matmul(fc1, fcW2)) # 第16层:与1000个神经元全连接+softmax输出
fcW3 = tf.Variable(tf.random_normal([4096, 1000]), dtype=tf.float32, name='fcW3')
out = tf.matmul(fc2, fcW3)
out=tf.nn.softmax(out) session = tf.Session()
session.run(tf.global_variables_initializer())
result = session.run(out, feed_dict={x: np.ones([1, 224, 224, 3], np.float32)})
# "打印最后的输出尺寸"
print(np.shape(result))

返回目录

论文中还讨论了其他结构

返回目录

参考资料

吴恩达深度学习

VGGNet-Very Deep Convolutional Networks for Large-Scale Image Recognition

《图解深度学习与神经网络:从张量到TensorFlow实现》_张平

《深-度-学-习-核-心-技-术-与-实-践》

大话CNN经典模型:VGGNet

https://my.oschina.net/u/876354/blog/1634322

返回目录

深度学习面试题17:VGGNet(1000类图像分类)的更多相关文章

  1. 深度学习面试题13:AlexNet(1000类图像分类)

    目录 网络结构 两大创新点 参考资料 第一个典型的CNN是LeNet5网络结构,但是第一个引起大家注意的网络却是AlexNet,Alex Krizhevsky其实是Hinton的学生,这个团队领导者是 ...

  2. 深度学习Keras框架笔记之AutoEncoder类

    深度学习Keras框架笔记之AutoEncoder类使用笔记 keras.layers.core.AutoEncoder(encoder, decoder,output_reconstruction= ...

  3. 深度学习Keras框架笔记之TimeDistributedDense类

    深度学习Keras框架笔记之TimeDistributedDense类使用方法笔记 例: keras.layers.core.TimeDistributedDense(output_dim,init= ...

  4. 深度学习Keras框架笔记之Dense类(标准的一维全连接层)

    深度学习Keras框架笔记之Dense类(标准的一维全连接层) 例: keras.layers.core.Dense(output_dim,init='glorot_uniform', activat ...

  5. 深度学习面试题29:GoogLeNet(Inception V3)

    目录 使用非对称卷积分解大filters 重新设计pooling层 辅助构造器 使用标签平滑 参考资料 在<深度学习面试题20:GoogLeNet(Inception V1)>和<深 ...

  6. 深度学习面试题27:非对称卷积(Asymmetric Convolutions)

    目录 产生背景 举例 参考资料 产生背景 之前在深度学习面试题16:小卷积核级联卷积VS大卷积核卷积中介绍过小卷积核的三个优势: ①整合了三个非线性激活层,代替单一非线性激活层,增加了判别能力. ②减 ...

  7. 深度学习面试题20:GoogLeNet(Inception V1)

    目录 简介 网络结构 对应代码 网络说明 参考资料 简介 2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名.VGG获得了第二 ...

  8. 深度学习面试题12:LeNet(手写数字识别)

    目录 神经网络的卷积.池化.拉伸 LeNet网络结构 LeNet在MNIST数据集上应用 参考资料 LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务.自那时起 ...

  9. 深度学习面试题26:GoogLeNet(Inception V2)

    目录 第一层卷积换为分离卷积 一些层的卷积核的个数发生了变化 多个小卷积核代替大卷积核 一些最大值池化换为了平均值池化 完整代码 参考资料 第一层卷积换为分离卷积 net = slim.separab ...

随机推荐

  1. lxterminal命令打开新窗口并执行python脚本

    lxterminal -e python3 -i test.py 注意,路径要写对,用绝对路径

  2. tkinter 按钮响应函数传值

    tkinter 中的Button组件的响应函数如何传入参数,可能非常困扰新手,这里记录一下. 步骤: 1. 写好响应函数(形参设置好) 2. 在Button command 设置形式:command ...

  3. 那些年伴我一起成长的SAP装备

    今天这篇文章无关技术,我们来聊聊SAP装备,即打上了SAP logo的那些物品. 但凡在SAP圈子工作过一段时间的从业者们,手上或多或少都拥有一些此类装备.Jerry当然也不例外,这些装备无论物品本身 ...

  4. 判断是否发生url跳转

    url="https://www.baidu.com/" url='http://www.freebuf.com/fevents/133225.html' # 方法一:禁止跳转:a ...

  5. linux各种服务的搭建

    https://blog.csdn.net/qq_33571718/article/details/81543408    VPN --linux服务搭建 https://blog.csdn.net/ ...

  6. Android笔记(五十九)Android总结:四大组件——Service篇

    什么是服务? 服务(service)是Android中实现程序后台运行的解决方案,适用于去执行那些不需要和用户交互并且还需要长期运行的任务.服务的运行不依赖于任何用户界面. 服务运行在主线程中,所以在 ...

  7. XML DOM 知识点

    第一部分[DOM基础] DOM介绍: 1.什么是 HTML DOM? HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法(接口). 2.什么是 XML DOM? XML DO ...

  8. Vue项目中自动将px转换为rem

    一.配置与安装步骤: 1.在 Vue 项目的 src 文件夹下创建一个 config 文件夹: 2.在 config 文件夹中创建 rem.js: 3.将以下代码复制到 rem.js 中: // 基准 ...

  9. linux系统编程之文件与io(三)

    上次我们利用文件的read和write来实现了简易的cp命令,其中将源文件拷贝到目标文件时,我们给目标文件的权限是写死的,而非根据源文件的权限生成的,如下: 今天就来解决这个问题,来学习获取文件权限相 ...

  10. vue项目中要实现展示markdown文件[转载]

    转载 版权声明:本文为CSDN博主「齐天二圣」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/nihaoa5 ...