VGG-16网络结构

article/2025/4/22 17:47:27

一、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

转载链接


http://chatgpt.dhexx.cn/article/OtanLadn.shtml

相关文章

[VGG16]——网络结构介绍及搭建(PyTorch)

一、VGG16的结构层次 VGG16总共有16层,13个卷积层和3个全连接层,第一次经过64个卷积核的两次卷积后,采用一次pooling,第二次经过两次128个卷积核卷积后,采用pooling;再经过3次256个卷积核卷积后。采用pooli…

VGG预训练模型网络结构详解——以VGG16为例

VGG卷积神经网络是牛津大学在2014年提出来的模型。当这个模型被提出时,由于它的简洁性和实用性,马上成为了当时最流行的卷积神经网络模型。它在图像分类和目标检测任务中都表现出非常好的结果。在2014年的ILSVRC比赛中,VGG 在Top-5中取得了92…

卷积神经网络模型之——VGG-16网络结构与代码实现

文章目录 VGGNet简介VGG16网络结构使用pytorch搭建VGG16featuresclassifier完整代码 VGGNet简介 VGG原文:Very deep convolutional networks for large-scale image recognition:https://arxiv.org/pdf/1409.1556.pdf VGG在2014年由牛津大学Visual Geom…

关于VGGNet网络结构浅谈(主要是VGG16结构)

文章目录 1.首先看一下论文中一张表:2.VGG16网络结构解释:3.网络构成详解:4.VGG16使用的卷积核大小都是3x3的,使用比之前小的卷积核有什么作用:5.Tensorflow2.6.0实现VGG16网络结构: 1.首先看一下论文中一张…

深度学习之学习(1-1) VGG16网络结构详解

参见 ​​​​​​【深度学习】全面理解VGG16模型_florrie-CSDN博客_vgg16模型介绍深度学习-VGG16原理详解_£的博客-CSDN博客_vgg16 1、网络结构 根据卷积核大小和卷积层数,VGG共有6中配置,分别为A,A-LRN,B,C,D,E,其中D和E两种最为常…

【深度学习】全面理解VGG16模型

全面理解VGG16模型 VGG16的结构层次介绍结构图VGG16模型所需要的内存容量介绍卷积中的基本概念1.从input到conv1:2.从conv1到conv2之间的过渡:3.conv2到conv3:4.进入conv3:5.从conv3到conv4之间的过渡:6.最后到三层全连…

经典卷积神经网络---VGG16详解

一.VGG概述 VGGNet是牛津大学视觉几何组(Visual Geometry Group)提出的模型,该模型在2014ImageNet图像分类与定位挑战赛 ILSVRC-2014中取得在分类任务第二,定位任务第一的优异成绩。VGGNet突出的贡献是证明了很小的卷积,通过增加网络深度可以…

SpringCloud笔记

Eureka 一、不引入Eureka时 1.引入公共模块依赖 <!-- 引入公共模块依赖 --> <dependency><groupId>niit</groupId><artifactId>springcloud-api</artifactId> </dependency>引入后会发现Maven视图报错&#xff0c;此处需要在父工…

服务链路追踪怎么搞?好搞吗?

微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0c;业务的复杂性&#xff0c;如果出现了错误和异常&#xff0c;很难去定位。主要体现在&#xff0c;一个请求可能需要调用很多个服…

java小白进阶之基础篇

JAVA基础语法归纳>>小白进阶~~java基础语法 >>Java概述 Java语言的发展历史 1991年出现&#xff0c;1995年正式发布 创始人&#xff1a;James Gosling 出生地&#xff1a;SUN 被Oracle公司在这里插入代码片 最新的JDK的版本&#xff1a; 2020年发布JDK14 Java体系…

WAF绕过总结+工具介绍

什么是WAF Waf是web应用防火墙&#xff08; Web Application Firewa‖l&#xff09;的简称&#xff0c;对来自Web应用程序客户端的各类请求进行内容检测和验证&#xff0c;确保其安全性与合法性&#xff0c;对非法的请求予以实时阻断&#xff0c;为web应用提供防护&#xff0c…

Java基础入门笔记(看到就是赚到)

一、初始java 1. 生活中的程序&#xff1a; 从起床到上班的过程 穿衣打扮—起床—洗漱—吃饭—出门—乘坐交通工具—到公司 2.计算机中的程序: 一组有序指令的集合,需要和计算机交流就要使用计算机语言&#xff0c;java就是计算机语言的一种 3.java能做什么&#xff1a; …

vue-plugin-hiprint vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用

vue-plugin-hiprint vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用 安装相关依赖安装 vue-plugin-hiprintJQuery安装 打印客户端 引入依赖打印 html 内容 - 简单使用根据模版打印 - 简单使用以下内容 和上面demo 没关系 &#xff01;&#xff01;&#xff01…

Kafka问题整理 (Too many open files等)/kafka重要参数总结

1.Kafka集群搭建好以后&#xff0c;运行一段时间Kafka节点挂掉&#xff0c;程序中出现如下错误 ERROR Error while accepting connection (kafka.network.Acceptor) java.io.IOException: Too many open files 或者 ERROR Error while deleting the clean shutdown file in…

picoCTF,Reverse Engineering,逆向类,42/55

picoCTF&#xff0c;Reverse Engineering&#xff0c;42/55 2019 picoCTF01、vault-door-training&#xff0c;50分02、vault-door-1&#xff0c;100分03、vault-door-3&#xff0c;200分04、vault-door-4&#xff0c;250分05、vault-door-5&#xff0c;300分06、vault-door-6&…

Java学习(12)(String类、String的查找方法、字符串转化、 替换、拆分、截取、trim方法、字符串的不可变性、StringBuilder和StringBuffer)

接上次博客&#xff1a;Java学习&#xff08;11&#xff09;&#xff1a;Java实现图书馆书库管理系统_di-Dora的博客-CSDN博客 目录 String类 构造字符串的方法&#xff1a; String 对象的比较 1、比较是否引用了同一个对象。 2、比较字符串内容是否相同 3、"int co…

渗透测试工具实战技巧合集

本文为作者总结自己在渗透测试中常用的一些小技巧。原文分为两部分&#xff0c;译者将其合二为一&#xff0c;方便大家查阅。 最好的 NMAP 扫描策略 # 适用所有大小网络最好的 nmap 扫描策略# 主机发现&#xff0c;生成存活主机列表 $ nmap -sn -T4 -oG Discovery.gnmap 192.1…

Netty堆外内存泄漏排查,这一篇全讲清楚了

上篇文章介绍了Netty内存模型原理&#xff0c;由于Netty使用不当会导致堆外内存泄漏&#xff0c;网上关于这方面的资料比较少&#xff0c;所以写下这篇文章&#xff0c;基于Netty4.1.43.Final&#xff0c;专门介绍排查Netty堆外内存相关的知识点&#xff0c;诊断工具&#xff0…

分支选择结构

分支语句又被称为选择结构&#xff0c;选择结构就是根据一个boolean表达式,来决定执行哪一些代码(代码块)。比较常见的分支语句有if语句和switch语句&#xff0c;下面将以代码的形式说明if和switch语句的基本构成以及其作用。 1、if语句&#xff1a;if语句作为选择语句&#xf…

选择结构。

1. 掌握if(如果)选择(分支)结构 注意&#xff1a; 经常会用到标志位&#xff0c;定义标志位的时候 也得考虑其位置 是局部变量还是全局变量 掌握基本if if(条件){// 条件成立时执行的内容 }掌握if-else(互斥) if(条件){// 条件成立 }else{// 条件不成立 }一般流程图也是这样…