Mobile net V系列详解 理论+实战(3)

请添加图片描述

Mobilenet 系列

  • 论文精讲部分
    • 0.摘要
    • 1. 引文
    • 2. 引文
    • 3. 基础概念的讨论
      • 3.1 深度可分离卷积
      • 3.2 线性瓶颈
      • 3.3 个人理解
    • 4. 模型架构细节
    • 5. 实验细节
    • 6. 实验讨论
    • 7. 总结

论文精讲部分

鉴于上一小节中采用的代码是V2的模型,因此本章节现对V2模型论文讲解,便于读者能够更好的使用V2模型。通过引文格式标注自己对当前部分的理解,可能存在歧义各位酌情理解。

0.摘要

在这篇论文中,我们描述了一种新的移动架构MobileNetV2,它在多个任务和基准测试中提升了移动模型的最先进性能,同时覆盖了不同模型大小的广泛范围。我们还描述了将这些移动模型高效应用于物体检测的新框架,我们称之为SSDLite。此外,我们展示了如何通过深度学习框架DeepLabv3的简化形式(我们称之为Mobile DeepLabv3)构建移动语义分割模型。

MobileNetV2基于一种倒置残差结构,在细小的瓶颈层之间建立了快捷连接。中间扩展层使用轻量级深度卷积来过滤特征,作为非线性的来源。此外,我们发现在狭窄层中移除非线性操作对于保持表达能力很重要。我们证明了这提升了性能,并提供了导致这一设计的直觉。

最终,我们的方法允许将输入/输出域与变换的表现力进行解耦,这为进一步分析提供了一个便利的框架。我们在ImageNet分类、COCO物体检测、VOC图像分割上衡量了我们的性能。我们评估了准确度与操作次数之间的权衡,操作次数通过乘加(MAdd)测量,以及实际延迟和参数数量。

摘要简述,其模型主要是对Mobilenet进行修改提升了算法性能,并且其模型大小可变性使其对不同大小轻量级模型上全面覆盖。并且提出这个模型的另外一种可能性,用于物体检测SSDlite。其模型主要是对V1的问题通过一些巧妙的方法进行改进,解决方法就是倒置残差结构,具体细节后续讨论。主要就是引入了残差结构和删减了一点激活函数,因为Relu的特性问题。

1. 引文

神经网络已经彻底改变了许多机器智能领域,使得在具有挑战性的图像识别任务上实现了超人的准确性。然而,提高准确性的努力往往需要付出代价:现代的最先进网络需要高计算资源,在许多移动和嵌入式应用中超出了其处理能力。

本文介绍了一种针对移动和资源受限环境专门设计的新型神经网络架构。我们的网络通过显著减少操作次数和所需内存,同时保持相同的准确性,推进了为移动设备定制的计算机视觉模型的最先进水平。

我们的主要贡献是一个新颖的层模块:倒置残差与线性瓶颈。该模块以低维压缩表示为输入,首先扩展到高维,并通过轻量级深度卷积进行过滤。随后,特征通过线性卷积重新投影回低维表示。官方实现作为TensorFlow-Slim模型库的一部分已经可用于[4]。

这个模块可以使用任何现代框架中的标准操作高效实现,并且允许我们的模型使用标准基准在多个性能点上超越最先进水平。此外,这个卷积模块特别适合移动设计,因为它通过永远不完全实化大的中间张量,显著降低了推理过程中所需的内存占用。这减少了在许多嵌入式硬件设计中对主内存访问的需求,这些设计提供少量非常快速的软件控制缓存内存。

主要还是阐述其主要工作了就是设计了一个倒置残差结构,其实说的还挺清晰的但是乍一看看不懂需要进行后续的主体内容才能看明白。别慌别慌,图一乐部分。主要是在引文部分介绍一下背景信息,以及自身的主要工作。属于是大型的摘要了。

2. 引文

在过去几年里,调整深度神经架构以在准确性和性能之间找到最佳平衡一直是一个活跃的研究领域。许多团队通过手动架构搜索和训练算法的改进,==对早期设计如AlexNet、VGGNet、GoogLeNet和ResNet进行了显著改善。==最近在算法架构探索方面取得了很多进展,包括超参数优化以及网络剪枝和连接学习的各种方法。大量工作也致力于改变内部卷积块的连通性结构,如ShuffleNet中所做的,或引入稀疏性等。

其实这段还好,主要是大佬的文章基本小成果人家也不引用,就是AlexNet 现阶段的CNN主体框架,人家VGG就是深层预训练模型。现阶段还在使用。GoogLeNet则是🫡致敬Lenet的网络。利用多种卷积核去拟合大卷积核的作用。最终的resnet残差结构。
其实这个V2都能看到这些模型的影子。首先AlexNet为V2创办基础提供了基本条件创办了卷积操作(不是很严谨的表述),而经过VGG的洗礼模型也在深度上有了进度。但是其参数较多。采用GoogLeNet的inception架构造出了V1的深度可分离卷积,而这个resnet则是V2新引入残差结构思想的理论支持。

近来,研究打开了一个新方向,将遗传算法和强化学习等优化方法引入架构搜索。然而,一个缺点是,最终的网络变得非常复杂。在本文中,我们追求的目标是更好地理解神经网络的运行方式,并利用这一点指导尽可能简单的网络设计。我们的方法应被视为对先前提到的研究及相关工作的补充。

轻量化轻量化轻量化还是TM的轻量化

在这方面,我们的方法与ShuffleNet和其他相关研究采取的方法类似,允许进一步提高性能,同时提供对其内部操作的一瞥。我们的网络设计基于MobileNetV1。它保留了其简单性,并且不需要任何特殊操作,同时显著提高了其准确性,实现了移动应用的多个图像分类和检测任务的最先进性能。

ShuffleNet挖个坑,下阶段搞这个。

3. 基础概念的讨论

3.1主要是讨论V1的深度可分离卷积,第二部分通过一个流体的概念阐述其缺点。如果由于其过于晦涩难懂本部分对3.2直接解释,不对这部分内容进行分析,感兴趣的读者可以参考原文。

3.1 深度可分离卷积

深度可分离卷积是许多高效神经网络架构的关键构建块[27, 28, 20],在本项工作中我们也使用了这种方法。基本思想是用一个分解版本替换全卷积操作符,该版本将卷积分为两个独立的层。

V1的轻量化主要是来源于独立的二维度卷积核和高维度的1*1的卷积核构成的,实现的参数下降

  • 第一层,称为深度卷积,通过对每个输入通道应用单个卷积滤波器来执行轻量级过滤。
  • 第二层,称为逐点卷积(1×1卷积),负责通过计算输入通道的线性组合来构建新特征。

标准卷积接受一个 h i × w i × d i h_i \times w_i \times d_i hi×wi×di 的输入张量 L i L_i Li,并应用卷积核 K ∈ R k × k × d i × d j K \in \mathbb{R}^{k \times k \times d_i \times d_j} KRk×k×di×dj 来产生一个 h i × w i × d j h_i \times w_i \times d_j hi×wi×dj的输出张量 L j Lj Lj。标准卷积层的计算成本为:

h i ⋅ w i ⋅ d i ⋅ d j ⋅ k 2 h_i \cdot w_i \cdot d_i \cdot d_j \cdot k^2 hiwididjk2

深度可分离卷积可以作为标准卷积层的即插即用替代品。它们几乎与常规卷积一样有效,但成本仅为:

h i ⋅ w i ⋅ d i ( k 2 + d j ) ( 1 ) h_i \cdot w_i \cdot d_i (k^2 + d_j) \quad (1) hiwidi(k2+dj)(1)

公式(1)代表了深度和1×1逐点卷积的总和。有效地,与传统层相比,深度可分离卷积将计算量减少了近 k 2 k^2 k2 的因子。MobileNetV2采用 k = 3 k = 3 k=3(3×3深度可分离卷积),计算成本比标准卷积小8到9倍,只在准确率上略有下降[27]。

简单的讨论一下V1之所以厉害的原因,这里其实没说那两个超参数。其实就是引入模型的优势,对这部分进行的改进,因为运行过程中还是发现了部分问题。

3.2 线性瓶颈

考虑一个由n层 L i L_i Li 组成的深度神经网络,每个层都有一个维度 h i × w i × d i h_i \times w_i \times d_i hi×wi×di 的激活张量(就是输入特征呗,每次卷积操作后就会生成)。在本节中,我们将讨论这些激活张量的基本属性,我们将其视为容器,包含有 d i d_i di 维度的 h i × w i h_i \times w_i hi×wi “像素”。非正式地,对于一组实际图像的输入,我们说任意层 L i L_i Li 的一组层激活形成了一个“感兴趣的流形”。长期以来,人们假设神经网络中的感兴趣流形可以嵌入低维子空间。换言之,当我们观察深度卷积层的所有单独的d通道像素时,这些值中编码的信息实际上位于某个流形中,该流形又可以被嵌入到一个低维子空间中。

引入了一个流形的概念实在是看不懂了,太晦涩了。换一种我自己的理解吧。感兴趣的读者可以看一下原文。

3.3 个人理解

先来看这个深度可分离卷积,首先是深度卷积(depthwise convolution),它对每个输入通道独立地应用一个卷积核,产生的输出通道数与输入通道数相同。接下来是逐点卷积(pointwise convolution),它通过使用1×1的卷积核将深度卷积的结果在通道维度上进行线性组合,从而增加或保持输出通道的数量。

有人在实际使用的V1的时候, 发现深度卷积部分的卷积核比较容易训废掉:训完之后发现深度卷积训出来的卷积核有不少是空的:其实主要阐述了一个问题,在深层可分离卷积中,有些卷积核没啥用,具体是为什么无用呢。首先看一下下图。

请添加图片描述

有些卷积核都是0了,实现不了特征提取啊。作者认为这是都要归咎于ReLU(或任何将负值归零的激活函数)。其实主要原因是应用于深度卷积的结果时,所有负值都会变为0,具体的成因大家移步我的另一个文章,占用篇幅过长我在这里解释下。如果要深入立即这个创新点一定要看我补充的部分哦

==总结一句话就是使用ReLU激活函数有些卷积核被训练废掉了。==那么怎么解决呢,肯定是不能不用激活函数啊,激活函数本身就是其模型非线性能力的主要来源。你不是卷积核费的多吗,那就增加卷积核呗,你报废了我以量取胜。其中心思想就是这个。

回忆下V1中讲解的深度可分离卷积,本质上是一个通道应用一个卷积核,你增加卷积核个数咋个增加法,三个通道四片卷积核??因此其深度卷积本身没改变通道的能力。在深度卷积部分没法改变其卷积核核个数的能力。请添加图片描述

可以看下上图,一个普通的特征图,可以通过多个传统的高维度卷积核生成一个更厚的特征图,即一个传统的高维度卷积核是可以通过增加卷积核的个数来实现控制生成新的特征图的厚度的。但是深度卷积做不到这个操作。看一下下图中展示的深度可分离卷积。
请添加图片描述
特征图的一个通道,被深度卷积核中的一个生成一个新的特征图,其新生成的特征图厚度和输入厚度是一致的。==真正增加特征图厚度的部分来自于11卷积核的部分。==就是说要增加特征图的厚度还的是咱们这个11的卷积核。

为啥要讨论增加厚度这个事呢?

只有增加特征图厚度才能增加深度卷积核个数,进而有些卷积核训练废了也不要紧,剩下的更多。属于是人海战术的打法了。
请添加图片描述

最终设计出来的模块。初始的蓝图用斜条纹表示,含义是没激活函数,单纯的使用 1 ∗ 1 1*1 11的高维度卷积核增加特征图的厚度,再增加厚度上,后面的深度卷积个数也就增多了。(阐述一下这部分并没有因为失效的卷积核而丢弃特征,本质上没有激活函数的高维度1*1卷积核就是在图上进行了一个全连接生成一个新的多个特征图)。在保留深度可分离卷积的同时还对激活函数进行调整采用ReLU6,更好的改善激活函数引发的问题。所以人家给自己的这个模块命名叫扩张卷积快,老子打的就是人海展示,扩张扩张还是扩张。

其实在V2发布的时候,Resnet 已经发布了,残差结构的有效性也得到了验证,V1发布的时候仅仅是依靠VGG这样的直筒结构,V2理所应当的残差结构也搞一搞,模型深度上去了性能一定会好的。请添加图片描述
可以看到传统的Resnet的残擦结构网络是利用 1 ∗ 1 1*1 11压缩维度,然后在进行卷积操作,最后在利用 1 ∗ 1 1*1 11增加维度(看起来是个橄榄球的形状),而mobilnet由于其本质上还是轻量级网络,主体的深度可分离卷积不能丢弃,并且其设计的深度卷积核不能通道间通信的原因,要先利用 1 ∗ 1 1*1 11增加维度再减少,与传统Resnet的整体结构相反,所以人家叫反转残差(看起来是个脖子)。

至此V2的全部创新点理解结束,回归正文开始看看其具体工作情况。
MobileNetV2的改进

MobileNetV2通过引入线性瓶颈层(linear bottleneck layers)和逆残差结构(inverted residual blocks)作为改进。线性瓶颈层在逐点卷积之后不使用ReLU激活函数,以避免ReLU造成的信息损失。这种设计使得网络可以在不牺牲模型性能的情况下,减少信息损失并增加模型的表示能力。

4. 模型架构细节

现在我们将详细描述我们的架构。正如前一节所讨论的,基础构建模块是带有残差的瓶颈深度可分离卷积。这个模块的详细结构如下所展示:请添加图片描述
表 1. MobileNetV2 的架构包含一个初始的全卷积层,该层具有 32 个滤波器,随后是 19 个残差瓶颈层,其细节在表 2 中描述。我们使用 ReLU6 作为非线性激活函数,因为它在低精度计算时具有较强的鲁棒性。我们始终使用 3×3 的核大小,这是现代网络的标准配置,并在训练期间利用 dropout 和批量归一化技术。

除了第一层外,我们在整个网络中使用了恒定的扩展率。在我们的实验中,我们发现扩展率在5到10之间的设置会产生几乎相同的性能曲线,其中较小的网络适合使用稍微较小的扩展率,而较大的网络在使用稍大的扩展率时性能会有轻微的提升。在所有主要的实验中,==我们将扩展因子设置为6,==并应用于输入张量的大小。例如,对于一个接收64通道输入张量并产出128通道输出张量的瓶颈层,中间扩展层的通道数则为 64 × 6 = 384 64 \times 6 = 384 64×6=384通道。 这里的扩展因子即对特征图厚度增加的倍数,表二中进行展示都是6

V1中的两个超参数,我引用我自己。

权衡超参数:正如文献 [27] 中所述,我们通过使用输入图像分辨率和宽度倍数作为可调节的超参数来定制我们的架构,以适应不同的性能需求点,这些参数可以根据所需的准确性 / 性能权衡进行调整。我们的主要网络(宽度倍数为 1,分辨率为 224×224)的计算成本为 3 亿次乘加运算,并使用了 340 万个参数。我们探索了从 96 到 224 的输入分辨率以及从 0.35 到 1.4 的宽度倍数对性能的权衡。网络的计算成本范围从 7M 乘加运算到 585M 乘加运算,而模型大小在 170 万到 690 万参数之间变化。
与 [27] 有一个轻微的实现差异是,对于小于 1 的倍数,我们将宽度倍数应用于除了最后一个卷积层之外的所有层。这对于较小型号的性能提升有帮助。

就是比之前大了六倍呗用这个1*1的卷积核扩充。

请添加图片描述
表 2: MobileNetV2:每一行描述了一个或多个相同的(除了步长之外)层的序列,这些层重复 n 次。同一个序列中的所有层都具有相同数量 c 的输出通道。每个序列的第一层具有步长 s,其余层使用步长 1。所有空间卷积使用 3×3 的核。扩展因子 t 总是按照表 1 中描述的方式应用于输入尺寸。
请添加图片描述
表 3:不同架构在每个空间分辨率下需要实体化的最大通道数 / 内存量(以 Kb 为单位)。我们假设激活函数使用 16 位浮点数。对于 ShuffleNet,我们使用 2 倍扩展和组数 g=3,以匹配 MobileNetV1 和 MobileNetV2 的性能。对于 MobileNetV2 和 ShuffleNet 的第一层,我们可以采用第五节中描述的技巧来减少内存需求。尽管 ShuffleNet 在其他地方采用了瓶颈结构,但由于非瓶颈张量之间存在快捷连接,这些非瓶颈张量仍需要被实体化。

看起是其采用这种架构改善了模型从而实现的性能提升。

5. 实验细节

反向残差瓶颈层允许一种特别内存高效的实现方式,这对移动应用至关重要。采用例如 TensorFlow [31] 或 Caffe [32] 的标准高效推理实现,构建了一个由代表操作的边和代表中间计算张量的节点组成的有向无环计算超图 G。计算安排是为了最小化需要存储在内存中的张量总数。在最一般的情况下,它搜索所有可行的计算顺序 Σ(G),并选取那个最小化内存需求的计算顺序。
M ( G ) = min ⁡ π ∈ Σ ( G ) max ⁡ i ∈ 1.. n [ ∑ A ∈ R ( i , π , G ) ∣ A ∣ ] + size ( π i ) M(G) = \min_{\pi \in \Sigma(G)} \max_{i \in 1..n} \left[ \sum_{A \in R(i, \pi, G)} |A| \right] + \text{size}(\pi_i) M(G)=πΣ(G)mini1..nmax AR(i,π,G)A +size(πi)

其中 R ( i , π , G ) R(i, \pi, G) R(i,π,G)是与任何节点 π i . . . π n \pi_i ... \pi_n πi...πn连接的中间张量列表, ∣ A ∣ |A| A代表张量 A A A的大小, size ( i ) \text{size}(i) size(i)是操作 i i i期间需要的内部存储的总内存量。

对于只有平凡并行结构(如残差连接)的图,只有一个非平凡的可行计算顺序,因此对于计算图 G G G上的推断所需要的总内存量和内存上限可以简化为:

M ( G ) = max ⁡ o p ∈ G [ ∑ A ∈ o p inp ∣ A ∣ + ∑ B ∈ o p out ∣ B ∣ + ∣ o p ∣ ] M(G) = \max_{op \in G} \left[ \sum_{A \in op_{\text{inp}}} |A| + \sum_{B \in op_{\text{out}}} |B| + |op| \right] M(G)=opGmax AopinpA+BopoutB+op

换句话说,内存量简单地是所有操作中组合输入和输出的最大总尺寸。

展示了如果我们将瓶颈残差块视为单个操作(并将内部卷积视为一次性张量),总内存量将由瓶颈张量的大小主导,而不是内部到瓶颈(且更大)的张量的大小。

瓶颈残差块:如图3b所示的瓶颈块操作符 F ( x ) F(x) F(x)可以表示为三个操作符的复合 F ( x ) = [ A ∘ N ∘ B ] x F(x) = [A \circ N \circ B]x F(x)=[ANB]x,其中 A A A是线性变换 A : R s × s × k → R s × s × n A : R^{s \times s \times k} \rightarrow R^{s \times s \times n} A:Rs×s×kRs×s×n N N N是非线性的逐通道变换: N : R s × s × n → R s ′ × s ′ × n N : R^{s \times s \times n} \rightarrow R^{s' \times s' \times n} N:Rs×s×nRs×s×n,而 B B B再次是到输出域的线性变换: B : R s ′ × s ′ × n → R s ′ × s ′ × k ′ B : R^{s' \times s' \times n} \rightarrow R^{s' \times s' \times k'} B:Rs×s×nRs×s×k

对于我们的网络 N = ReLU6 ∘ dwise ∘ ReLU6 N = \text{ReLU6} \circ \text{dwise} \circ \text{ReLU6} N=ReLU6dwiseReLU6,但结果适用于任何逐通道变换。

假设输入域的大小是 ∣ x ∣ |x| x,输出域的大小是 ∣ y ∣ |y| y,则计算 F ( X ) F(X) F(X)所需的内存可以低至 ∣ s 2 k ∣ + ∣ s ′ 2 k ′ ∣ + O ( max ⁡ ( s 2 , s ′ 2 ) ) |s^2k| + |s'^2k'| + O(\max(s^2, s'^2)) s2k+s′2k+O(max(s2,s′2))

该算法基于这样一个事实,即内部张量 I I I可以表示为 t t t个张量的连接,每个的大小为 n / t n/t n/t,我们的函数可以表示为:

F ( x ) = ∑ i = 1 t ( A i ∘ N ∘ B i ) ( x ) F(x) = \sum_{i=1}^{t} (A_i \circ N \circ B_i)(x) F(x)=i=1t(AiNBi)(x)

通过累计求和,我们只需要在任何时刻在内存中保留一个大小为 n / t n/t n/t的中间块。使用 n = t n = t n=t我们最终只需在任何时候保持单个通道的中间表示。

使我们能够使用这个技巧的两个约束是:(a)内部变换(包括非线性和逐深度卷积)是逐通道的,以及(b)连续的非逐通道操作具有输入大小到输出的显著比例。对于大多数传统神经网络,这样的技巧不会产生显著改进。

我们注意到,使用 t − t- t方式切分计算 F ( X ) F(X) F(X)所需的乘加操作数与 t t t无关,然而在现有实现中,我们发现用几个更小的矩阵乘法替换一个矩阵乘法会由于增加的缓存未命中而伤害运行时性能。我们发现,使用 t t t作为一个小常数(在2到5之间)时,这种方法最有帮助。它显著减少了内存需求,但仍然允许利用深度学习框架提供的高度优化的矩阵乘法和卷积操作带来的效率。是否特殊的框架级优化可能带来进一步的运行时改进,尚待观察。

讨论起算法性能另一个牛逼的层面,运算速度和效率。主要从计算速度和内存效率的角度探讨了如何通过对MobileNetV2中瓶颈残差块的智能处理来优化深度学习模型的推理。通过将瓶颈残差块视为单个操作,并将内部卷积视为一次性张量,可以大幅降低在执行推理时所需的内存量,同时确保计算速度高效。

这种优化特别适用于资源受限的环境,如移动设备,因为它允许模型在较低的内存需求下运行,同时尽量减少计算成本,而不牺牲太多的性能。将瓶颈层作为复合操作处理,并仔细安排中间结果的存储和计算,进一步减少了必须在内存中同时保持的中间表示的数据量。

简而言之,该实现注重于:

  • 内存效率:通过优化中间计算结果的存储方式,减少了在任一时刻需要在内存中保持的数据量。
  • 计算优化:尽管将一个大的矩阵乘法操作分割成多个小的矩阵乘法操作可能影响运行效率,但适当选择分割方式(如 t t t值的选择)可以在保证内存高效的同时,最大限度地利用深度学习框架提供的优化卷积和矩阵乘法操作。
  • 适应性:通过调整超参数和模型结构,可以针对不同的性能需求和计算资源限制来定制模型,实现准确率和推理速度的最佳权衡。

总的来说,这些实施细节和优化手段强调了在实际应用中,特别是在资源有限的设备上部署深度学习模型时,对于计算效率和内存使用优化的重要性。属于是大佬层面考虑的问题了

6. 实验讨论

训练设置
我们使用TensorFlow[31]训练我们的模型。我们使用标准的RMSProp优化器,将衰减和动量都设置为0.9。在每一层之后使用批量归一化,标准的权重衰减设定为0.00004。遵循MobileNetV1[27]的设置,我们使用初始学习率为0.045,并且每个时期的学习率衰减率为0.98。我们使用16个GPU异步工作器,以及批量大小为96。

结果
我们将我们的网络与MobileNetV1、ShuffleNet和NASNet-A模型进行比较。表4展示了一些选定模型的统计数据,完整的性能图展示在图5中。
请添加图片描述

可以了可以了大佬收了神通吧,后续的实验部分感兴趣的读者可以自行阅读。

7. 总结

总的来说,MobileNetV2提供了一个针对移动设备高度优化的模型,这使其成为众多视觉识别任务的理想基础。其主要目标是为了实际应用的落地而设计,尽管许多在性能方面不太考虑效率的算法在某些领域可能更为强大,感兴趣的读者可以自我探索和深入研究。本篇文档接下来的部分将讨论V3版本以及与之比较的其他模型。这里预留了一个探索的空间,接下来的的部分将会对V3以及文中提到到的对比模型进行讲解。挖个坑埋点土数个一二三四五。下期见。

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

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

相关文章

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用, clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

【数据结构-二维差分】力扣2536. 子矩阵元素加 1

给你一个正整数 n ,表示最初有一个 n x n 、下标从 0 开始的整数矩阵 mat ,矩阵中填满了 0 。 另给你一个二维整数数组 query 。针对每个查询 query[i] [row1i, col1i, row2i, col2i] ,请你执行下述操作: 找出 左上角 为 (row1…

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

使用Diskgenius系统迁移

使用Diskgenius系统迁移 1、使用系统迁移2、注意点3、新备份的系统盘装在电脑上可能出现盘符错乱导致开机不进入桌面情况 1、使用系统迁移 参考视频: DiskGenius无损系统迁移,换硬盘无需重装系统和软件 2、注意点 1)新的硬盘里面的所有资料…

数据结构_1.1、数据结构的基本概念

1、基本概念 数据:是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理…

【IEEE 独立出版,快速EI检索】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024) 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 官方信息 会议官网:www.aivrv.org 2024 4th International Conference on…

NXP官方或正点原子mfgtool下载系统报错initialize the library falied error code:29

这是因为mfgtool版本或者源文件被破坏了,你可以重新下载一个被改过的mfgtool程序,我就是去原子官网重新在linux包里找了新的更迭过的mfgtool

【AI大语言模型】提示词工程基础及进阶

【AI大语言模型】提示词工程基础及进阶 什么是提示词(Prompt) 提示词(Prompt)是与人工智能对话时用来引导或触发生成某种输出的指令。 它相当于你在与 AI 进行互动时所提出的问题或任务说明。提示词可以是简短的指令、一个问题…

springboot注册和注入组件方式概览

IoC:Inversion of Control(控制反转) 控制:资源的控制权(资源的创建、获取、销毁等) 反转:和传统的方式不一样了 DI :Dependency Injection(依赖注入) 依赖&…

C++编程语言:基础设施:命名空间(Bjarne Stroustrup)

第 14 章 命名空间(Namespaces) 目录 14.1 组成问题(Composition Problems) 14.2 命名空间(Namespaces) 14.2.1 显式修饰(Explicit Qualification) 14.2.2 使用using 声明 14.2.3 using 指令 14.2.4 参数依赖查询 14.2.5 命名空间的开放性 14.3 模块化和接口 …

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么? 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类:对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…

自定义dialog 背景属性差异

比如正常要实现的dialog效果: 代码如此: public class SimpleDialog extends Dialog {private Button permissionokTv;//确定按钮private Button permissionnoTv;//取消按钮private TextView permissiontitleTv;//消息标题文本private TextView permiss…

[OpenGL]使用OpenGL绘制带纹理三角形

一、简介 本文介绍了如何使用使用OpenGL绘制带纹理三角形。 在绘制带纹理的三角形时, 首先使用.h读取准备好的.png格式的图片作为纹理,然后在fragment shader中使用 ... in vec2 textureCoord; uniform sampler2D aTexture1; void main() {FragColor …

Elionix 电子束曝光系统

Elionix 电子束曝光系统 - 上海纳腾仪器有限公司 -

您可能一直在寻找的 10 个非常有用的前端库

文章目录 前言正文1.radash2.dayjs3.driver4.formkit/drag-and-drop5.logicflow6.ProgressBar7.tesseract8.zxcvbn9.sunshine-track10.lottie 前言 前端开发中,总有一些重复性的工作让我们疲于奔命。为了提高开发效率,我们精心挑选了10个功能强大、易于…

数据结构与算法——Java实现 7.习题——反转链表

当你穿过了暴风雨,你已不是原来那个人 —— 24.9.21 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输…

【Stm32】从零建立一个工程

这里我们创建“STM32F103”系列的文件,基于“固件库” 1.固件库获取 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 2.使用Keil创建.uvprojx文件 前提是已经下载好了“芯片对应的固件” 3.复制底层驱动代码 将固件库下的…

大数据新视界 --大数据大厂之JavaScript在大数据前端展示中的精彩应用

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

linux安装Anaconda3

先将Anaconda3安装包下载好,然后在主文件夹里新建一个文件夹,将Anaconda3安装包拖进去。 打开终端未来不出现缺东西的异常情况,我们先安装 yum install -bzip2然后进入根目录下,在进入Anaconda3文件夹下 sh包安装方式 sh Anac…

【二十四】【QT开发应用】ScorllArea应用3,补全ScorllArea代码以及ListWidget与ScorllArea联动的信号槽和槽函数编写

补全ScorllArea代码逻辑 我们将其他ListItem项目全部设置成和基本设置一样的代码,唯独不一样的就是把题头的label修改成对应的文本,例如基本设置,云盘设置等。 Widget对应一个类 每一个Widget创建对应的类,头文件和cpp文件&am…