resnet50网络Bottleneck Block详解
时间: 2024-06-19 22:01:59 浏览: 242
ResNet50是一种深度残差网络(Residual Network),其中的关键组件是Bottleneck Block,也称为三元组块。这种设计允许网络在增加深度的同时避免梯度消失和过拟合问题。Bottleneck Block由三个主要部分组成:
1. **扩张卷积(Expansion Convolution)**:通常是一个1x1的卷积层,其作用是减小通道数(feature map的维度),从而降低计算量,并有助于提取更高级别的特征。
2. **主卷积(Depthwise Convolution)**:这是一个深度卷积(depthwise convolution),它的每个滤波器只对输入的一个通道进行卷积操作,这样可以显著扩展网络的容量而保持计算复杂度相对较低。这个步骤实际上是一个逐点的卷积,因为它对每个输入通道应用一个单独的滤波器。
3. **收缩卷积(Compression Convolution)**:又是一个1x1的卷积层,将上一步的输出通道数恢复到原始的尺寸,这部分也叫做投影层(projection shortcut),使得可以直接加上原始输入,这就是所谓的残差连接(residual connection)。这使得网络能够学习到如何直接添加输入到输出,即使在很深的层次,也可以通过这些连接直接传播信息。
Bottleneck Block的优势在于它允许在网络中加入更多的卷积层,而不会导致模型变得过于深而导致性能下降。它通过引入瓶颈结构和残差连接,使训练变得更加容易,同时也提高了模型的性能。
相关问题
Resnet50网络结构
### ResNet-50 网络架构详解
#### 残差块设计
ResNet-50 的核心在于残差块的设计,这些块通过引入跳跃连接(skip connections)解决了深层网络训练过程中遇到的梯度消失和退化问题[^1]。具体来说,残差块允许信息绕过某些层直接传递到后续层,从而简化了优化路径。
#### 基本组件
对于 ResNet-50 来说,主要采用的是瓶颈模块(Bottleneck Block),而不是基础模块(Basic Block)。这是因为当网络变得更深时,使用更复杂的瓶颈结构有助于提高性能并减少参数数量[^5]。每个瓶颈模块由三个卷积层构成:第一个是 1×1 卷积用于降维;第二个是 3×3 卷积负责空间特征提取;第三个再次利用 1×1 卷积恢复维度大小。
#### 整体结构概述
整个 ResNet-50 架构大约有五十多层,其中包括多个阶段性的重复单元以及初始和最终处理部分:
- **输入层**:接受固定尺寸图像作为输入。
- **卷积层 (Conv1)** :执行一次标准7x7的大尺度卷积操作,并接最大池化(Max Pooling),此过程会显著降低分辨率但增加通道数。
- **四个Stage** : Conv2_x, Conv3_x, Conv4_x 和 Conv5_x ,每一阶段内部包含若干个相同的残差子模块堆叠而成。随着stage加深,feature map的空间尺寸逐渐减小而channel数目相应增多。
- **全局平均池化(Global Average Pooling)**: 将最后一个 stage 输出转换成固定长度向量表示形式。
- **全连接层(Fully Connected Layer)**: 进行最后类别预测前的最后一道工序,通常后面跟着softmax激活函数输出概率分布。
```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__()
self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
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
```
ResNet50网络结构
### ResNet50 网络架构详解
#### 三层卷积层与最大池化层
ResNet50 开始部分由一个7×7, 64通道的卷积层构成,步长为2,填充方式采用same模式[^1]。紧随其后的是一个3×3的最大池化层,同样设置有stride=2参数。
#### Bottleneck 结构单元
对于ResNet50而言,采用了更为复杂的Bottleneck结构而非Basic Block来构建残差块。每一个Bottleneck包含了三个连续的小型卷积操作——首先是1×1大小、负责降维;接着是3×3尺寸用于提取特征;最后再通过另一个1×1卷积恢复维度并增加非线性变换能力[^4]。
#### 层级划分
整个网络被划分为四个阶段(Stage),每个阶段内部重复堆叠多个相同的Bottleneck模块:
- **Conv2_x**: 包含3个Bottlenecks;
- **Conv3_x**: 包括4个Bottlenecks;
- **Conv4_x**: 组成数量最多,达到6个Bottlenecks;
- **Conv5_x**: 则是由剩余的3个Bottlenecks组成。
这些不同层次的设计使得模型能够逐步加深对图像的理解程度,同时保持计算效率上的优势。
#### 残差连接机制
贯穿于各个Bottleneck之间的还有所谓的“捷径连接”,即直接将输入传递给后续层而不经过任何权重运算处理。这种设计有效解决了深层神经网络训练过程中容易遇到梯度消失问题,并促进了信息流动的有效性和稳定性。
```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__()
self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
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
```
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)