ResNet解读和1×1卷积介绍

1、Introduction

  深度卷积网络好在哪里?

-----它可以加很多层,把网络变得很深,不同程度的层可以得到不同等级的特征。

 作者提出一个问题--一个网络只是简单的堆叠就好了嘛?

——不是,当网络变得很深的时候,梯度会出现爆炸或者消失。一个解决方法,初始化时设置一个合适的权重,不要太大也不要太小。又或者在中间加入normalization(包括BN),可以使得校验每个层之间的那些输出和它梯度的那些均值和方差。上述两个方法可以让网络收敛,但是网络变深后,性能会变差(不是过拟合造成的,因为训练误差和测试误差都会变得很差),所以现在网络虽然收敛了,但是不能得到一个好的效果。

考虑一个比较浅的网络版本和一个比较深的网络版本(所谓深的版本是在所说的浅的网络中多加一些层进去),作者说如果你的浅的网络效果还不错的话,理论上深的网络是不应该变差的,因为深的网络加的那些层,总是可以把那些层学的变成一个恒等映射(identity mapping)。实际上做不到,SGD找不到这样一个优解。

这篇文章提出了一个方法,使得显示的构造出一个 identity mapping,深的网络不会变得比浅的网络差。作者命名为deep residual learning framework 。

2、结构

X 为浅层网络的输出。如果我们想要得到的映射为H(X),则我们让添加的非线性网络层去拟合残差映射F(X):=H(X)-X。原始的映射就可以写成F(X)+X。

shortcut connection快捷连接通常会跳过 1 个或者多个层,在 ResNet 中快捷连接直接运用了 identity mapping,意思就是将一个卷积栈的输入直接与这个卷积栈的输出相加。

这样有什么好处呢?

  1. 并没有增加新的参数
  2. 整个网络也仍然可以由 SGD 进行训练。
  3. 容易被通用的神经网络框架实现。

F(X)和X直接相加,因此需要保证他们的维度一定要一样。

如何处理输入和输出不同形状的情况?

---第一种,在输入和输出上添加一些额外的零,使得这两个形状能够对应起来,然后可以相加。

--第二种,投影,使用一个1×1卷积调整通道,使得形状可以对应起来。(1×1卷积层特点--在空间维度上不做任何的东西,主要是在通道维度上做改变,选择一个1×1卷积使得输出通道是输入通道的两倍,这样就能将残差连接的输入和输出对应起来。在ResnNet里面,如果把输出通道数翻了两倍,那么输入的高和宽会减小一半,所以这里步幅设置为2,使在高宽和通道上都能匹配上)。第三种,所有连接都做投影。(这里在论文中有做实验比较三种处理方法的优劣)

各种层数的残差结构

残差网络结构(以34层为例)--VGG-19是浅层网络

 更深的残差网络结构(50层以上),结构有所不同,设计了一个bottleneck结构

 通道数为256时,变得很大,出现的问题是计算复杂度会很高,这里做法是通过1×1卷积投影映射回64维,再做一个3×3通道数不变的卷积,然后再通过1×1卷积投影回去256维,因为输入是256维u,输出要匹配上,这样设计之后复杂度就跟左图差不多了。

补充-关于1×1卷积

理解1×1卷积的作用_dxwell6的博客-优快云博客_1×1卷积

1*1卷积核的作用_nefetaria的博客-优快云博客_1*1卷积核的作用

### ResNet1D 的深度学习模型结构与应用 #### 一、ResNet1D 的基本概念 ResNet1D 是一种针对一维信号处理设计的残差网络(Residual Network)。它的灵感来源于经典的二维残差网络(如 ResNet-50[^2]),但在架构上进行了调整以适应一维数据的特点。ResNet1D 主要用于时间序列分析、音频信号处理以及生物医学领域的一维信号建模。 在一维场景下,传统的卷积神经网络可能因层数加深而导致梯度消失或退化问题。ResNet1D 借助残差块的设计克服了这一挑战。具体来说,它通过引入跳跃连接(Skip Connections)来实现浅层特征深层特征之间的直接传递,从而有效缓解了训练过程中可能出现的优化困难。 #### 二、ResNet1D 的核心组件 ResNet1D 的主要组成部分包括以下几个方面: 1. **卷积操作** 卷积核通常是一维的形式,能够提取局部的时间依赖关系。这些卷积操作可以在不同尺度上捕捉到输入信号的关键模式[^1]。 2. **残差块** 每个残差块由多个卷积层组成,并附加一条从输入直接通往输出的路径。这条路径被称为跳跃连接,其作用是在前向传播时将原始输入加回到经过变换后的输出上。这种机制有助于保持信息流畅通并促进更深层次的学习能力。 3. **激活函数** ReLU(Rectified Linear Unit)是最常用的激活函数之一,在每个卷积层之后被广泛应用。ReLU 能够增加非线性特性,同时减少计算复杂度。 4. **池化层** 平均池化或者最大池化常用来降低空间维度,进一步压缩特征表示的空间大小以便后续全连接层更好地分类或回归目标变量。 #### 三、ResNet1D 的典型应用场景 ResNet1D 已经成功应用于多种实际问题中,特别是在医疗健康监测领域表现突出。例如,在重症监护室环境中,它可以利用患者生命体征的历史记录作为输入来进行疾病早期预警系统的开发。此外,该方法还适用于其他类型的连续型测量数据分析任务,比如心电图 (ECG) 解读、语音识别等。 以下是使用 Python 实现的一个简单版本 ResNet1D 架构代码示例: ```python import tensorflow as tf from tensorflow.keras import layers, models def residual_block(x, filters, kernel_size=3): shortcut = x # First convolutional layer with batch normalization and activation y = layers.Conv1D(filters=filters, kernel_size=kernel_size, padding='same')(x) y = layers.BatchNormalization()(y) y = layers.Activation('relu')(y) # Second convolutional layer without activation at the end of block y = layers.Conv1D(filters=filters, kernel_size=kernel_size, padding='same')(y) y = layers.BatchNormalization()(y) # Add skip connection if shortcut.shape[-1] != y.shape[-1]: shortcut = layers.Conv1D(filters=y.shape[-1], kernel_size=1)(shortcut) output = layers.Add()([shortcut, y]) output = layers.Activation('relu')(output) return output def build_resnet1d(input_shape, num_classes): inputs = layers.Input(shape=input_shape) # Initial Convolution Layer x = layers.Conv1D(64, kernel_size=7, strides=2, padding="same")(inputs) x = layers.MaxPooling1D(pool_size=3, strides=2, padding="same")(x) # Stack multiple residual blocks for i in range(3): # Example: stack three residual blocks x = residual_block(x, filters=64) # Global Average Pooling & Output Dense Layer x = layers.GlobalAveragePooling1D()(x) outputs = layers.Dense(num_classes, activation='softmax')(x) model = models.Model(inputs, outputs) return model model = build_resnet1d((1000, 1), 5) # Input shape: (sequence_length, channels); Number of classes: 5 model.summary() ``` 上述代码定义了一个基础版的一维残差网络框架,可以根据特定需求灵活修改参数设置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值