当前位置: 首页 > news >正文

神经网络基础 | 给定条件下推导对应的卷积层参数

神经网络基础 | 给定条件下推导对应的卷积层参数

在这里插入图片描述

按照 PyTorch 文档中 给定的设置:

H o u t = ⌊ H i n + 2 × padding [ 0 ] − dilation [ 0 ] × ( kernel_size [ 0 ] − 1 ) − 1 stride [ 0 ] + 1 ⌋ H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor Hout=stride[0]Hin+2×padding[0]dilation[0]×(kernel_size[0]1)1+1

W o u t = ⌊ W i n + 2 × padding [ 1 ] − dilation [ 1 ] × ( kernel_size [ 1 ] − 1 ) − 1 stride [ 1 ] + 1 ⌋ W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor Wout=stride[1]Win+2×padding[1]dilation[1]×(kernel_size[1]1)1+1

其中涉及到了几个卷积的参数:

  • 输入的尺寸, i i i H i n H_{in} Hin W i n W_{in} Win
  • 输出的尺寸, o o o H o u t H_{out} Hout W i n W_{in} Win
  • 对应维度上的单侧 padding, p p p padding \text{padding} padding
  • 对应维度上的扩张率, d d d dilation \text{dilation} dilation
  • 卷积核尺寸, k k k kernel_size \text{kernel\_size} kernel_size
  • 卷积滑动步长, s s s stride \text{stride} stride

一般来说,H 方向和 W 方向的参数是一样的,所以后续的介绍中仅考虑单一 H 方向。

另外,该运算规则对于 nn.Unfold 这类操作同样是满足的。

已知: i , o , k , d i, o, k, d i,o,k,d

这里的 o o o 其实也可以理解为沿着指定方向,在特定参数约束下的实际执行计算的窗口数量。

由于涉及到扩张率 d d d,所以我们应该直接考虑等效的卷积核 k ′ = ( k − 1 ) × d + 1 k' = (k-1) \times d + 1 k=(k1)×d+1。注意,这里的 k ′ k' k 仅用来表示滑窗大小,而并非表示实际的参与计算的元素数量。实际参与计算的依然只有 k k k 个元素。前者可以用于计算实际的滑窗次数,而后者在这里的推导中并不需要考虑。

已知实际窗口 k ′ k' k,我们可以获得滑窗步长 s = ⌈ i − k ′ o − 1 ⌉ s = \left \lceil \frac{i-k'}{o-1} \right \rceil s=o1ik。这里要注意向上取整的操作,由于实际步长需要为整数,所以这里如果除不尽的话需要凑到整数,但是又不能向下取整,因为向下取整会导致滑窗无法完全覆盖所有输入数据,而向上取整,则可以尽可能充分的覆盖整个轴向的数据,而多出来的部分,则可以通过 padding 策略来进行补齐。于是我们也由此可以获得整体的 padding 数,即 ⌈ s × ( o − 1 ) + k ′ − i ⌉ \left \lceil s \times (o-1) + k' - i \right \rceil s×(o1)+ki。也就是通过新的 stride 和等效的 kernel_size,重新计算一次输入尺寸,多出来的部分就是 padding 的数量。

关于 padding 的计算实际上需要考虑框架实际的需求,对于 PyTorch 而言,Conv2d 和 Unfold 都是针对 H 和 W 两个方向的两侧同时进行相同的 padding 操作,也就是说,左右各自对应的 p p p 是一样的。上下也是类似。所以我们这里提供的 p p p 应该是单侧的 padding 值,而通过 stride 直接作差获得的是单轴上的总 padding 数 p t o t a l p_{total} ptotal。所以需要取一半。此时又面临了向上取整还是向下取整的问题。考虑这个问题我们就得了解卷积操作究竟是如何对待 padding 的。实际上,padding 后的输入,在卷积时,如果最后一个窗口内的元素数量不够,那么这个窗口就会被舍弃,也就不会赋到输出变量里。所以只要输入 padding 后在最后一个滑窗位置之后的位置上凑不够一个新的滑窗,那么其就是等价的。所以我们对获得的 padding 直接除以 2 并向上取整即可: p ′ = ⌈ p t o t a l 2 ⌉ p' = \left \lceil \frac{p_{total}}{2} \right \rceil p=2ptotal

我们将代码整理下,可以得到用于计算这些量的函数:

@lru_cache()
def get_unfold_params_v0(width, num_kernels, kernel_size=8, dilation=1):real_kernel_size = (kernel_size - 1) * dilation + 1if width <= real_kernel_size:padding = math.ceil((real_kernel_size - width) / 2)assert width + padding <= real_kernel_size <= width + 2 * paddingstride = padding + 1num_kernels = 1else:stride = math.ceil((width - real_kernel_size) / (num_kernels - 1))if stride == 1:num_kernels = width - real_kernel_size + 1padding = math.ceil((stride * (num_kernels - 1) + real_kernel_size - width) / 2)params = dict(kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation)if _DEBUG:print(dict(width=width, num_kernels=num_kernels, **params))if not (stride >= 1or padding >= 0or width <= stride * (num_kernels - 1) + real_kernel_size <= width + padding * 2):raise ValueError(f"valid params does not exist for {dict(width=width, num_kernels=num_kernels, **params)}")return params, width, num_kernels

这里额外考虑了:

  • 当输入宽度小于指定核大小时,这个时候直接 padding 就行,但是同时需要修改送入的 num_kernels 参数。当然,如果要严格限定,那这里可以改为报错即可。
  • 当输入宽度大于指定核大小时,此时需要考虑超出的量
    • 如果超出的量并不能大于 num_kernels - 1,此时虽然向上取整后结果为 1,但是每个未取整的 stride 的真实值是小于 1 的。这样使用取整更新过后 stride 计算时,会造成不必要的 padding。所以此时我们更新下 o o o,也就是将其直接设为 s = 1 s=1 s=1 的情况下对应的结果,此时的 padding 数量为 0。当然,如果这里并不想更改 o o o,那么直接计算 padding 即可。
  • 对输出的参数进行一个简单的约束:
    • s s s 要大于等于 1;
    • p p p 要大于等于 0;
    • i ≤ s × ( o − 1 ) + k ′ ≤ i + 2 p i \le s \times (o - 1) + k' \le i +2p is×(o1)+ki+2p。最大为 padding 后的尺寸,最小则为原始尺寸。

已知: i , k , s , d i, k, s, d i,k,s,d

这里的输入不再限定输出的尺寸,而是提供了初始的步长约束 s s s

同样的,先计算真实的卷积核大小 k ′ = ( k − 1 ) × d + 1 k' = (k-1) \times d + 1 k=(k1)×d+1

按照一般情况,输入核小于输入尺寸,此时我们可以计算得到的对应的输出尺寸: o = ⌈ i − k ′ s + 1 ⌉ o = \left \lceil \frac{i-k'}{s} + 1 \right \rceil o=sik+1

由于输出尺寸并不是严格使用输入的 s s s 计算获得的,这里涉及到了一个取整的过程,所以实际上对应的 stride 也发生了改变,我们有必要依此对 stride 进行一下更新: s ′ = ⌈ i − k ′ o − 1 ⌉ s'= \left \lceil \frac{i-k'}{o-1} \right \rceil s=o1ik

输出尺寸得到后就该计算单侧 padding 的大小了,这里同样使用向上取整: ⌈ k ′ + s ′ × ( o − 1 ) − i 2 ⌉ \left \lceil \frac{k'+s' \times (o-1) - i}{2} \right \rceil 2k+s×(o1)i

对应的代码为:

@lru_cache()
def get_unfold_params_v1(width, kernel_size=8, stride=8, dilation=1):real_kernel_size = (kernel_size - 1) * dilation + 1if width <= real_kernel_size:padding = math.ceil((real_kernel_size - width) / 2)assert width + padding <= real_kernel_size <= width + 2 * paddingstride = padding + 1num_kernels = 1else:num_kernels = math.ceil((width - real_kernel_size) / stride) + 1if num_kernels == 1:stride = width - real_kernel_sizepadding = 0else:stride = math.ceil((width - real_kernel_size) / (num_kernels - 1))padding = math.ceil((real_kernel_size + stride * (num_kernels - 1) - width) / 2)params = dict(kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation)if _DEBUG:print(dict(width=width, num_kernels=num_kernels, **params))if not (stride >= 1or padding >= 0or width <= stride * (num_kernels - 1) + real_kernel_size <= width + padding * 2):raise ValueError(f"valid params does not exist for {dict(width=width, num_kernels=num_kernels, **params)}")return params, width, num_kernels

相关文章:

神经网络基础 | 给定条件下推导对应的卷积层参数

神经网络基础 | 给定条件下推导对应的卷积层参数 按照 PyTorch 文档中 给定的设置&#xff1a; H o u t ⌊ H i n 2 padding [ 0 ] − dilation [ 0 ] ( kernel_size [ 0 ] − 1 ) − 1 stride [ 0 ] 1 ⌋ H_{out} \left\lfloor\frac{H_{in} 2 \times \text{padding}[0]…...

面向CTF的python_requests库的学习笔记

看师傅们写的各种脚本羡慕不已&#xff0c;自己却只会一点一点手搓&#xff0c;于是来做个笔记 requests库是干嘛的&#xff1f; 顾名思义&#xff0c;request就是请求&#xff0c;可以用来向服务器发送请求。它可以代替你在网站上发送请求报文&#xff0c;并接受回应报文。简…...

MIAOYUN信创云原生项目亮相西部“中试”生态对接活动

近日&#xff0c;以“构建‘中试’生态&#xff0c;赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节&#xff0c;成都元来云志科技有限…...

Papers with Code:从代码索引到AI创新引擎

标题&#xff1a;Papers with Code&#xff1a;从代码索引到AI创新引擎 文章信息摘要&#xff1a; Papers with Code从解决机器学习论文代码复现的特定需求起步&#xff0c;通过建立全面的ML资源库和首个系统性leaderboard系统&#xff0c;快速积累了大量用户基础。被Meta收购…...

FastExcel 新一代的潮流 (EasyExcel)

目录 简介 FastExcel的特点 FastExcel使用方法详解 创建实体类和监听器 实现写入和读取功能 Excel转换为PDF 小结 FastExcel与EasyExcel的区别 结论 简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有…...

Linux静态库与动态库的理解

Linux静态库与动态库的理解 一、静态库如何创建和使用静态库 二、动态库如何创建和使用动态库 三、静态库与动态库的关键区别四、总结 在 Linux 编程中&#xff0c;静态库和动态库是非常重要的概念 一、静态库 静态库是将多个目标文件&#xff08;.o 文件&#xff09;打包成一…...

mongoose 支持https踩坑纪实

简述 mongoose是C编写的嵌入式web服务&#xff0c;它能够支持https协议&#xff0c;可以简单的部署&#xff0c;但要做到完美部署&#xff0c;不是那么容易。 部署方法 本人使用的是最新的7.16版&#xff0c;以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…...

人工智能之数学基础:线性表达和线性组合

本文重点 线性表达和线性组合作为线性代数的核心概念,不仅深刻揭示了向量空间的基本性质,也为解决复杂问题提供了直观而有效的方法。 向量组 要想学习线性表达和线性组合,先来理解向量组。在线性代数中,向量组是指由若干个向量构成的集合。这些向量可以是二维的、三维的…...

uniapp——App 监听下载文件状态,打开文件(三)

5 实现下载文件并打开 这里演示&#xff0c;导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0&#xff1f; 相关Api&#xff1a; downloader DEMO 提示&#xff1a; 请求方式支持&#xff1a;GET、POST&#xff1b;POST 方式需要…...

Microsoft SQL Serve的下载与安装

1.访问Microsoft SQL Serve官网 SQL Server 下载 | Microsoft开始使用 Microsoft SQL Server 下载。选择最符合你的数据和工作负载需求的 SQL Server 试用版、版本、工具或连接器。[这里是图片001]https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.下载SQL…...

JMeter 测试Dubbo 接口

在使用 JMeter 进行 Dubbo 接口的测试时&#xff0c;JMeter 本身并没有直接支持 Dubbo 协议&#xff08;基于 RPC&#xff09;的插件。但是&#xff0c;我们可以通过以下几种方式来测试 Dubbo 接口&#xff1a; 1. 使用 JMeter 的 Java 请求&#xff08;JDBC 请求&#xff09;…...

Java 日志技术、Logback日志框架、日志级别

一. 日志 1. 日志&#xff1a;程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的各种信息。 二. 日志技术 1. 日志技术&#xff1a;可以将系统执行的信息&#xff0c;方便的记录到指定的位置(控制台、文件中、数据库中) 2. 可以随时以开关的…...

美妆系列圣罗兰气垫粉色与黑色有什么区别?

在美妆界&#xff0c;圣罗兰的气垫一直备受青睐&#xff0c;而其中粉色款和黑色款更是有着各自的特点&#xff0c;存在不少区别呢。 从外观设计来看&#xff0c;粉色款整体给人一种温柔、甜美的感觉&#xff0c;外壳颜色清新&#xff0c;很容易击中少女心&#xff0c;携带在身边…...

HTML中的`<!DOCTYPE html>`是什么意思?

诸神缄默不语-个人CSDN博文目录 在学习HTML时&#xff0c;我们经常会看到HTML文档的开头出现<!DOCTYPE html>&#xff0c;它是HTML文件的第一行。很多初学者可能会疑惑&#xff0c;为什么需要这行代码&#xff1f;它到底有什么作用呢&#xff1f;在这篇文章中&#xff0…...

Sudo命令的配置及使用

概念 sudo 命令是 Linux 系统中一个非常重要的工具&#xff0c;它允许普通用户以超级用户&#xff08;通常是 root&#xff09;或其他用户的身份执行命令。从概念上来说&#xff0c;在普通用户在权限不够的时候&#xff0c;通过 sudo 命令 “摇人”&#xff0c;这个 “人” 就是…...

【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器

【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器 一、前言&#xff1a; 从三方应用跳转到系统浏览器是比较常见的功能。 拓展应用功能边界&#xff1a; 三方应用的功能通常相对聚焦和特定&#xff0c;无法涵盖用户可能需要的所有网络浏览需求。跳转到系统浏览器能让用户访问…...

电梯系统的UML文档06

系统传感器 系统值是用于控制系统的。在类图中系统传感器用一个箭头和系统控制对象连接。 类图中的系统传感器包括AtFloor、电梯呼叫器、关门、开门、门反转、楼层呼叫器和驱动&#xff08;AtFloor&#xff0c;CarCall&#xff0c;DoorClosed&#xff0c;DoorOpen&#xff0c;…...

指针之旅:从基础到进阶的全面讲解

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文&#xff08;1&#xff09;内置数…...

AT8870单通道直流电机驱动芯片

AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达3.6A的峰值电流双向控制电机。利用电流…...

RISC-V读书笔记

目录 关于RISC-V 关于RISC-V 简洁 RISC-V是一个崭新的架构&#xff0c;比起来传统的x86-64架构&#xff0c;他更加的简约和现代。下面这种图像阐述了传统的x86的指令集的膨胀速度有多么的吓人&#xff08;汗颜 这是可以理解的&#xff0c;我们的ISA&#xff08;Computer Syst…...

游戏开发中常用的设计模式

目录 前言一、工厂模式简单工厂模式工厂方法模式抽象工厂模式 二、单例模式三、观察者模式观察者模式的优势 四、状态模式状态模式的优势 五、策略模式策略模式的优势 六、组合模式七、命令模式八、装饰器模式策略模式与状态模式有什么区别呢? 前言 本文介绍了游戏开发中常用…...

Android 11适配全攻略:从理论到实践

随着Google正式发布Android 11&#xff0c;开发者们迎来了新的挑战和机遇。Android 11不仅带来了全新的用户体验和功能提升&#xff0c;还要求开发者们对应用进行相应的适配&#xff0c;以确保应用的兼容性和稳定性。本文将从理论到实践&#xff0c;全面解析Android 11的适配攻…...

Grafana 统一可视化了,告警如何统一?

对于大部分公司&#xff0c;通常都不止一套监控、可观测性相关的系统&#xff0c;云上的、云下的&#xff0c;开源的、商业的&#xff0c;指标的、日志的、链路的&#xff0c;各个系统体验不同&#xff0c;权限难管&#xff0c;如何统一化并为各个团队赋能&#xff0c;是很多技…...

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件&#xff0c;没有作用&#xff0c;下载了brightness-controllor&#xff0c;问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…...

抖音小程序一键获取手机号

前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…...

某政务行业基于 SeaTunnel 探索数据集成平台的架构实践

分享嘉宾&#xff1a;某政务公司大数据技术经理 孟小鹏 编辑整理&#xff1a;白鲸开源 曾辉 导读&#xff1a;本篇文章将从数据集成的基础概念入手&#xff0c;解析数据割裂给企业带来的挑战&#xff0c;阐述数据集成的重要性&#xff0c;并对常见的集成场景与工具进行阐述&…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证&#xff0c;在main.htm中增加layui的数据表格组件&#xff0c;并调用后台服务分页显示数据&#xff0c;后台分页查询数据接口如下所示&#xff08;测试时&#xff0c;直接将数据写死到代码中&#xff0c;没有查询数据库&#xff0…...

Android 高德地图API(新版)

新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…...

51c~缺陷检测~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12386431 一、缺陷检测~使用深度学习1 这里研究工业ai, 在制造业中任何公司的主要目标都是为客户生产无缺陷产品。如果在产品开发过程中出现任何内部孔、凹坑、磨损或划痕&#xff08;由于多种原因&#xff0c;从生产设备…...

强化学习与ai黑科技实例

一.强化学习简介和其应用 (1)强化学习,深度学习,有监督,无监督区别与联系。 1)强化学习讨论的核心就是智能机(agent)怎么在复杂&#xff0c;不确定的环境中最大化它能获得的奖励。 2)人工智能包括机器学习&#xff0c;机器学习包括有监督学习&#xff0c;无监督学习(例如聚类…...

《TikTok归来:机遇与挑战并存》

TikTok 回归&#xff1a;波折中的 “重生” 在全球社交媒体的版图中&#xff0c;TikTok 的存在无疑是一颗璀璨的明星。它以独特的短视频形式、强大的算法推荐以及丰富多样的内容&#xff0c;迅速风靡全球&#xff0c;吸引了数以亿计的用户。然而&#xff0c;其发展并非一帆风顺…...

Rust语言的正则表达式

Rust语言的正则表达式 正则表达式&#xff08;Regular Expressions&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;广泛应用于字符串的搜索、匹配、替换和解析。在Rust语言中&#xff0c;正则表达式的支持既高效又功能强大&#xff0c;非常适合开发者…...

三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D

挪威文化历史博物馆在其修复工作中融入现代3D扫描技术&#xff0c;让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识&#xff0c;该博物馆被誉为挪威博物馆研究领域的领先机构。馆…...

c# PDF文件合并工具

界面 主要用于发票PDF文件的合并。经常出差要报销的很有用。 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System…...

【16届蓝桥杯寒假刷题营】第1期DAY5

5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在 [li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次…...

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具&#xff0c;效率提升利器&#xff01; https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具&#xff0c;旨在提高调试效率。这些工具包括LLCOM&#xff0c;提供串口调试和自动化处…...

(7)(7.2) 围栏

文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形&#xff08;“TinCan”&#xff09;和多边形和/或圆柱形、…...

1166 Summit (25)

A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…...

linux_socket

udp 通信 server #include <iostream> #include <arpa/inet.h> #include <unistd.h> #include <cstring>using namespace std;#define UPORT 12511int main(){int sock socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP套接字if (sock -1) {cout&…...

Linux探秘坊-------3.开发工具详解(2)

1.动静态库和动静态链接&#xff08;操作&#xff09; 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件 ⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a” 动态库与之相反,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中 ,⽽…...

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…...

C语言进阶习题【1】指针和数组(1)——一维数组

1. 数组名的意义&#xff1a; sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小。&数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。&#xff08;一维数…...

2024:成长、创作与平衡的年度全景回顾

文章目录 1.前言2.突破自我&#xff1a;2024年个人成长与关键突破3.创作历程&#xff1a;从构想到落笔&#xff0c;2024年的文字旅程4.生活与学业的双重奏&#xff1a;如何平衡博客事业与个人生活5.每一步都是前行&#xff1a;2024年度的挑战与收获6.总结 1.前言 回首2024年&a…...

【Linux】网络基础探索:开启你的网络之旅

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 计算机网络背景 &#x1f98b; 1-1 网络发展 二&#xff1a;&#x1f525; 初识协议 &#x1f98b; 2-1 协议分层协议分层 vs. 软件分层 &#x1f98b; 2-…...

function isBulkReadStatement, file SQLiteDatabaseTracking.cpp

一问题&#xff1a;Xcode16.0运行在iPhone16/ios18.0 以上发生闪退&#xff0c; 闪退在 YYCache–>YYKVStorage 文件内。 以上删除保以下错误&#xff1a; function isBulkReadStatement, file SQLiteDatabaseTracking.cpp 解决方案&#xff1a; 找到YYKVStorage文件中_d…...

React 中hooks之useTransition使用总结

目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook&#xff0c;用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应&#xff0c;通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...

leetcode 3097. 或值至少为 K 的最短子数组 II 中等

给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k &#xff0c;那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组 的长度&#xff0c;如果特别子数组不存在&#xff0c;那么返回 -1 。 示例 1&…...

C# OpenCV机器视觉:特征匹配 “灵魂伴侣”

在一个阳光仿佛被施了魔法&#xff0c;欢快得直蹦跶的早晨&#xff0c;阿强像个即将踏上神秘寻宝之旅的探险家&#xff0c;一屁股墩在实验室那张堆满各种奇奇怪怪小玩意儿的桌前。桌上&#xff0c;零件、线路、半成品设备乱成一团&#xff0c;唯有他那宝贝电脑屏幕散发着清冷又…...

DDD - 整洁架构_解决技术设计困局

文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块&#xff08;投资接口投资业务&#xff09; 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块&#xff08;投资接口投资业务…...