密集残差模块的作用

InceptionModule是Google提出的一种深度学习网络结构,核心思想是通过11、33、55卷积和33最大池化结合,提取图像不同尺度的特征,以获取更丰富的信息表示。图b对图a进行优化,通过11卷积降维减少参数量。使用1*1卷积进一步降低计算复杂性,同时保持模型性能。该模块的设计旨在平衡特征提取与计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.csdn.net/dongjinkun/article/details/109185101
https://zhuanlan.zhihu.com/p/41691301

nception Module基本组成结构有四个成分。11卷积,33卷积,55卷积,33最大池化。最后对四个成分运算结果进行通道上组合。这就是Inception Module的核心思想。通过多个卷积核提取图像不同尺度的信息,最后进行融合,可以得到图像更好的表征。

如上图所示,假设我们要提取猫脸特征,而上面两张图的猫脸占比显然不一样,那么我们就得用不同卷积核提取不同信息。信息分布比较全局性的图像采用大卷积核,信息分布比较局部性的图像采用小卷积核。

图b是对图a的改进,即在33卷积,55卷积前加11卷积,目的是为了先进行降维,相比较于原来结构减少了较多参数。而把11卷积放在3*3最大池化之后,相比较放在前面,也是为了参数量的减少。

图(a)中,将11、33、55卷积和33池化堆叠在一起,卷积池化后的feature map尺寸相同,对这结构设计的原因,我的理解是:众所周知,卷积核越大,说明感受野越大,提取的信息语义层次特征更高;卷积核越小,感受野越小,提取到的特征更为直观。将不同卷积核提取到的feature map叠加在一起,不仅有直观的特征,而且也有语义层次高的特征,这样特征信息会更加丰富。但设计Inception的初衷是为了保持高性能计算,这样5*5的卷积核的计算量显得未免也太大了,这与Inception设计的初衷相悖。于是Google团队对Inception的原始版本进行了改进,即Inception V1。

使用1*1卷积的优势:

### 深度学习中的残差连接和密集型网络 #### 残差连接(Residual Connections) 在构建非常深的卷积神经网络时,遇到的主要挑战之一是训练难度增加。随着层数加深,梯度消失问题变得更加严重,这使得模型难以收敛并达到最优性能。为了克服这一障碍,He等人提出了残差网络(ResNets)[^1]。 残差连接通过引入捷径路径(shortcut connection),即跳过一层或多层直接将输入传递给后续层来解决上述问题。具体来说,在标准前馈过程中加入了一个额外项——来自前面某一层未经修改的信息流。这种设计允许更高效的反向传播过程,因为误差信号可以直接传回较早阶段而不会被权重矩阵削弱太多次。 ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_planes, planes, stride=1): super(BasicBlock, self).__init__() self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.shortcut = nn.Sequential() if stride != 1 or in_planes != self.expansion*planes: self.shortcut = nn.Sequential( nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(self.expansion*planes) ) def forward(self, x): out = nn.ReLU()(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) out += self.shortcut(x) # Residual Connection out = nn.ReLU()(out) return out ``` 这段代码展示了如何实现一个简单的带有跳跃连接的基础模块。当步幅不等于1或输入通道数与输出不同,则创建一个新的`shortcut`以匹配维度;否则保持恒定不变。 #### 密集型网络(Dense Networks) DenseNet是一种特殊的架构形式,它进一步扩展了残差的思想。不同于传统的ResNet仅保留两个节点之间的直接联系,DenseNet让每一层都与其他所有层相连形成稠密连接模式。这意味着每经过一次转换操作后的特征图都会作为下一层以及之后各层的一部分输入参与到计算当中去[^4]。 这样的结构不仅促进了信息流动的有效性和参数效率的最大化利用,而且有助于缓解梯度弥散现象的发生。由于每个新添加的功能都可以立即访问到之前所有的低级表示,因此可以更好地捕捉数据内部复杂的依赖关系。 ```python def transition_layer(x, compression_factor=0.5): num_output_features = int(x.size()[1]*compression_factor) layer = nn.Sequential( nn.BatchNorm2d(num_features=x.size()[1]), nn.ReLU(inplace=True), nn.Conv2d(in_channels=x.size()[1], out_channels=num_output_features, kernel_size=(1, 1), stride=(1, 1)), nn.AvgPool2d(kernel_size=2, stride=2) ) return layer(x) def dense_block(x, num_layers, growth_rate=12): features = [x] for i in range(num_layers): new_features = bottleneck_function(torch.cat(features, dim=1))[:, :, :growth_rate*(i+1)] features.append(new_features) concatenated_features = torch.cat(features, dim=1) return concatenated_features ``` 这里给出了用于构建DenseNet的关键组件:过渡层(`transition_layer`)负责减少空间尺寸的同时压缩特征数量;而在密集块(`dense_block`)内则实现了多层之间共享特征映射的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值