经典网络DenseNet介绍

article/2025/9/14 0:22:56

经典网络DenseNet(Dense Convolutional Network)由Gao Huang等人于2017年提出,论文名为:《Densely Connected Convolutional Networks》,论文见:https://arxiv.org/pdf/1608.06993.pdf

DenseNet以前馈的方式(feed-forward fashion)将每个层与其它层连接起来。在传统卷积神经网络中,对于L层的网络具有L个连接,而在DenseNet中,会有L(L+1)/2个连接。每一层的输入来自前面所有层的输出。

DenseNet网络:

(1).减轻梯度消失(vanishing-gradient)。

(2).加强feature传递。

(3).鼓励特征重用(encourage feature reuse)。

(4).较少的参数数量。

Dense Block:像GoogLeNet网络由Inception模块组成、ResNet网络由残差块(Residual Building Block)组成一样,DenseNet网络由Dense Block组成,论文截图如下所示:每个层从前面的所有层获得额外的输入,并将自己的特征映射传递到后续的所有层,使用级联(Concatenation)方式,每一层都在接受来自前几层的”集体知识(collective knowledge)”。增长率(growth rate)k是每个层的额外通道数。

Growth rate:如果每个H_{l}函数产生k个feature-maps,那么第l层产生k_{0}+k(l-1)个feature-maps。k_{0}是输入层的通道数。将超参数k称为网络的增长率。

DenseNet Basic Composition Layer:BatchNorm(BN)-ReLu-3*3 Conv

DenseNet-B(Bottleneck Layers):在BN-ReLu-3*3 Conv之前进行BN-ReLU-1*1 Conv操作,减少feature maps size。

Transition Layer(过渡层):采用1*1 Conv和2*2平均池化作为相邻Dense Block之间的转换层,减少feature map数和缩小feature map size,size指width*height。在相邻Dense Block中输出的feature map size是相同的,以便它们能够很容易的连接在一起。

DenseNet-BC:如果Dense Block包含m个feature-maps,则Transition Layer生成\theta m输出feature maps,其中0<\theta <1称为压缩因子。当\theta =1时,通过Transition Layers的feature-maps数保持不变。当\theta <1时,称为DenseNet-C,在实验中\theta =0.5。当同时使用Bottleneck和\theta <1的Transition Layers时,称为DenseNet-BC。

下图是一个DenseNet结构图,来自于论文:使用了3个Dense Blocks。DenseNet由多个Desne Block组成。每个Dense Block中的feature-map size相同。两个相邻Dense Block之间的层称为Transition Layers。通过卷积和池化来更改feature-map size。

论文中给出了4种层数的DenseNet,论文截图如下所示:所有网络的增长率k是32,表示每个Dense Block中每层输出的feature map个数。

DenseNet-121、DenseNet-169等中的数字121、169是如何计算出来的:以121为例,1个卷积(Convolution)+6个Dense Block*2个卷积(1*1、3*3)+1个Transition Layer(1*1 conv)+12个Dense Block*2个卷积(1*1、3*3)+ 1个Transition Layer(1*1 conv)+24个Dense Block*2个卷积(1*1、3*3)+ 1个Transition Layer(1*1 conv)+ 16个Dense Block*2个卷积(1*1、3*3)+最后的1个全连接层=121。这里的层仅指卷积层和全连接层,其它类型的层并没有计算在内

公式表示:其中H_{l}(\cdot )表示非线性转换函数

(1).传统的网络在l层的输出为:x_{l}=H_{l}(x_{l-1})

(2).ResNet在l层的输出为:x_{l}=H_{l}(x_{l-1})+x_{l-1}

(3).DenseNet在l层的输出为:x_{l}=H_{l}([x_{0},x_{1},\cdots ,x_{l-1}])

假如输入图像大小为n*n,过滤器(filter)为f*f,padding为p,步长(stride)为s,则输出大小为:计算卷积层大小,如果商不是整数,向下取整,即floor函数;计算池化层大小,如果商不是整数,向上取整,即ceil函数。参考:https://blog.csdn.net/fengbingchun/article/details/80262495

在https://github.com/fengbingchun/Caffe_Test/tree/master/test_data/Net/DenseNet 上整理了DenseNet prototxt文件。

这里描述下DenseNet-121架构:k=32,与上表中"DenseNet-121"有所差异

(1).输入层(Input):图像大小为224*224*3。

(2).卷积层Convolution+BatchNorm+Scale+ReLU:使用64个7*7的filter,stride为2,padding为3,输出为112*112*64,64个feature maps。

(3).Pooling:最大池化,filter为3*3,stride为2,padding为1,输出为57*57*64,64个feature maps。

(4).Dense Block1:输出为57*57*(64+32*6)=57*57*256,256个feature maps。

连续6个Dense Block,每个Dense Block包含2层卷积,卷积kernel大小依次为1*1、3*3,在卷积前进行BatchNorm+Scale+ReLU操作,第1、2个卷积输出feature maps分别为128、32。因为k=32,所以每个Dense Block输出feature maps数会比上一个Dense Block多32。每个Dense Block后做Concat操作。

(5).Transition Layer1:输出为29*29*128,128个feature maps。

A.BatchNorm+Scale+ReLU+1*1 conv,输出57*57*128。

B.平均池化,filter为2*2,stride为2,输出29*29*128。

(6).Dense Block2:输出为29*29*(128+32*12)=29*29*512,512个feature maps。

连续12个Dense Block,每个Dense Block包含2层卷积,卷积kernel大小依次为1*1、3*3,在卷积前进行BatchNorm+Scale+ReLU操作,第1、2个卷积输出feature maps分别为128、32。因为k=32,所以每个Dense Block输出feature maps数会比上一个Dense Block多32。每个Dense Block后做Concat操作。

(7).Transition Layer2:输出为15*15*256,256个feature maps。

A.BatchNorm+Scale+ReLU+1*1 conv,输出29*29*256。

B.平均池化,filter为2*2,stride为2,输出15*15*256。

(8).Dense Block3:输出为15*15*(256+32*24)=15*15*1024,1024个feature maps。

连续24个Dense Block,每个Dense Block包含2层卷积,卷积kernel大小依次为1*1、3*3,在卷积前进行BatchNorm+Scale+ReLU操作,第1、2个卷积输出feature maps分别为128、32。因为k=32,所以每个Dense Block输出feature maps数会比上一个Dense Block多32。每个Dense Block后做Concat操作。

(9).Transition Layer3:输出为8*8*512,512个feature maps。

A.BatchNorm+Scale+ReLU+1*1 conv,输出15*15*512。

B.平均池化,filter为2*2,stride为2,输出8*8*512。

(10).Dense Block4:输出为8*8*(512+32*16)=8*8*1024,1024个feature maps。

连续16个Dense Block,每个Dense Block包含2层卷积,卷积kernel大小依次为1*1、3*3,在卷积前进行BatchNorm+Scale+ReLU操作,第1、2个卷积输出feature maps分别为128、32。因为k=32,所以每个Dense Block输出feature maps数会比上一个Dense Block多32。每个Dense Block后做Concat操作。

(11).Classification Layer:

A.平均池化:filter为8*8,stride为1,padding为0,输出为1*1*1024,1024个feature maps。

B.卷积:kernel大小为1*1,输出1000个feature maps。

C.输出层(Softmax):输出分类结果,看它究竟是1000个可能类别中的哪一个。

可视化结果如下图所示:

GitHub:https://github.com/fengbingchun/NN_Test


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

相关文章

DenseNet 浅析

文章目录 1. 简介2. DenseNet 浅析2.1 网络结构2.2 Dense Block2.3 Bottleneck Layer2.4 Trainsition Layer 3. 个人理解4. DenseNet-121 的 PyTorch 实现 1. 简介 DenseNet 见于论文《Densely Connected Convolutional Networks》&#xff0c;是 CVPR2017 的 oral。一般而言&a…

【深度学习原理第9篇】DenseNet模型详解

目录 一、背景概述二、DenseNet2.1 DenseBlock2.2 Transition Layer2.3 DenseNet网络结构 实验结果 一、背景概述 DenseNet是2017年CVPR的最佳论文&#xff0c;它不同于ResNet中的残差结构&#xff0c;也不同于GoogLetNet中的Inception网络结构。DenseNet提出了一种新的提升性…

DenseNet(密集连接的卷积网络)

这里写目录标题 前言1. DenseNet网络2.设计理念2.1 Resnet2.2 DenseNet2.3 密集连接的实现 3. DenseNet的实现3.1 Dense Block的实现3.2 Transition Layer的实现3.3 DenseNet网络3.4 DenseNet-121网络 4. 测试 前言 DenseNet是指Densely connected convolutional networks&…

DenseNet详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、DenseNet网…

DenseNet网络结构详解及代码复现

1. DenseNet论文详解 Abstract: 如果在靠近输入和靠近输出层之间包含更短的连接&#xff0c;那么卷积神经网络可以很大程度上更深&#xff0c;更准确和高效地进行训练。根据这一结果&#xff0c;我们提出了DenseNet&#xff08;密集卷积网络&#xff09;: 对于每一层&#xf…

设计模式六大原则(6)开闭原则(Open Close Principle)

开闭原则&#xff08;Open Close Principle&#xff09; 定义&#xff1a;一个软件实体如类、模块和函数应该对扩展开放&#xff0c;对修改关闭。 问题由来&#xff1a;在软件的生命周期内&#xff0c;因为变化、升级和维护等原因需要对软件原有代码进行修改时&#xff0c;可…

Linux C/C++编程: 文件操作open/close、fopen与freopen/fclose

open是linux下的底层系统调用函数&#xff0c;fopen与freopen c/c下的标准I/O库函数&#xff0c;带输入/输出缓冲。 linxu下的fopen是open的封装函数&#xff0c;fopen最终还是要调用底层的系统调用open。 所以在linux下如果需要对设备进行明确的控制&#xff0c;那最好使用底…

Linux之open()、close()函数

目录 open函数 函数介绍 头文件及函数原型 参数 close函数 函数介绍 头文件函数原型 open()、close()函数使用 open函数 函数介绍 在Linux中open()函数用来打开或创建一个文件&#xff0c;当打开文件失败时返回值为-1&#xff1b;成功则返回作为文件描述符(一个非负的…

Linux李哥私房菜——open、close和fd

open() 头文件&#xff1a;#include<fcntl.h>//在centos6.0中只要此头文件就可以#include<sys/types.h>#incldue<sys/stat.h> 功能&#xff1a;打开和创建文件&#xff08;建立一个文件描述符&#xff0c;其他的函数可以通过文件描述符对指定文件进行读取与…

详解C中的系统调用open/close/read/write

文章目录 open() and close()read() and write()实操:代码示例1 将in.txt文件中的内容写入到out.txt文件中&#xff08;一个一个字符写入&#xff09;2 将in.txt文件中的内容写入到out.txt文件中&#xff08;数组写入&#xff09; 先谈谈open/close/read/write与fopen/fclose/f…

JavaScript中window对象及open和close使用

Window对象 是一个顶级对象&#xff0c;不是任何对象的属性&#xff0c;所以可以不写window.xxx而直接使用内部的属性和方法。 实际上&#xff0c;在web前端开发时&#xff0c;所有的全局变量都自动成为window对象的属性 Window对象的属性 Screen History Location Navigat…

Python基础(十三)——文件操作(open函数、close函数)

本文以Python3以上为学习基础。 目录 1、 使用文件操作第一原则 2、open函数 2.1、文件打开模式 2.1.1、只读模式打开文件——只读&#xff08;r&#xff09; 2.1.2、读写模式打开文件——读写模式&#xff08;r&#xff09; ​ 2.1.3、写模式打开文件——写模式&#…

layer中的open与close

关于layer中的open方法与close方法 open方法open函数的定义open函数里面optionsopen函数中返回的值 close方法如何使用close方法关于layer中的一些发现 写在最后的话 open方法 open函数用来创建一个弹出层。 open函数的定义 形式为&#xff1a;layer.open(options) 例如&…

open函数详解与close函数详解

open() 头文件&#xff1a;#include<fcntl.h>//在centos6.0中只要此头文件就可以#include<sys/types.h>#incldue<sys/stat.h> 功能&#xff1a;打开和创建文件&#xff08;建立一个文件描述符&#xff0c;其他的函数可以通过文件描述符对指定文件进行读取与…

open和close函数

open函数&#xff1a;打开或创建文件 系统调用open可以用来打开普通文件、块设备文件、字符设备文件、链接文件和管道文件&#xff0c;但只能用来创建普通文件&#xff0c;创建特殊文件需要使用特定的函数。 头文件&#xff1a; #include <sys/types.h> #include <…

linux close 头文件,Linux open close read write lseek函数的使用

我们经常需要在Linux中进行文件操作,今天我就来分享下文件操作用到的一些函数 1 open 所需头文件: 函数原型:int open(const char *pathname,flags,int perms) pathname:被打开的文件名,可包含路径 flag :文件打开的方式,参数可以通过“|” 组合构成,但前3 个参数不能互…

linux的open close函数

目录 opencloseopen 参数说明代码 解析报错不用怕,我提供解决思路 前言 开始进入学linux的第一个阶段 第一阶段的 Linux的系统函数 第一节 先讲 open close 函数 open 怎么在liunx查看呢 我们利用下面的命令 linux自带的工具 man 手册 man 1 是普通shell 的命令 比如 ls ma…

简述Java序列化的几种方式

目录 JDK原生的序列化 字符串获取字节流 Protobuf Protostuff Thrift kryo hessian fst JSON字符串序列化 Jackson Gson FastJson 序列化和反序列化在网络传输过程中需要做的事情。 序列化 就是得的 字节流&#xff0c;反序列化就是得的对象。 下面梳理Java编程需要…

java序列化之writeObject 和readObject

什么是序列化和反序列化&#xff1f; 序列化&#xff1a;将对象转化为字节的过程称为序列化过程。 反序列化&#xff1a;将字节转化为对象的过程称为反序列化。 序列化主要应用于网络传输和数据存储的场景。在java中&#xff0c;只有类实现了java.io.serializable接口&#x…

java序列化总结

目录 对象序列化是什么 为什么需要序列化与反序列化 序列化及反序列化相关知识 Java 序列化中如果有些字段不想进行序列化&#xff0c;怎么办&#xff1f; Java序列化接口 java.io.Serializable 使用序列化和serialVersionUID进行类重构 Java外部化接口 java.io.Externa…