CNN卷积神经网络之ResNet

本文深入探讨了神经网络的退化问题,特别是随着网络深度增加导致的训练误差上升。ResNet通过引入残差块(ResidualBlock)解决了这一问题,其设计允许网络在增加深度时仍能保持性能。残差块通过学习残差映射,而不是直接学习目标映射,使得网络更容易优化。作者还分析了ResNet的改进版,包括将BN和ReLU前置,提高了网络的优化效率和防止过拟合的能力。实验结果显示,ResNet结构能够有效处理更深的网络,甚至在超过1000层后性能仍在提升。

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


未经本人同意,禁止任何形式的转载!

前言

《Deep Residual Learning for Image Recognition》
论文地址:https://arxiv.org/pdf/1512.03385.pdf.

2014年VGG达到19层,GoogLeNet达到22层,就算是15年Incepetion V2 42层,V3 44层,但resnet能达到数百上千层。resnet的提出始于2015年,在ILSVRC 2015夺得冠军。

神经网络的“退化”问题

随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大(但这并不是过拟合,因为在过拟合中训练loss是一直减小的)。当网络退化时,浅层网络比深层网络效果更好。
梯度弥散/爆炸成为训练深层次的网络的障碍,导致无法收敛。虽有一些方法可以弥补(合适的初始化,输入归一化)但深层网络却还是开始退化了,即增加网络层数却导致更大的误差。这是个优化问题,且难度的增长并不是线性的,越深的模型越难以优化
在这里插入图片描述

残差块(Residual Block)

如果堆积层降低了网络性能,那么我可以选择不要新堆积的层,按照这个思路,较深的模型所产生的训练误差不应该比较浅的模型高才对。Resnet设计了identity mappingresidual mapping,如果网络已经到达最优,继续加深网络,residual mapping将被尽量优化为0,只剩下identity mapping,这样理论上网络一直处于最优状态了,网络的性能也就不会随着深度增加而降低了。
在这里插入图片描述
如果期望的潜在映射为H(x),与其让F(x) 直接学习H(x)映射,不如学习残差H(x)−x,即F(x):=H(x)−x,这样原本的前向路径上就变成了F(x)+x,用F(x)+x来拟合H(x)。作者认为这样可能更易于优化,因为相比于让F(x)学习成恒等映射,让F(x)学习成0要更加容易。这样,即使网络加深,对于冗余的block,只需F(x)→0就可以得到恒等映射,性能不减

⊕ 为element-wise addition,要求参与运算的F(x)和x的尺寸要相同。

网络结构

在这里插入图片描述

在这里插入图片描述
ResNet用 average pool 代替全连接,这点跟Incepetion想得一致,节省大量参数。降采样是通过conv的stride=2实现的。此外,可见模块化的设计从VGGNet开始已经深入人心。
随着网络变得复杂(ResNet-50/101/152),为进一步减少参数,利用1x1卷积核进行降维,下面右图的bottleneck结构。第一个1x1的卷积把channel降维,然后在最后通过1x1卷积恢复channel数。
在这里插入图片描述
在这里插入图片描述
注意:当F(x)和x的通道数不同时虚线连接部分(在每个channel数改变的第一个残差块),采用计算方式:y=F(x)+Wx。即shortcut connection会进行一次1x1卷积给通道降维。
Residual Block之间的衔接,在原论文中,F(x)+x经过ReLU后直接作为下一个block的输入x。
在这里插入图片描述

Residual Block的分析与改进*

《Identity Mappings in Deep Residual Networks》
论文地址:https://arxiv.org/abs/1603.05027.
这是16年,原作者Kaiming He对网络进行的进一步分析和改进。

在这里插入图片描述

可见,新Residual Block结构具有更好的性能,能更好地避免“退化”,堆叠大于1000层后,性能仍在变好。
这里将shortcut路径视为主干路径,将残差路径视为旁路。通过保持shortcut路径的“干净”,可以让信息在前向传播和反向传播中平滑传递(论文中有做过实验对比)。因此,尽量不在主干路径引入1×1卷积等操作,同时将路径上的ReLU移到F(x)路径上。在残差路径上,将BN和ReLU提前(full pre-activation),获得了“Ease of optimization”以及“Reducing overfitting”的效果。

在这里插入图片描述
在卷积之后使用激活函数的方法叫做post-activation。作者通过调整ReLU和BN的使用位置得到了几个变种,通过对照试验对比这几种变异模型。实验结果也表明将激活函数移动到残差部分可以提高模型的精度。

res_block_v2顺序:#伪代码
res_x = BatchNormalization(x)
res_x = ReLU(res_x)
res_x = Conv2D(kernel_size=(3,3), x)

理解与反思

我一直试图从各个角度考虑Residual Block所带来的作用,仅仅将个人的想法写出来分享,抛砖引玉,希望有更好的理解可以留言,相互交流。
1)网络的层数对网路的性能有至关重要的影响,因此通过shortcut connection让网络自己来学习所需要的层数(如果网络已经到达最优,继续加深网络,residual mapping将被尽量优化为0,只剩下identity mapping,这样理论上网络一直处于最优状态了)。
2)也可以从模型集成的角度理解残差网络。
3)反向传播过程中,由链式法则得到梯度累乘,以往堆叠的网络很有可能发生梯度爆炸(λi>1)或者梯度变成0(λi<1),会阻碍残差网络信息的反向传递,从而影响残差网络的训练。常见的激活函数都容易产生类似的阻碍信息反向传播的问题。
在这里插入图片描述
利用残差网络,可以避免shortcut路径上的梯度消失和爆炸。shortcut路径将反向传播由连乘形式变为加法形式,梯度能更好的传到前面得到更新。
4)网络原本是让F(x) 直接学习H(x)映射,现在学习残差H(x)−x,即F(x):=H(x)−x。假设原本拟合的是H(x)=100,H’(x)=105的偏差只有5%。然而,如果去拟合H(x)−x=0,F’(x)=5的偏差却是100%,网络对于误差变得更加敏感,所以让F(x)学习成0要更加容易。

上一篇:CNN卷积神经网络之GoogLeNet(Incepetion V1-Incepetion V3).
下一篇:CNN卷积神经网络之Inception-v4,Inception-ResNet.

基于CNN卷积神经网络ResNet50残差网络)的项目通常用于图像分类、目标检测和图像分割等计算机视觉任务。ResNet50是一种深度卷积神经网络,具有50个卷积层,通过引入残差块(Residual Blocks)来解决深层网络中的梯度消失问题,从而使得网络能够更深、更复杂。 ### 项目概述 #### 1. 项目背景 在深度学习领域,卷积神经网络CNN)在图像处理任务中表现出色。ResNet50是其中的一个经典模型,因其在ImageNet数据集上的优异表现而被广泛应用。 #### 2. 项目目标 - **图像分类**:将输入图像分类到预定义的类别中。 - **目标检测**:识别并定位图像中的多个目标。 - **图像分割**:将图像分割成不同的区域,每个区域属于不同的类别。 #### 3. 技术路线 - **数据预处理**:包括图像缩放、归一化、数据增强等。 - **模型搭建**:使用ResNet50作为基础模型,进行微调或迁移学习。 - **模型训练**:使用训练数据进行模型训练,调整超参数以优化性能。 - **模型评估**:使用验证集和测试集评估模型性能,计算准确率、召回率、F1-score等指标。 - **模型部署**:将训练好的模型部署到生产环境中,提供API接口或集成到应用程序中。 ### 关键步骤 #### 数据预处理 ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(224, 224), batch_size=32, class_mode='categorical') ``` #### 模型搭建 ```python from tensorflow.keras.applications import ResNet50 from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, GlobalAveragePooling2D base_model = ResNet50(weights='imagenet', include_top=False) x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(num_classes, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) ``` #### 模型训练 ```python model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit( train_generator, steps_per_epoch=train_generator.samples // train_generator.batch_size, epochs=10, validation_data=validation_generator) ``` #### 模型评估 ```python test_loss, test_accuracy = model.evaluate(test_generator, steps=test_generator.samples // test_generator.batch_size) print('Test accuracy:', test_accuracy) ``` ### 应用场景 - **医疗影像分析**:如肿瘤检测、疾病分类。 - **自动驾驶**:如行人检测、车道识别。 - **安防监控**:如人脸识别、异常行为检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值