resnet34和resnet50结构图
ResNet(Residual Network)是一种非常流行的深度卷积神经网络架构,它在解决深度神经网络训练过程中的梯度消失和模型退化问题上取得了重大突破。ResNet34和ResNet50是ResNet的两个不同版本,它们的主要区别在于网络的深度和参数量。
ResNet34的结构图如下所示:
输入层 -> 卷积层 -> 批归一化层 -> ReLU激活函数 -> 残差块 * 10 -> 全局平均池化层 -> 全连接层 -> 输出层
其中,每个残差块由两个卷积层和一个跳跃连接组成。ResNet34总共有10个残差块,因此网络的深度为34层。
ResNet50的结构图如下所示:
输入层 -> 卷积层 -> 批归一化层 -> ReLU激活函数 -> 残差块 * 3 -> 残差块 * 4 -> 残差块 * 6 -> 残差块 * 3 -> 全局平均池化层 -> 全连接层 -> 输出层
与ResNet34相比,ResNet50的网络更深,包含了更多的残差块。具体来说,ResNet50有3个残差块的组合,每个组合包含了4个残差块,最后还有一个额外的残差块。因此,ResNet50总共有50层。
resnet34和resnet50结构图和区别
ResNet34与ResNet50的网络结构及其差异
ResNet34架构特点
ResNet34属于较浅版本的残差网络,采用了基本的残差块设计。该模型由多个堆叠的基础模块组成,每个基础模块通常包含两个3×3的卷积层[^4]。
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, inplanes, planes, stride=1, downsample=None):
super(BasicBlock, self).__init__()
self.conv1 = conv3x3(inplanes, planes, stride)
self.bn1 = nn.BatchNorm2d(planes)
self.relu = nn.ReLU(inplace=True)
self.conv2 = conv3x3(planes, planes)
self.bn2 = nn.BatchNorm2d(planes)
self.downsample = downsample
self.stride = stride
def forward(self, x):
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.downsample is not None:
identity = self.downsample(x)
out += identity
out = self.relu(out)
return out
ResNet50架构特点
相比之下,ResNet50则运用了更复杂的瓶颈(Bottleneck)结构来替代简单的双层卷积单元。这种改进不仅提高了计算资源利用率,还增强了特征表达能力。具体来说,每一个Bottleneck block包含了三个不同尺寸的卷积操作——首先是压缩通道数至四分之一的一维卷积;其次是标准的空间感知三维卷积;最后再扩展回原始宽度的一维卷积[^2]。
class Bottleneck(nn.Module):
expansion = 4
def __init__(self, inplanes, planes, stride=1, downsample=None):
super(Bottleneck, self).__init__()
self.conv1 = conv1x1(inplanes, planes)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = conv3x3(planes, planes, stride)
self.bn2 = nn.BatchNorm2d(planes)
self.conv3 = conv1x1(planes, planes * self.expansion)
self.bn3 = nn.BatchNorm2d(planes * self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
self.stride = stride
def forward(self, x):
identity = 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:
identity = self.downsample(x)
out += identity
out = self.relu(out)
return out
主要区别总结
- 层数:ResNet34总共拥有34个权重层,而ResNet50有50个。
- block类型:前者采用Basic Block作为构建单位,后者则是更为高效的Bottleneck Block。
- 参数量和计算成本:由于使用了更多层次以及更加精细的设计,ResNet50虽然更深但是却能在一定程度上减少整体参数数目并提高运行效率。
resnet34和resnet50结构图介绍
ResNet(Residual Network)是一种非常流行的深度残差网络,它在2015年由Kaiming He等人提出。ResNet通过引入残差连接(residual connection)解决了深度神经网络训练过程中的梯度消失和梯度爆炸问题,使得网络可以更深更容易训练。
ResNet34和ResNet50是ResNet系列中的两个典型模型,它们的结构图如下所示:
ResNet34结构图:
输入 | 卷积层(64个3x3卷积核) | 残差块(3个残差单元) | 全局平均池化 | 全连接层(输出类别数) | 输出
ResNet34由一个初始的卷积层和4个残差块组成,每个残差块包含多个残差单元。每个残差单元由两个卷积层和一个跳跃连接组成,其中第一个卷积层用于降低特征图的维度,第二个卷积层用于恢复特征图的维度。最后通过全局平均池化和全连接层得到最终的输出。
ResNet50结构图:
输入 | 卷积层(64个7x7卷积核,步长2) | 批量归一化 | 激活函数(ReLU) | 最大池化(3x3池化核,步长2) | 残差块(3个残差单元,每个残差单元包含3个卷积层) | 残差块(4个残差单元,每个残差单元包含4个卷积层) | 残差块(6个残差单元,每个残差单元包含6个卷积层) | 残差块(3个残差单元,每个残差单元包含3个卷积层) | 全局平均池化 | 全连接层(输出类别数) | 输出
ResNet50相比于ResNet34更深更复杂,它由一个初始的卷积层、4个残差块和多个残差单元组成。每个残差块内的残差单元数量不同,分别为3、4、6和3个。每个残差单元内部包含多个卷积层和跳跃连接。最后通过全局平均池化和全连接层得到最终的输出。
相关推荐















