07.7. 稠密连接网络(DenseNet)
文章目录
- 7.7. 稠密连接网络(DenseNet)
- 7.7.1. 从ResNet到DenseNet
- 7.7.2. 稠密块体
- 7.7.3. 过渡层
- 7.7.4. DenseNet模型
- 7.7.5. 训练模型
- 7.7.6. 小结
7.7. 稠密连接网络(DenseNet)
ResNet极大地改变了如何参数化深层网络中函数的观点。
稠密连接网络(DenseNet)在某种程度上是ResNet的逻辑扩展。
7.7.1. 从ResNet到DenseNet
DenseNet这个名字由变量之间的“稠密连接”而得来,最后一层与之前的所有层紧密相连。 稠密连接如 图所示
稠密网络主要由2部分构成:稠密块(dense block)和过渡层(transition layer)。
前者定义如何连接输入和输出,而后者则控制通道数量,使其不会太复杂。
7.7.2. 稠密块体
DenseNet使用了ResNet改良版的“批量规范化、激活和卷积”架构。
我们首先实现一下这个架构。
import torch
from torch import nn
from d2l import torch as d2ldef conv_block(input_channels, num_channels):return nn.Sequential(nn.BatchNorm2d(input_channels), nn.ReLU(),nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1))# 一个稠密块由多个卷积块组成,每个卷积块使用相同数量的输出通道。 然而,在前向传播中,我们将每个卷积块的输入和输出在通道维上连结
class DenseBlock(nn.Module):def __init__(self, num_convs, input_channels, num_channels):super(DenseBlock, self).__init__()layer = []for i in range(num_convs):layer.append(conv_block(num_channels * i + input_channels, num_channels))self.net = nn.Sequential(*layer)def forward(self, X):for blk in self.net:Y = blk(X)# 连接通道维度上每个块的输入和输出X = torch.cat((X, Y), dim=1)return X# 在下面的例子中,我们定义一个有2个输出通道数为10的DenseBlock。
# 卷积块的通道数控制了输出通道数相对于输入通道数的增长,因此也被称为增长率(growth rate)。blk = DenseBlock(2, 3, 10)
X = torch.randn(4, 3, 8, 8)
Y = blk(X)
Y.shape# result
torch.Size([4, 23, 8, 8])
7.7.3. 过渡层
由于每个稠密块都会带来通道数的增加,使用过多则会过于复杂化模型。
而过渡层可以用来控制模型复杂度
def transition_block(input_channels, num_channels):return nn.Sequential(nn.BatchNorm2d(input_channels), nn.ReLU(),nn.Conv2d(input_channels, num_channels, kernel_size=1),nn.AvgPool2d(kernel_size=2, stride=2))# 对上一个例子中稠密块的输出使用通道数为10的过渡层。 此时输出的通道数减为10,高和宽均减半。
blk = transition_block(23, 10)
blk(Y).shape# result
torch.Size([4, 10, 4, 4])
7.7.4. DenseNet模型
我们来构造DenseNet模型。DenseNet首先使用同ResNet一样的单卷积层和最大汇聚层。
b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),nn.BatchNorm2d(64), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))# 在每个模块之间,ResNet通过步幅为2的残差块减小高和宽,DenseNet则使用过渡层来减半高和宽,并减半通道数。
# num_channels为当前的通道数
num_channels, growth_rate = 64, 32
num_convs_in_dense_blocks = [4, 4, 4, 4]
blks = []
for i, num_convs in enumerate(num_convs_in_dense_blocks):blks.append(DenseBlock(num_convs, num_channels, growth_rate))# 上一个稠密块的输出通道数num_channels += num_convs * growth_rate# 在稠密块之间添加一个转换层,使通道数量减半if i != len(num_convs_in_dense_blocks) - 1:blks.append(transition_block(num_channels, num_channels // 2))num_channels = num_channels // 2# 与ResNet类似,最后接上全局汇聚层和全连接层来输出结果。
net = nn.Sequential(b1, *blks,nn.BatchNorm2d(num_channels), nn.ReLU(),nn.AdaptiveAvgPool2d((1, 1)),nn.Flatten(),nn.Linear(num_channels, 10))
7.7.5. 训练模型
由于这里使用了比较深的网络,本节里我们将输入高和宽从224降到96来简化计算。
lr, num_epochs, batch_size = 0.1, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())# result
loss 0.140, train acc 0.950, test acc 0.838
5569.1 examples/sec on cuda:0
7.7.6. 小结
在跨层连接上,不同于ResNet中将输入与输出相加,稠密连接网络(DenseNet)在通道维上连结输入与输出。
DenseNet的主要构建模块是稠密块和过渡层。
在构建DenseNet时,我们需要通过添加过渡层来控制网络的维数,从而再次减少通道的数量。
07.7. 稠密连接网络(DenseNet)相关推荐
- (pytorch-深度学习)实现稠密连接网络(DenseNet)
稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作.稠密连接网络(DenseNet)与ResNet的主要区别在于在跨层连接上的主要区别: ResNet使用相加 Dens ...
- MXNet对DenseNet(稠密连接网络)的实现
论文地址:Densely Connected Convolutional Networks DenseNet其实跟前面的ResNet是很相似的,我们知道ResNet的梯度可以直接通过身份函数(激活函数 ...
- DenseNet稠密连接网络(pyTorch源码)
原文:https://blog.csdn.net/qq_43360533/article/details/107448369 目录 1 Introduction 3 过渡层 4 DenseNet模型 ...
- 《动手学深度学习》第二十三天---稠密连接网络(DenseNet)
(一)DenseNet DenseNet作为另一种拥有较深层数的卷积神经网络,具有如下优点: (1) 相比ResNet拥有更少的参数数量. (2) 旁路加强了特征(feature)的重用. (3) 网 ...
- 稠密连接网络(DenseNet)
普通块 稠密块 其本质是把映射为如下: DenseNet网络 直观认识 用数学式子表达是: 参考文献 1 Dive into Deep Learning: 2 https://mp.csdn.net/ ...
- 经典网络结构 (六):DenseNet (Densely Connected Networks 稠密连接网络)
目录 Function Decomposition 稠密块(dense block) 过渡层(transition layer) DenseNet 模型 Why do we use average p ...
- Pytorch Note32 稠密连接的卷积网络 DenseNet
Pytorch Note32 稠密连接的卷积网络 DenseNet 文章目录 Pytorch Note32 稠密连接的卷积网络 DenseNet DenseNet Dense Block DenseN ...
- 轻量级卷积网络DenseNet:密集连接卷积网络
原文地址:CVPR 2017 <Densely Connected Convolutional Networks> 卷积神经网络如何提高效果: 网络做得更深:ResNet,解决了网络深时的 ...
- DenseNet稠密连接层
DenseNet稠密连接层 1.介绍 与ResNet的主要区别在于,DenseNet里模块B的输出不是像ResNet那样和模块A的输出相加,而是在通道维上连结. DenseNet的主要构建模块是稠密块 ...
最新文章
- inspinia中文管理后台_赤峰当地神马推广后台哪里有
- 计算机技术在本专业方面的论文,计算机技术专业论文
- docker学习笔记(六)docker-compose
- java 检测硬盘原理_深入Java核心 Java内存分配原理精讲
- 网站开发和企业级开发有什么区别?
- 38--合并两个排序的链表
- slr1文法_SLR的完整形式是什么?
- CSS 横向导航栏(由竖向改成横向 float)
- java设计模式(八) 适配器模式
- 在业务控制方法中写入普通变量收集参数
- 学会计为什么要学计算机基础,会计专业学生为什么要学数据库
- 鸿蒙大陆6.1正式版 密码,天寒大陆1.06下载 天寒大陆1.06正式版 附游戏攻略及隐藏英雄密码 魔兽防守地图 下载-脚本之家...
- UVA 12304 2D Geometry 110 in 1! 六个直线与圆的问题+经典几何
- Python批量采集百度相关搜索词教程
- (附源码)springboot家庭财务分析系统 毕业设计 641323
- 移动端APP第一次登录和自动登录流程
- 一体化伺服电机一圈多少脉冲
- selenium翻页获取京东图书名称和价格
- 零和博弈、正和博弈和负和博弈
- 杭电1856——并差集