残差网络ResNet

太深的神经网络训练起来很难,因为有梯度消失和爆炸这类问题。
跳跃连接(skip connection) 让你从一层中得到激活并突然把它传递给下一层,甚至更深的神经网络层。利用它,可以训练网络层很深很深的残差网络
无需遵行主路径,al将通过快捷路径进入到更深层的神经网络中
有时这个术语不叫快捷路径(shortcut),有时叫跳跃连接,指al跳过一层或跳过几乎两层把信息传递到更深的神经网络中去。
建立一个ResNet的方法,就是通过大量的这些残差块把它们堆叠起来形成一个深度网络


一、残差块(Residual block)

如图,绿色划线部分为普通网络(plain network)的路径。此处为残差网络这组层的主路径。

紫色部分为残差块的快捷路径(shortcut)。有时这个术语不叫快捷路径(shortcut),有时叫跳跃连接(skip connection),指a[l]跳过一层或跳过几乎两层把信息传递到更深的神经网络中去。

通过快捷路径,我们得到

无需遵行主路径,a[l]将通过快捷路径进入到更深层的神经网络中。

跳跃连接让你从一层中得到激活并

### 关于残差网络 ResNet 的项目示例 #### 使用 Keras 实现简单的 ResNet 架构 构建一个基于 Keras 和 TensorFlow 后端的简单 ResNet 模型可以作为入门级项目的良好起点。下面是一个简化版 ResNet-18 的实现: ```python from tensorflow.keras import layers, models def residual_block(x, filters, conv_stride=1, shortcut_conv=False, block_stride=1): shortcut = x # 主路径的第一层卷积 y = layers.Conv2D(filters=filters, kernel_size=(3, 3), strides=conv_stride, padding='same')(x) y = layers.BatchNormalization()(y) y = layers.Activation('relu')(y) # 主路径第二层卷积 y = layers.Conv2D(filters=filters, kernel_size=(3, 3), strides=block_stride, padding='same')(y) y = layers.BatchNormalization()(y) # 如果尺寸不匹配,则调整shortcut分支 if shortcut_conv: shortcut = layers.Conv2D(filters=filters, kernel_size=(1, 1), strides=conv_stride)(x) # 将主路径与捷径相加并激活 y = layers.add([shortcut, y]) y = layers.Activation('relu')(y) return y input_shape = (224, 224, 3) img_input = layers.Input(shape=input_shape) # 初始卷积层 x = layers.ZeroPadding2D(padding=(3, 3))(img_input) x = layers.Conv2D(64, (7, 7), strides=(2, 2))(x) x = layers.BatchNormalization()(x) x = layers.Activation('relu')(x) x = layers.MaxPooling2D((3, 3), strides=(2, 2))(x) # 堆叠多个残差模块 for i in range(2): x = residual_block(x, 64)[^1] model = models.Model(img_input, x) print(model.summary()) ``` 此代码片段展示了如何定义基本组件——`residual_block()` 函数来创建单个残差单元,并通过堆叠这些单元形成完整的神经网络架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值