50、实战 - 利用 conv + bn + relu + add 写一个残差结构

本文介绍如何基于手工编写的conv、bn和relu算法实现Resnet中的残差结构。通过Python和C++代码展示如何构建这两种常见的残差结构,包括下采样和无下采样情况,并解释了残差结构中各组件的作用和实现细节。
摘要由CSDN通过智能技术生成

上一节介绍了残差结构,还不清楚的同学可以返回上一节继续阅读。

到了这里,一个残差结构需要的算法基本都介绍完了,至少在 Resnet 这种神经网络中的残差结构是这样的。

本节我们做一个实战,基于之前几节中手写的 conv / bn 算法,来搭建一个残差结构。其中,relu 的实现和 add 的实现很简单。

relu 算法的实现用 python 来写就一行:

def ComputeReluLayer(img):
  res = np.maximum(0, img)
  return res

其中 img 是 relu 的输入数据,取输入数据和零的最大值即可, res 就是经过 relu 激活的结果。

而加法节点的实现就更简单,在 python 中就一个加法操作符就可以完成。

残差结构图

先看一下 resnet 中的残差结构图,在resnet50中,有两种残差结构,一种是如下的结构。

图中红框标注的是其中一种残差结构,这个结构的特点是左侧分支有3个卷积,每个卷积后面有一个

好的,以下是一个简单的残差网络实现的 Python 代码示例: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, ReLU, Add def residual_block(x, filters, strides=(1, 1)): # 定义残差块 shortcut = x # 第一层卷积,加 BN 和 ReLU x = Conv2D(filters, (3, 3), strides=strides, padding='same')(x) x = BatchNormalization()(x) x = ReLU()(x) # 第二层卷积,加 BN x = Conv2D(filters, (3, 3), padding='same')(x) x = BatchNormalization()(x) # 如果输入和输出的维度不同,就对 shortcut 进行卷积,将维度匹配 if strides != (1, 1): shortcut = Conv2D(filters, (1, 1), strides=strides, padding='same')(shortcut) # 相加 x = Add()([x, shortcut]) x = ReLU()(x) return x # 定义一个 34 层的残差网络 inputs = Input(shape=(224, 224, 3)) x = Conv2D(64, (7, 7), strides=(2, 2), padding='same')(inputs) x = BatchNormalization()(x) x = ReLU()(x) x = residual_block(x, filters=64) x = residual_block(x, filters=64) x = residual_block(x, filters=64, strides=(2, 2)) x = residual_block(x, filters=128) x = residual_block(x, filters=128) x = residual_block(x, filters=128) x = residual_block(x, filters=128, strides=(2, 2)) x = residual_block(x, filters=256) x = residual_block(x, filters=256) x = residual_block(x, filters=256) x = residual_block(x, filters=256) x = residual_block(x, filters=256) x = residual_block(x, filters=256, strides=(2, 2)) x = residual_block(x, filters=512) x = residual_block(x, filters=512) x = residual_block(x, filters=512) x = tf.keras.layers.GlobalAveragePooling2D()(x) outputs = Dense(1, activation='sigmoid')(x) model = tf.keras.models.Model(inputs, outputs) model.summary() ``` 这段代码实现了一个 34 层的残差网络。给定输入图片的大小为 224x224,输出二分类预测结果。每个残差块包含两个 3x3 的卷积层和一个 shortcut(如果输入和输出大小不同,shortcut 会进行卷积来匹配维度)。在每个残差块的卷积层之间,使用了 BN 和 ReLU 激活函数。最终输出一个 sigmoid 激活函数的输出,表示预测概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值