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

news2024/9/21 0:24:46

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

到了这里,一个残差结构需要的算法基本都介绍完了,至少在 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个卷积,每个卷积后面有一个 relu 激活函数。

你可能会问,左侧最后的一个卷积后面没有 relu 啊,这是因为左侧最后的一个卷积会和右侧的一个卷积相加,加完之后的结果再做 relu,实际上也相当于卷积后面都会有个relu。只要在卷积后面有一个 relu 激活函数,就会对这个卷积施加非线性因素。

这里说点题外话,在神经网络中,很多神经网络隐层的计算结果不一定非得是一模一样的,更重要的是要功能一致,比如不少神经网络调优的方法是将 relu 换成其他的激活函数,结果却是整网的推理精度会更好。

这样看来,在替换了激活函数之后,神经网络的某一层计算的结果可能不一样,但这不妨碍神经网络的推理。

上面是一个 resnet50 神经网络中典型的残差结构。网络的右侧分支多了一个卷积,该卷积是一个1×1的结构,它的作用就是将输入的 channel 维度上升为与左侧的卷积输出相有相同的channel维度,从而完成加法。

下面是 resnet50 神经网络中另一种比较常见的残差结构。这个残差结构没有左侧1×1的卷积层,它将输入直接与第三个卷积的输出进行相加。

以上两种残差结构的区别在于是否多了1层卷积。因此我们在设计残差结构的代码实现时,可以通过一个变量来控制是否有存在这个卷积,这个变量在很多地方被叫做 downsample,也就是下采样。

如果没有下采样的残差结构,比如上面第二种,我们很容易实现:其实就是将卷积,bn , relu 首尾相连即可。需要注意的是,在上面的图中并没有画出 bn 层,这是因为在很多时候,bn层的参数实际上是可以和前一层卷积的参数融合在一起的。

虽然上图没有画出来,但是我们在实现这个结构的同时还是要计算 bn 层,因为我们从预训练的 resnet50 中提取的参数时,是将卷积参数独立提取的,同时将 bn 的参数独立提取。

好了,以上背景介绍完之后,今天开始用 Python 代码来实现一个典型的残差结构。

def ComputeBottleNeck(in_data, bottleneck_layer_name, down_sample = False):
  out = ComputeConvLayer(in_data, bottleneck_layer_name + "_conv1")
  out = ComputeBatchNormLayer(out, bottleneck_layer_name + "_bn1")
  out = ComputeReluLayer(out)
  out = ComputeConvLayer(out, bottleneck_layer_name + "_conv2")
  out = ComputeBatchNormLayer(out, bottleneck_layer_name + "_bn2")
  out = ComputeReluLayer(out)
  out = ComputeConvLayer(out, bottleneck_layer_name + "_conv3")
  bn_out = ComputeBatchNormLayer(out, bottleneck_layer_name + "_bn3")

  if down_sample == True:
    conv_out= ComputeConvLayer(in_data, bottleneck_layer_name + "_downsample_conv2d")
    short_cut_out = ComputeBatchNormLayer(conv_out, bottleneck_layer_name + "_downsample_batchnorm")
    bn_out = bn_out + short_cut_out  # 这里就是上面两张图中的加法。
  else:
    bn_out = bn_out + in_data
  return ComputeReluLayer(bn_out) # 这里就是上面两张图中的加法。

仔细观察上面的 Python 代码,最开始的几行便是实现的三个卷积、三个 bn,卷积的输出为 out 变量,而 out 变量又直接给到 bn 的输入,层与层之间首尾相连。

如果 donw_sample 变量为 true 的时候,说明需要下采样,这个时候我们将原始的输入直接给下采样的卷积,后面再接一个 bn 层,然后进行加法操作。

如果 donw_sample 变量为 false 的时候,直接将最后一层卷积的输出和原始输入相加。最后经过一层 relu 激活计算,来输出整个残差结构的最终结果。

上述的代码实现基本上就是参照了上面两张图的结构来实现的,其实很简单。

每一层的具体算法实现是依据于前几节实现的代码作为基础的,可以查看前面的内容了解并实现对应的部分,这里只不过是在上面的实现基础上又重新封装了一层接口,使接口变得更加统一。

python 部分可以参考:practice/python/infer.py · iwaihou/cv_learning_from_scratch - Gitee.com

C++ 的代码实现可以参考:

practice/cpp/1st_origin/resnet.cc · iwaihou/cv_learning_from_scratch - Gitee.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1354433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python封装接口自动化测试套件 !

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: pip install requests …

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的志愿者…

大数据毕业设计:旅游景点数据爬虫大屏实时监控系统✅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题&#xff…

山海鲸可视化软件的优势:数据整合、可视化与个性化定制

随着科技的快速发展,企业数字化转型已成为必然趋势。而对于一些本身没有开发优势或非技术型企业,数字化产品的选择就成为重中之重。作为山海鲸可视化软件的开发者,我们深知这一点,对于企业来说,能选择一个产品一定要有…

电脑软件:CoolUtils Total Excel Converter:解决Excel格式转换难题,提升办公效率

大家在日常办公当中经常会遇到需要把Excel转换为其他文档格式的场景。今天小编给大家介绍一款强大的文件转换工具——Total Excel Converter,有了它,再也不会因为Excel文档格式转换的问题而烦恼了。 一、软件简介 CoolUtils Total Excel Converter官方版…

钡铼工控机BL302+PLC,助力酿酒业转型升级

啤酒是人类非常古老的酒精饮料,是水和茶之后世界上消耗量排名第三的饮料。 啤酒在生产过程中主要有制造麦芽、粉碎原料、糖化、发酵、贮酒後熟、过滤、灌装包装等工序流程。需要用到风选机、筛分机、糖化锅、发酵设备、过滤机、灌装机、包装机等食品机械设备。这些食…

Apache HTTPD 多后缀解析漏洞详解

Apache HTTPD 多后缀解析漏洞 1.查看python版本 这里python版本很重要,因为版本过低可能会导致后面的结果运行不成功 这里我就遇到了因为版本过低而执行不了docker-compose up -d的情况 查看python版本 cd /usr/bin ls -al python* 当版本过低时安装高版本的 …

云计算:OpenStack 分布式架构管理FLAT网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.控制节点创建网络 3.控制节点创建规格 4.控制节点新增安全组入口规则 5.控制节点创建实例 二、问题 1.FLAT网络底层如何实现 2.无法SSH 云主机实例 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部…

分布式系统架构设计之分布式事务的解决方案

针对以上分布式事务的挑战,现在业界也是有着对应的解决方案的,至于选择哪一种或者组合策略,需要架构师根据自己的实际系统和业务场景来进行决策。 1、两段式提交(2PC) 分布式事务的两段式提交(2PC&#x…

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表,云数据库PolarDB MySQL版2核4GB(通用)、2个节点、60 GB存储空间55元5天,云数据库 PolarDB 分布式版标准版2核16G(通用)57.6元3天,阿里云百科aliyunbaike.com分享…

全国计算机等级考试| 二级Python | 真题及解析(12)

一、选择题 1.在编写python程序时缩进的作用是()。 A.让程序更美观 B.只在for循环中使用 C.只在if语句中使用 D.用来界定代码块 2.已知列表list1=[8,22,34,9,…

【番外】【Airsim in Windows ROS in WSL2-Ubuntu20.04】环境配置大全

【番外】【Airsim in Windows &ROS in WSL2-Ubuntu20.04】环境配置大全 【前言(可省略不看)】1.在windows上面部署好UE4AirSim联合仿真环境2.在windows上面部署wsl2系统以及在wsl2上面部署ubuntu系统3.安装好ubuntu系统之后,目前只能在命…

代码随想录-刷题第四十六天

70. 爬楼梯(进阶) 题目链接:70. 爬楼梯 改为:一步一个台阶,两个台阶,三个台阶,…,直到 m 个台阶。问有多少种不同的方法可以爬到楼顶呢? 思路:本题是一个斐波…

国民技术与stm32 ADC采集

一、国民技术芯片ADC采集配置 /* PA1 ADC1_IN2 默认功能 DMA 通道1由ADC1触发 外部晶振16 系统时钟144M AHB 2分频 HCLK72M HCLK 经APB1 4分频 pclk1 18MHCLK/4 HCLK 经APB2 4分频 pclk2 18MHCLK/4ADCCLK不得超过14M*/ void DMA_ADC_Config(void) {ADC_InitType ADC_In…

Unity报错:InvalidOperationException: Insecure connection not allowed的解决方法

问题描述 在导入Steam VR 插件后报错&#xff1a; InvalidOperationException: Insecure connection not allowed UnityEngine.Networking.UnityWebRequest.SendWebRequest () (at <4139bb31c03640e7b650db6ec39d5754>:0) UnityEngine.WWW..ctor (System.String url) (…

大模型上下文长度的超强扩展:从LongLora到LongQLora

前言 本文一开始是《七月论文审稿GPT第2版&#xff1a;从Meta Nougat、GPT4审稿到Mistral、LongLora Llama》中4.3节的内容&#xff0c;但考虑到 一方面&#xff0c;LongLora的实用性较高二方面&#xff0c;为了把LongLora和LongQLora更好的写清楚&#xff0c;而不至于受篇幅…

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

Maven Resources Compiler: Maven project configuration required for module

Maven Resources Compiler: Maven project configuration required for module ‘cc-pdf’ isn’t available. Compilation of Maven projects is supported only if external build is started from an IDE. 报错原因是&#xff0c;我在git建立一个新空仓库&#xff0c;然后把…

C++线程池的原理(画图)及简单实现+例子(加深理解)

1.为什么线程池会出现&#xff0c;解决什么问题&#xff1f; C线程池&#xff08;ThreadPool&#xff09;的出现主要是为了解决以下几个问题&#xff1a; 1.性能&#xff1a;创建和销毁线程都是相对昂贵的操作&#xff0c;特别是在高并发场景下&#xff0c;频繁地创建和销毁线…