resnet50中的bottleneck结构
时间: 2025-01-09 21:38:22 浏览: 4
### ResNet50 中的 Bottleneck 结构详解
#### 什么是Bottleneck结构
在ResNet架构中,为了进一步减少计算量并提高效率,在较深版本如ResNet50里采用了所谓的瓶颈层(Bottleneck Layer)。这种特殊的设计不仅能够有效降低参数数量,还能保持甚至提升模型的表现力。
#### 具体组成
对于ResNet50而言,其主要由多个堆叠起来的标准卷积模块构成。然而不同于浅层版本采用简单重复的基础单元形式,这里引入了更为复杂的三层组合方式作为基础构建块——即所谓"Bottleneck"单元[^2]:
- **第一个1×1卷积**:负责降维操作,通常会将输入特征图通道数减半;
- **最后一个1×1卷积**:用于恢复原始维度大小的同时也起到融合信息的作用。
此三步流程构成了完整的Bottleneck子模块,并且在整个网络内部被多次迭代使用以形成更深层次的整体框架。
#### PyTorch 实现示意代码
下面给出一段基于PyTorch框架下定义上述描述中的单个Bottleneck Unit实例化方法:
```python
import torch.nn as nn
class Bottleneck(nn.Module):
expansion = 4
def __init__(self, inplanes, planes, stride=1, downsample=None):
super(Bottleneck, self).__init__()
# First Convolution (1x1)
self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
# Second Convolution (3x3)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
# Third Convolution (1x1), expand back to original size with factor of 'expansion'
self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False)
self.bn3 = nn.BatchNorm2d(planes * self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
self.stride = stride
def forward(self, x):
residual = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
if self.downsample is not None:
residual = self.downsample(x)
out += residual
out = self.relu(out)
return out
```
阅读全文