深度学习卷积神经网络——经典网络VGG-16网络的搭建与实现
一、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网络的搭建与实现相关推荐
- 深度学习卷积神经网络——经典网络LeNet-5、AlexNet、ZFNet网络的搭建与实现
一.CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/article/details/51440344 二.LeNet-5网络 输入尺寸:32 ...
- 深度学习卷积神经网络——经典网络GoogLeNet(Inception V3)网络的搭建与实现
一.Inception网络(google公司)--GoogLeNet网络的综述 获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数), 但是这里一般设计思路的情况下会出 ...
- 毕设 深度学习卷积神经网络的花卉识别
文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...
- 毕业设计 - 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉
文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...
- 深度学习 卷积神经网络-Pytorch手写数字识别
深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...
- 深度学习 卷积神经网络原理
深度学习 卷积神经网络原理 一.前言 二.全连接层的局限性 三.卷积层 3.1 如何进行卷积运算? 3.2 偏置 3.3 填充 3.4 步长 3.5 卷积运算是如何保留图片特征的? 3.6 三维卷积 ...
- 深度学习 --- 卷积神经网络CNN(LeNet-5网络详解)
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈型的神经网络,其在大型图像处理方面有出色的表现,目前已经被大范围使用到图像分类.定位等领域中.相比于其他神经网 ...
- 深度学习-卷积神经网络初识-1
卷积神经网络 技交部 潘震宇 一.计算机视觉 在计算机视觉领域中,存在着许多问题,各类领域基本都包含着这俩种基础问题: 1. 图像分类 2. 目标检测 除上述之外,最近有一种新颖的技术,也出现在大众的 ...
- 深度学习——卷积神经网络的应用——目标检测
一.理论部分介绍 1. 目标定位和特征点检测 图片检测问题: 分类问题:判断图中是否为汽车: 目标定位:判断是否为汽车,并确定具体位置: 目标检测:检测不同物体并定位. 目标分类和定位: 对于目标定位 ...
最新文章
- 递归遍历Linux下的目录文件源码实现
- ※编程随笔※=☆编程基础☆=※№ SVN工具自动属性 $Author$ $Date$ $Revision$ $URL$ $Header$替换...
- Codeforces Round #353 (Div. 2)
- 赛可达推病毒攻击检测和情报分享服务
- 趁有空,再了解一下GROOVY中关于类的通例
- Android后台杀死系列之二:ActivityManagerService与App现场恢复机制
- 共享没有权限访问权限_如何与家人共享SmartThings访问权限
- css实现平角切角和弧形切角效果
- python判断list集合中是否包含某个元素_python怎样判断list是否包含某个元素
- echart 全国地图 下钻省、市、区
- 5种方法,加密你的Python代码 !
- 百度云网盘批量复制文件,在线复制到每个文件夹中PC版
- 你可以不信元宇宙,但请不要错过硬件光线追踪技术的先机
- 什么是对比度、亮度?教你在线调整图片色彩
- 基于android校园新闻APP开发的设计与实现
- python - 数据类型
- linux嗅探网站结构,Linux下的Dsniff嗅探浅析
- web3.0是什么意思(web3和元宇宙的关系)
- 鸿蒙跨屏协作实现原理,跨屏协作满足效率党 高效工作这几款手机必备
- 软件环境:安装报Error opening file for writing
热门文章
- 【四足机器人--关节初始化时足端位置(速度、加速度)轨迹规划】(4.2)JPosInitializer(B样条曲线计算脚的摆动轨迹)代码解析
- H5 页面设置了字体的粗细样式,但是在华为手机里微信打开访问样式不生效?
- 使用Qt实现米字段数码管十七段数码管LED数码管控件
- 以提前体验为目标的自主性学习
- 树莓派安装opencv报错“opencv2/xfeatures2d/cuda.hpp”,解决办法
- CloudSim基本结构-1
- VB.NET编程技巧与实例集粹 Module5_输入简单表达式并求值
- elasticjob已下线_elastic-job详解(四):失效转移
- LitePal基本使用概述
- scrapy+selenuim中间件爬取京东图书有详细思考过程(涉及较广适合练手)