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

news2024/9/21 21:04:06

请添加图片描述

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.coloradmin.cn/o/2153296.html

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

相关文章

【C++二叉树】二叉树的前序遍历、中序遍历、后序遍历递归与非递归实现

1.二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣(LeetCode) 前序遍历方式:根-左子树-右子树。 递归实现: 要传一个子函数来实先递归,原因是原函数返回值为vector,在原函数迭代,返回值就难…

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求,本系统采用运用较为广…

一、机器学习算法与实践_03概率论与贝叶斯算法笔记

1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目,是通过对 样本 的分析,来评估/估计 总体 的情况,与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…

Qt窗口——对话框

文章目录 对话框自定义对话框对话框分类消息对话框QMessageBox使用示例自定义按钮快速构造对话框 颜色对话框QColorDialog文件对话框QFileDialog字体对话框QFontDialog输入对话框QInputDialog 对话框 对话框可以理解成一个弹窗,用于短期任务或者简洁的用户交互 Qt…

AIoT智能工控板

在当今竞争激烈的商业环境中,企业需要强大的科技力量来助力腾飞,AIoT智能工控板就是这样的力量源泉。 其领先的芯片架构设计,使得主板的性能得到了极大的提升。无论是数据的处理速度、图形的渲染能力,还是多任务的并行处理能力&a…

【Linux笔记】虚拟机内Linux内容复制到宿主机的Window文件夹(文件)中

一、共享文件夹 I、Windows宿主机上创建一个文件夹 目录:D:\Centos_iso\shared_files II、在VMware中设置共享文件夹 1、打开VMware Workstation 2、选择需要设置的Linux虚拟机,点击“编辑虚拟机设置”。 3、在“选项”标签页中,选择“共…

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析

2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析 更新进展 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题

309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态,因此我们可以选择用三个数组,其中: ▪ dp[i][0] 表示:第 i 天结束后&#xff0c…

探索AI编程新时代:GitHub Copilot如何重塑开发者工作效率

在当今技术瞬息万变的时代,软件开发者们每天都在努力寻找更高效的编程方法。面对繁忙的工作日程和不断增加的项目压力,如何在编码过程中大幅提升效率成为了一个备受关注的话题。在众多工具中,GitHub Copilot以其强大的AI驱动能力脱颖而出&…

菜鸟也能轻松上手的Java环境配置方法

初学者学习Java这么编程语言,第一个难题往往是Java环境的配置,今天与大家详细地聊一聊,以便大家能独立完成配置方法和过程。 首先,找到“JDK”,点击“archive”: 向下滑,在“previous java rel…

HTTPS:构建安全通信的基石

HTTPS(Hypertext Transfer Protocol Secure),作为互联网上安全通信的基石,通过在HTTP基础上引入SSL/TLS协议层,实现了数据传输的加密,确保了信息的机密性、完整性和真实性。这一过程涉及多个精细设计的步骤…

【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统

Github项目地址:https://github.com/fecommunity/easy-blog, 欢迎Star。 Easy-Blog Easy-Blog 是一套集成文章发表、页面创建、知识库管理、博客后台管理等功能于一体的博客系统。 首页-浅色主题 首页-暗黑主题 文章阅读 后台管理 ✨ 特性 &#…

公司网站改版时,需要注意哪些细节?

在公司网站改版时,需要注意的细节非常多,这些细节将直接影响到网站的用户体验、SEO效果以及整体品牌形象。以下是一些关键的注意事项: 明确改版目标: 在改版前,要明确改版的目标是什么,比如提升用户体验、增…

【AcWing】873. 欧拉函数

#include<iostream> using namespace std;int main(){int n;cin>>n;while(n--){int x;cin>>x;int resx;for(int i2;i<x/i;i){if(x%i0){//resres*(1-1/i);整数1/i等于0&#xff0c;算不对且会溢出//以下几种都能ac//resres/i*(i-1);i*(1-1/i)i-1&#xff0…

通过标签实现有序:优化你的 FastAPI 生成的 TypeScript 客户端

在软件开发的世界里&#xff0c;API 客户端代码的质量直接影响着应用程序的性能和可维护性。随着项目规模的扩大&#xff0c;自动化生成的代码往往变得臃肿且难以管理。但幸运的是&#xff0c;通过一系列的优化策略&#xff0c;我们可以显著提升这些代码的优雅与效能。在本文中…

计算机网络(八) —— Udp协议

目录 一&#xff0c;再谈端口号 1.1 端口号 1.2 netsta命令 二&#xff0c;UDP协议 2.1 关于UDP 2.2 Udp协议格式 2.3 Udp协议特点 2.4 Udp的缓冲区 一&#xff0c;再谈端口号 http协议本质是“请求 - 响应”形式的协议&#xff0c;但是应用层需要先将数据交给传输层&…

2024/9/21 408 20题

a b 58-130-180-199-42-15&#xff1a;c d a 184-182-187-176-19941 c d a a c b d c a c b c c c

12V转100V低压升高压DC/DC电源GRB12-100D-100mA-Uz(0-3V)

特点 ● 效率高达75%以上 ● 1*2英寸标准封装 ● 单电压输出 ● 超高性价比 ● 电压控制输出,输出电压随控制电压的变化而线性变压 ● 工作温度: -40℃~75℃ ● 阻燃封装&#xff0c;满足UL94-V0 要求 ● 温度特性好 ● 可直接焊在PCB 上 应用 GRB 系列模块电源是一…

深度学习笔记17_TensorFlow实现咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…