机器学习——稠密连接网络DenseNet
从ResNet到DesNet
稠密块体
DenseNet使用了ResNet改良版的“批量规范化、激活和卷积”架构(参见 7.6节中的练习)。 我们首先实现一下这个架构。
1 2 3 4 5 6 7 8 9 | import torch from torch import nn from d2l import torch as d2l def 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 )) |
1个稠密块由多个卷积块组成,每个卷积块使用相同数量的输出通道。 然而,在前向传播中,我们将每个卷积块的输入和输出在通道维上连结。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
。
1 2 3 4 | blk = DenseBlock( 2 , 3 , 10 ) X = torch.randn( 4 , 3 , 8 , 8 ) Y = blk(X) Y.shape |
torch.Size([4, 23, 8, 8])
过渡层
DenseNet模型
总结
-
在跨层连接上,不同于ResNet中将输入与输出相加,稠密连接网络(DenseNet)在通道维上连结输入与输出。
-
DenseNet的主要构建模块是稠密块和过渡层。
-
在构建DenseNet时,我们需要通过添加过渡层来控制网络的维数,从而再次减少通道的数量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)