ResNet50的初步认知和复现链接

本文探讨了深度神经网络中的问题,如梯度消失和爆炸,以及ResNet如何通过残差块来应对深度网络退化。残差块的核心在于保持网络结构不变,利用跨层连接学习特征修正。介绍了网络结构、参数和复现的过程,涉及ResNet50的详细结构和实现资源。

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

下文是自己学习和了解到的,可能比较浅显,也可能比较散,主要作用还是帮自己记录,方便日后查看,所以很多东西都给出了链接,但愿对读者有所帮助,主要学习来源

一、前言

在2015年的Imagenet比赛中五项都是第一,错误率降低到了3.6%,超出了人眼的识别精度
论文:Deep Residual Learning for Image Recognition

回顾之前的网络:
LeNet:5层
AlexNet:8层
VGG:19层
GoogLeNet:22层
ResNet:152层
神经网络层数越深,越可以提取更多层次的特征,对特征进行融合,可以提升模型表现,但具有两面性

二、存在问题

Problem of Deep Network(存在的问题)

Vanishing gradients:梯度消失
Exploding gradients:梯度爆炸

Solution:(解决方法)

Normalized initialization 归一化
Intermediate normalization layers(BatchNorm) 中间层归一化

当然对于梯度消失可以通过改变激活函数来解决,梯度爆炸可以通过梯度裁剪(clip)来解决

当神经网络的层数增加时,容易引发神经网络的退化(峰型)

1
伴随着网络深度的增加,精度饱和,然后迅速退化,于是发现神经网络退化才是神经网络难以训练的原因,而不是梯度消失和梯度爆炸,于是提出了ResNet网络

三、残差块

介绍残差块之前,先看下面是一个简单的模型介绍,右边模型相较于左边多一个网络,正常来说B模型比A模型的效果好,如果B的网络为恒等因式,那么A模型的解其实是B模型解的子空间

在这里插入图片描述
恒等因式:输出与输入相同,后来何凯明也写了一篇关于恒等因式的论文,下面图片下方的*号是论文名称,有兴趣可以看看

3
残差块:F(x)就是残差,整个网络被称为残差网络
4
输入是x,如果使用恒等因式,那么输出为H(x)—>y = x;但如果使用跨层连接,那么最终的输出就会变成F(x)+x;使用F(x)+x减去H(x)就可以得到F(x),他就是残差,作者认为这样训练出的网络相对于对x进行修正,F(x)就是修正的幅度。

四、残差块的优点

5
1.没有增加任何的额外参数和计算复杂度
2.可以通过随机梯度下降进行反向传播
3.依赖现有框架实现,实现简单(tensorflow,pytorch)

五、网络结构

在网络结构过程中block会出现维度不一样的情况,可以用两种方法(具体可以查看完整的网络结构图)
1.仍然执行恒等因式,额外填充0来增加维度,保证前后维度一样
2.用1×1的卷积维持维度的变化
6
ResNet50完整的网络结构图,网络图太大,可点击链接进去查看,也是借鉴的他人博客。

六、网络的参数

7
Conv1的7×7,64,stride 2:表示7*7的卷积核,64个通道,两个步长的卷积

七、复现

ResNet50的复现暂时没有细研究,可以移步该链接,代码和细节可以查看该链接,自己找到的比较好的资源,推荐有兴趣的可以看看。

### ResNet50模型降维方法及其实现方式 #### 1. 主要降维技术概述 ResNet50是一种深度残差网络,具有复杂的层次结构大量的参数。为了降低计算复杂性存储需求,可以采用多种降维技术来优化模型性能。常见的降维方法包括通道剪枝、低秩近似以及轻量化架构设计。 #### 2. 使用通道剪枝减少维度 通道剪枝是一种有效的模型压缩手段,它通过移除冗余特征图及其对应的权重矩阵来减小模型规模。具体来说,在训练过程中可以通过分析各卷积核的重要性指标(如L1范数),剔除贡献较小的部分从而达到降维目的[^1]。这种方法不仅能够显著削减参数数量,还能保持较高的精度水平。 ```python import torch.nn as nn class ChannelPrunedConv(nn.Module): def __init__(self, conv_layer, pruned_channels): super(ChannelPrunedConv, self).__init__() new_weight = conv_layer.weight[:, pruned_channels].clone() self.conv = nn.Conv2d(in_channels=new_weight.size(1), out_channels=conv_layer.out_channels, kernel_size=conv_layer.kernel_size, stride=conv_layer.stride, padding=conv_layer.padding, bias=(conv_layer.bias is not None)) with torch.no_grad(): self.conv.weight.copy_(new_weight) def forward(self, x): return self.conv(x) ``` #### 3. 利用低秩分解简化运算 另一种可行的方法是对权值张量执行奇异值分解(SVD),然后选取前k个最大的奇异向量重构原始数据,以此实现降维效果。此过程会将高阶乘加操作转换成更少次数的基础算子调用,进而提升推理效率并节省内存占用空间[^2]。 ```python from sklearn.decomposition import TruncatedSVD def low_rank_approximation(matrix, rank): svd = TruncatedSVD(n_components=rank) reduced_matrix = svd.fit_transform(matrix) reconstructed_matrix = svd.inverse_transform(reduced_matrix) return reconstructed_matrix ``` #### 4. 转换至轻量级变体 除了上述两种直接作用于现有框架内的调整策略外,还可以考虑迁移到专门针对移动端设备开发的精简版本——MobileNetV2或者ShuffleNet系列上运行相似功能的任务实例[^3]。这些改进版保留了原生特性的同时大幅降低了资源消耗程度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Aer

走过路过给个赏钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值