Resnet152结构
时间: 2025-01-24 08:00:34 AIGC 浏览: 106
### ResNet152 网络架构详解
#### 初始层
ResNet152 的初始部分由一个7×7的卷积层组成,该层具有64个滤波器,并采用步幅为2的方式处理输入图像。随后是一个最大池化层,其窗口大小同样为3×3,步幅也为2。这一阶段的结果是将原始图片尺寸减小至原来的四分之一。
#### 主干网络结构
主干网路主要分为四个阶段(Stage),每个阶段包含了多个残差块:
- **Stage 1**: 包含三个瓶颈型残差单元,通道数从64扩展到256。
- **Stage 2**: 同样有八个这样的单元,但此时输出特征图的空间分辨率进一步下降一半,而通道数量则增加到了512。
- **Stage 3**: 此处设计了三十六个连续堆叠的标准或改进版Bottleneck Units, 输出维度变为1024维向量表示形式,在此期间空间尺度再次被压缩两倍。
- **Stage 4**: 最终五次重复构建更深更复杂的模式识别能力更强的功能表达方式——即拥有2048个过滤器的最后一组bottlenecks units[^1]。
```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
def make_layer(block, planes, blocks, stride=1):
downsample = None
if stride != 1 or inplanes != block.expansion * planes:
downsample = nn.Sequential(
nn.Conv2d(inplanes, block.expansion*planes, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(block.expansion*planes)
)
layers = []
layers.append(block(inplanes, planes, stride, downsample))
inplanes = planes * block.expansion
for i in range(1, blocks):
layers.append(block(inplanes, planes))
return nn.Sequential(*layers)
class ResNet(nn.Module):
def __init__(self, block, layers, num_classes=1000):
global inplanes
inplanes = 64
super(ResNet, self).__init__()
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,bias=False)
self.bn1 = nn.BatchNorm2d(64)
self.relu = nn.ReLU(inplace=True)
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.layer1 = make_layer(block, 64, layers[0])
self.layer2 = make_layer(block, 128, layers[1], stride=2)
self.layer3 = make_layer(block, 256, layers[2], stride=2)
self.layer4 = make_layer(block, 512, layers[3], stride=2)
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(512 * block.expansion, num_classes)
# 初始化权重...
resnet152 = ResNet(Bottleneck, [3, 8, 36, 3]) # 定义ResNet152模型实例
```
#### 特征融合机制
为了缓解深层网络中的梯度消失/爆炸问题并促进信息流动,ResNet引入了一种称为跳跃连接的设计理念。这种特殊的拓扑结构允许较早层次的信息直接传递给后续层次,从而形成所谓的“捷径”。当这些路径上的操作仅仅是恒等映射时,则构成了最简单的残差函数f(x)=x+F(x),其中F代表一系列非线性变换[^2]。
阅读全文
相关推荐

















