文章目录

  • 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)相关推荐

  1. (pytorch-深度学习)实现稠密连接网络(DenseNet)

    稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作.稠密连接网络(DenseNet)与ResNet的主要区别在于在跨层连接上的主要区别: ResNet使用相加 Dens ...

  2. MXNet对DenseNet(稠密连接网络)的实现

    论文地址:Densely Connected Convolutional Networks DenseNet其实跟前面的ResNet是很相似的,我们知道ResNet的梯度可以直接通过身份函数(激活函数 ...

  3. DenseNet稠密连接网络(pyTorch源码)

    原文:https://blog.csdn.net/qq_43360533/article/details/107448369 目录 1 Introduction 3 过渡层 4 DenseNet模型 ...

  4. 《动手学深度学习》第二十三天---稠密连接网络(DenseNet)

    (一)DenseNet DenseNet作为另一种拥有较深层数的卷积神经网络,具有如下优点: (1) 相比ResNet拥有更少的参数数量. (2) 旁路加强了特征(feature)的重用. (3) 网 ...

  5. 稠密连接网络(DenseNet)

    普通块 稠密块 其本质是把映射为如下: DenseNet网络 直观认识 用数学式子表达是: 参考文献 1 Dive into Deep Learning: 2 https://mp.csdn.net/ ...

  6. 经典网络结构 (六):DenseNet (Densely Connected Networks 稠密连接网络)

    目录 Function Decomposition 稠密块(dense block) 过渡层(transition layer) DenseNet 模型 Why do we use average p ...

  7. Pytorch Note32 稠密连接的卷积网络 DenseNet

    Pytorch Note32 稠密连接的卷积网络 DenseNet 文章目录 Pytorch Note32 稠密连接的卷积网络 DenseNet DenseNet Dense Block DenseN ...

  8. 轻量级卷积网络DenseNet:密集连接卷积网络

    原文地址:CVPR 2017 <Densely Connected Convolutional Networks> 卷积神经网络如何提高效果: 网络做得更深:ResNet,解决了网络深时的 ...

  9. DenseNet稠密连接层

    DenseNet稠密连接层 1.介绍 与ResNet的主要区别在于,DenseNet里模块B的输出不是像ResNet那样和模块A的输出相加,而是在通道维上连结. DenseNet的主要构建模块是稠密块 ...

最新文章

  1. inspinia中文管理后台_赤峰当地神马推广后台哪里有
  2. 计算机技术在本专业方面的论文,计算机技术专业论文
  3. docker学习笔记(六)docker-compose
  4. java 检测硬盘原理_深入Java核心 Java内存分配原理精讲
  5. 网站开发和企业级开发有什么区别?
  6. 38--合并两个排序的链表
  7. slr1文法_SLR的完整形式是什么?
  8. CSS 横向导航栏(由竖向改成横向 float)
  9. java设计模式(八) 适配器模式
  10. 在业务控制方法中写入普通变量收集参数
  11. 学会计为什么要学计算机基础,会计专业学生为什么要学数据库
  12. 鸿蒙大陆6.1正式版 密码,天寒大陆1.06下载 天寒大陆1.06正式版 附游戏攻略及隐藏英雄密码 魔兽防守地图 下载-脚本之家...
  13. UVA 12304 2D Geometry 110 in 1! 六个直线与圆的问题+经典几何
  14. Python批量采集百度相关搜索词教程
  15. (附源码)springboot家庭财务分析系统 毕业设计 641323
  16. 移动端APP第一次登录和自动登录流程
  17. 一体化伺服电机一圈多少脉冲
  18. selenium翻页获取京东图书名称和价格
  19. 零和博弈、正和博弈和负和博弈
  20. 杭电1856——并差集

热门文章

  1. 拼多多网店没有货源怎么办?拼多多上货助手店铺配置教程
  2. imageReady 图片预加载
  3. 自考大专学历被单位认可吗
  4. 写外贸开发信时不知道收件人的名字?可以用这9种方式来称呼对方
  5. MOTO XT702添加开机音乐
  6. 硅谷一流成功人士是如何分配时间的?
  7. 旅游联盟链源码--蚁从联盟链系统开发功能以及源码分享
  8. npm 依赖?不熟知的 optionalDependencies(可选依赖项)
  9. Ae 表达式语言引用(合集)
  10. 时间序列预测的7种方法