一、VGG-16网络框架介绍

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

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

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

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

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

总结:

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

(2)VGG-16网络结构很规整,没有那么多的超参数,专注于构建简单的网络,都是几个卷积层后面跟一个可以压缩

图像大小的池化层。即:全部使用3*3的小型卷积核和2*2的最大池化层。

卷积层: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. 深度学习卷积神经网络——经典网络LeNet-5、AlexNet、ZFNet网络的搭建与实现

    一.CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/article/details/51440344 二.LeNet-5网络 输入尺寸:32 ...

  2. 深度学习卷积神经网络——经典网络GoogLeNet(Inception V3)网络的搭建与实现

    一.Inception网络(google公司)--GoogLeNet网络的综述 获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数), 但是这里一般设计思路的情况下会出 ...

  3. 毕设 深度学习卷积神经网络的花卉识别

    文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...

  4. 毕业设计 - 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

    文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...

  5. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  6. 深度学习 卷积神经网络原理

    深度学习 卷积神经网络原理 一.前言 二.全连接层的局限性 三.卷积层 3.1 如何进行卷积运算? 3.2 偏置 3.3 填充 3.4 步长 3.5 卷积运算是如何保留图片特征的? 3.6 三维卷积 ...

  7. 深度学习 --- 卷积神经网络CNN(LeNet-5网络详解)

    卷积神经网络(Convolutional Neural Network,CNN)是一种前馈型的神经网络,其在大型图像处理方面有出色的表现,目前已经被大范围使用到图像分类.定位等领域中.相比于其他神经网 ...

  8. 深度学习-卷积神经网络初识-1

    卷积神经网络 技交部 潘震宇 一.计算机视觉 在计算机视觉领域中,存在着许多问题,各类领域基本都包含着这俩种基础问题: 1. 图像分类 2. 目标检测 除上述之外,最近有一种新颖的技术,也出现在大众的 ...

  9. 深度学习——卷积神经网络的应用——目标检测

    一.理论部分介绍 1. 目标定位和特征点检测 图片检测问题: 分类问题:判断图中是否为汽车: 目标定位:判断是否为汽车,并确定具体位置: 目标检测:检测不同物体并定位. 目标分类和定位: 对于目标定位 ...

最新文章

  1. 递归遍历Linux下的目录文件源码实现
  2. ※编程随笔※=☆编程基础☆=※№ SVN工具自动属性 $Author$ $Date$ $Revision$ $URL$ $Header$替换...
  3. Codeforces Round #353 (Div. 2)
  4. 赛可达推病毒攻击检测和情报分享服务
  5. 趁有空,再了解一下GROOVY中关于类的通例
  6. Android后台杀死系列之二:ActivityManagerService与App现场恢复机制
  7. 共享没有权限访问权限_如何与家人共享SmartThings访问权限
  8. css实现平角切角和弧形切角效果
  9. python判断list集合中是否包含某个元素_python怎样判断list是否包含某个元素
  10. echart 全国地图 下钻省、市、区
  11. 5种方法,加密你的Python代码 !
  12. 百度云网盘批量复制文件,在线复制到每个文件夹中PC版
  13. 你可以不信元宇宙,但请不要错过硬件光线追踪技术的先机
  14. 什么是对比度、亮度?教你在线调整图片色彩
  15. 基于android校园新闻APP开发的设计与实现
  16. python - 数据类型
  17. linux嗅探网站结构,Linux下的Dsniff嗅探浅析
  18. web3.0是什么意思(web3和元宇宙的关系)
  19. 鸿蒙跨屏协作实现原理,跨屏协作满足效率党 高效工作这几款手机必备
  20. 软件环境:安装报Error opening file for writing

热门文章

  1. 【四足机器人--关节初始化时足端位置(速度、加速度)轨迹规划】(4.2)JPosInitializer(B样条曲线计算脚的摆动轨迹)代码解析
  2. H5 页面设置了字体的粗细样式,但是在华为手机里微信打开访问样式不生效?
  3. 使用Qt实现米字段数码管十七段数码管LED数码管控件
  4. 以提前体验为目标的自主性学习
  5. 树莓派安装opencv报错“opencv2/xfeatures2d/cuda.hpp”,解决办法
  6. CloudSim基本结构-1
  7. VB.NET编程技巧与实例集粹 Module5_输入简单表达式并求值
  8. elasticjob已下线_elastic-job详解(四):失效转移
  9. LitePal基本使用概述
  10. scrapy+selenuim中间件爬取京东图书有详细思考过程(涉及较广适合练手)