一、VGG-16网络框架介绍

VGGNet是牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发的深度卷积神经网络。

VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠33的小型卷积核和22的最大池化层,

VGGNet成功地构筑了16~19层深的卷积神经网络。VGGNet相比之前state-of-the-art的网络结构,错误率大幅下降,

VGGNet论文中全部使用了33的小型卷积核和22的最大池化核,通过不断加深网络结构来提升性能。

VGG-16和VGG-19结构如下:


总结:

  1. VGG-16网络中的16代表的含义为:含有参数的有16个层,共包含参数约为1.38亿。

  2. VGG-16网络结构很规整,没有那么多的超参数,专注于构建简单的网络,都是几个卷积层后面跟一个可以压缩图像大小的池化层。即:全部使用33的小型卷积核和22的最大池化层。

    卷积层:CONV=3*3 filters, s = 1, padding = same convolution。

    池化层:MAX_POOL = 2*2 , s = 2。

  3. 优点:简化了卷积神经网络的结构;缺点:训练的特征数量非常大。

  4. 随着网络加深,图像的宽度和高度都在以一定的规律不断减小,每次池化后刚好缩小一半,信道数目不断增加一倍。

二、整体架构代码实现

用VGG_6.py文件实现前向传播过程以及网络的参数:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiuimport tensorflow as tf#VGG_16全部使用3*3卷积核和2*2的池化核#创建卷积层函数
def conv_op(input_op,name,kh,kw,n_out,dh,dw,p):"""param :input_op -- 输入tensorname -- 该层的名称kh -- 卷积核的高kw -- 卷积核的宽n_out -- 卷积核数目/输出通道数dh -- 步长的高dw -- 步长的宽p -- 参数(字典类型)return:A -- 卷积层的输出"""n_in = input_op.get_shape()[-1].value   #输入的通道数with tf.variable_scope(name) as scope:weights = tf.get_variable(name=scope+"w",shape=[kh,kw,n_in,n_out],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_con2d())biases = tf.get_variable(name=scope+"b",shape=[n_out],dtype=tf.float32,initializer=tf.constant_initializer(0.0),trainable=True)conv = tf.nn.conv2d(input=input_op,filter=weights,strides=[1,dh,dw,1],padding="SAME")Z = tf.nn.bias_add(conv,biases)A = tf.nn.relu(Z,name=scope)p[name+"w"] = weightsp[name+"b"] = biasesreturn A#创建最大池化层的函数
def maxpool_op(input_op,name,kh,kw,dh,dw):"""param :input_op -- 输入tensorname -- 该层的名称kh -- 池化核的高kw -- 池化核的宽dh -- 步长的高dw -- 步长的宽return:pool -- 该层的池化的object"""pool = tf.nn.max_pool(input_op,ksize=[1,kh,kw,1],strides=[1,dh,dw,1],padding="SAME",name=name)return pool#创建全连接层的函数
def fc_op(input_op,name,n_out,p):"""param :input_op -- 输入tensorname -- 该层的名称n_out -- 输出通道数p -- 参数字典return:A -- 全连接层最后的输出"""n_in = input_op.get_shape()[-1].valuewith tf.variable_scope(name) as scope:weights = tf.get_variable(name=scope+"w",shape=[n_in,n_out],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer())# biases不再初始化为0,赋予一个较小的值,以避免dead neuronbiases = tf.get_variable(name=scope+"b",shape=[n_out],dtype=tf.float32,initializer=tf.constant_initializer(0.1))#tf.nn.relu_layer对输入变量input_op与weights做矩阵乘法加上biases,再做非线性relu变换A = tf.nn.relu_layer(input_op,weights,biases,name=scope)p[name + "w"] = weightsp[name + "b"] = biasesreturn A#构建VGG_16网络的框架
def VGG_16(input_op,keep_prob):"""param :input_op -- 输入tensorkeep_prob -- 控制dropout比率的占位符return:fc8 -- 最后一层全连接层softmax -- softmax分类prediction --  预测p -- 参数字典"""p = {}      #初始化参数字典#第一段卷积网络——两个卷积层和一个最大池化层#两个卷积层的卷积核大小为3*3,卷积核数量均为64,步长s=1,输出均为:224*224*64conv1_1 = conv_op(input_op,name="conv1_1",kh=3,kw=3,n_out=64,dh=1,dw=1,p=p)conv1_2 = conv_op(conv1_1,name="conv1_2",kh=3,kw=3,n_out=64,dh=1,dw=1,p=p)#最大池化层采用的尺寸大小为:2*2,步长s=2,输出为:112*112*64pool1 = maxpool_op(conv1_2,name="pool1",kh=2,kw=2,dh=2,dw=2)# 第二段卷积网络——两个卷积层和一个最大池化层# 两个卷积层的卷积核大小为3*3,卷积核数量均为128,步长s=1,输出均为:112*112*128conv2_1 = conv_op(pool1,name="conv2_1",kh=3,kw=3,n_out=128,dh=1,dw=1,p=p)conv2_2 = conv_op(conv2_1,name="conv2_2",kh=3,kw=3,n_out=128,dh=1,dw=1,p=p)# 最大池化层采用的尺寸大小为:2*2,步长s=2,输出为:56*56*128pool2 = maxpool_op(conv2_2,name="pool2",kh=2,kw=2,dh=2,dw=2)# 第三段卷积网络——三个卷积层和一个最大池化层# 三个卷积层的卷积核大小为3*3,卷积核数量均为256,步长s=1,输出均为:56*56*256conv3_1 = conv_op(pool2,name="conv3_1",kh=3,kw=3,n_out=256,dh=1,dw=1,p=p)conv3_2 = conv_op(conv3_1,name="conv3_2",kh=3,kw=3,n_out=256,dh=1,dw=1,p=p)conv3_3 = conv_op(conv3_2,name="conv3_3",kh=3,kw=3,n_out=256,dh=1,dw=1,p=p)# 最大池化层采用的尺寸大小为:2*2,步长s=2,输出为:28*28*256pool3 = maxpool_op(conv3_3,name="pool3",kh=2,kw=2,dh=2,dw=2)# 第四段卷积网络——三个卷积层和一个最大池化层# 三个卷积层的卷积核大小为3*3,卷积核数量均为512,步长s=1,输出均为:28*28*512conv4_1 = conv_op(pool3, name="conv4_1", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)conv4_2 = conv_op(conv4_1, name="conv4_2", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)conv4_3 = conv_op(conv4_2, name="conv4_3", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)# 最大池化层采用的尺寸大小为:2*2,步长s=2,输出为:14*14*512pool4 = maxpool_op(conv4_3, name="pool4", kh=2, kw=2, dh=2, dw=2)# 第五段卷积网络——三个卷积层和一个最大池化层# 三个卷积层的卷积核大小为3*3,卷积核数量均为512,步长s=1,输出均为:14*14*512conv5_1 = conv_op(pool4, name="conv5_1", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)conv5_2 = conv_op(conv5_1, name="conv5_2", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)conv5_3 = conv_op(conv5_2, name="conv5_3", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)# 最大池化层采用的尺寸大小为:2*2,步长s=2,输出为:7*7*512pool5 = maxpool_op(conv5_3, name="pool5", kh=2, kw=2, dh=2, dw=2)# 第六、七段 —— 含4096个隐藏节点的全连接层及dropoutpool5_shape = pool5.get_shape().as_list()flattened_shape = pool5_shape[1] * pool5_shape[2] * pool5_shape[3]dense = tf.reshape(pool5, shape=[-1, flattened_shape],name="dense")  # 向量化fc6 = fc_op(dense,name="fc6",n_out=4096,p=p)fc6_drop = tf.nn.dropout(fc6,keep_prob=keep_prob,name="fc6_drop")fc7 = fc_op(fc6_drop, name="fc7", n_out=4096, p=p)fc7_drop = tf.nn.dropout(fc7, keep_prob=keep_prob, name="fc7_drop")#最后一层输出层含1000个节点,进行softmax分类fc8 = fc_op(fc7_drop,name="fc8",n_out=1000,p=p)softmax = tf.nn.softmax(fc8)prediction = tf.argmax(softmax,1)return prediction,softmax,fc8,psamsan

三、用slim实现VGG_16网络的代码如下:

def vgg16(inputs):with slim.arg_scope([slim.conv2d, slim.fully_connected],activation_fn=tf.nn.relu,weights_initializer=tf.truncated_normal_initializer(0.0, 0.01),weights_regularizer=slim.l2_regularizer(0.0005)):net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')net = slim.max_pool2d(net, [2, 2], scope='pool1')net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')net = slim.max_pool2d(net, [2, 2], scope='pool2')net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')net = slim.max_pool2d(net, [2, 2], scope='pool3')net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')net = slim.max_pool2d(net, [2, 2], scope='pool4')net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')net = slim.max_pool2d(net, [2, 2], scope='pool5')net = slim.fully_connected(net, 4096, scope='fc6')net = slim.dropout(net, 0.5, scope='dropout6')net = slim.fully_connected(net, 4096, scope='fc7')net = slim.dropout(net, 0.5, scope='dropout7')net = slim.fully_connected(net, 1000, activation_fn=None, scope='fc8')return net

转载链接

VGG-16网络结构相关推荐

  1. pytorch笔记:VGG 16

    理论部分见:机器学习笔记:VGG 16_UQI-LIUWJ的博客-CSDN博客 1 直接调用 import torch, torchvisionmodel = torchvision.models.v ...

  2. vgg 16模型的内存和参数量的计算

    cs231n上关于VGG-16模型的内存和参数的计算过程如下. INPUT: [224x224x3] memory: 224*224*3=150K weights: 0 CONV3-64: [224x ...

  3. 深度学习笔记--基于Pytorch搭建VGG16网络

    目录 1--VGG16网络 2--代码实现 3--参考 1--VGG16网络 具体原理参考 VGG 网络的原论文:VGG原论文 VGG 16 网络结构如下图所示: VGG 16 网络的实现流程如下图所 ...

  4. Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet

    CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段 ...

  5. Deep Learning回顾之LeNet、AlexNet、GoogLeNet、VGG、ResNet

    from:#Deep Learning回顾#之LeNet.AlexNet.GoogLeNet.VGG.ResNet CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Pape ...

  6. 计算机视觉:基于眼疾分类数据集iChallenge-PM图像分类经典模型剖析(LeNet,AlexNet,VGG,GoogLeNet,ResNet)

    计算机视觉:图像分类经典模型 LeNet AlexNet VGG GoogLeNet ResNet 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测.图像分割.物体跟 ...

  7. TensorFlow载入VGG并可视化每层

    一.简介 VGG网络在2014年的 ILSVRC localization and classification 两个问题上分别取得了第一名和第二名.VGG网络非常深,通常有16-19层,如果自己训练 ...

  8. PyTorch 深度学习:33分钟快速入门——VGG

    CIFAR 10¶ cifar 10 这个数据集一共有 50000 张训练集,10000 张测试集,两个数据集里面的图片都是 png 彩色图片,图片大小是 32 x 32 x 3,一共是 10 分类问 ...

  9. Feature Extractor[VGG]

    0. 背景 Karen Simonyan等人在2014年参加Imagenet挑战赛的时候提出的深度卷积神经网络.作者通过对2013年的ILSVRC中最好的深度神经网络模型(他们最初的对应模型都是ale ...

  10. 【深度学习】经典神经网络 VGG 论文解读

    VGG 在深度学习领域中非常有名,很多人 fine-tune 的时候都是下载 VGG 的预训练过的权重模型,然后在次基础上进行迁移学习.VGG 是 ImageNet 2014 年目标定位竞赛的第一名, ...

最新文章

  1. Visual Studio 快捷键 转载
  2. PHP获取文件后缀名
  3. Requests库网络爬虫实战
  4. 学习笔记(07):MySQL数据库运维与管理-02-用户权限授予演示
  5. 使用axis2 services.xml 发布web service
  6. HIve内置函数(functions)使用和解析
  7. 声明JavaScript函数的六种方法
  8. 微软最强命令行工具发布,强势霸榜GitHub
  9. python数据分析之(5)scipy
  10. 传智播客 Web静态服务器-6-epoll
  11. 时空行为检测数据集 JHMDB UCF101_24 详解
  12. TabHost详细解析
  13. 【SAP消息号KD503】
  14. 系统集成管理工程师 第四章:项目管理一般知识
  15. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
  16. 最新系统漏洞--Siemens Jt2go和Teamcenter Visualization越界写入漏洞
  17. 计算机音乐小二郎,小二郎_儿童歌曲_单曲在线试听_酷我音乐
  18. python识别手写数字knn_机器学习-kNN实现简单的手写数字识别系统
  19. 利用python实现星座运势查询APP
  20. 9月20号是用计算机,2016年9月计算机应用基础统考题库 excel电子表格

热门文章

  1. SwitchHost使用教程
  2. 点菜系统软件源码(点菜软件源码分享)
  3. C#点餐系统源码,在线订餐系统源码
  4. STM32F103C8在应用编程(IAP)介绍及实现
  5. 华为arm服务器虚拟化,华为云arm服务器
  6. js上传本地文件到oss
  7. 使用puppeteer实现PDF文件合成
  8. python实现【国家统计局】三级区划代码和城乡划分代码爬取
  9. AfterEffect滤镜插件总目录
  10. Windows下搭建SVN服务器 - Visual SVN server