【笔记整理】轻量级神经网络 MobileNetV3

news2024/12/23 19:43:46

【笔记整理】轻量级神经网络 MobileNetV3

文章目录

  • 【笔记整理】轻量级神经网络 MobileNetV3
    • 1、深度可分离卷积
    • 2、翻转残差块和线性瓶颈结构
    • 3、h-swish 函数和 SE 模块
    • 4、网络结构搜索

近年来关于 CNN 的研究在飞速发展,CNN 模型在目标检测、图像分割等领域都取得了不错的研究成果。为了提高模型在这些领域的检测准确率,越来越多的研究者们在网络设计深度上做研究,比如 ResNet 残差模块的提出为 CNN 在特征提取的发展上奠定了理论基础和实践方向,使得模型在后来发展中取得了卓越的性能改进。残差模块虽然有效解决了模型梯度消失的问题,但模型结构变得十分复杂,网络深度甚至多达一百多层,计算量也大大增加,模型的训练更多需要依靠高算力的服务器,尤其在一些实际应用中,比如对于自动驾驶,实时目标检测任务来说,这些庞大而又复杂的模型很难满足工业上的要求。

为了平衡 CNN 模型在检测准确率和计算开销上的性能,Google 团队在 2017 年提出了轻量级的神经网络模型 MobileNetV1,其核心是运用深度可分离卷积(depthwise separable convolution)的思想构建模型,同时引入两个全局性超参数(宽度因子和分辨率因子),能够有效的平衡模型延迟度和准确度两者之间的关系,相比于其它 CNN 网络模型,MobileNetV1 参数更少,计算速度更快。Google 团队在 2018 年提出的 MobileNetV2则借鉴了 ResNet 残差连接的思想,利用深度可分离卷积在高维通道特征图上相较于标准卷积而言计算速度更快的优点,引入了翻转残差(inverted residuals)和线性瓶颈(linear bottleneck)模块有效避免梯度消失的问题。在 2019 年 Google 团队在 MobileNetV2 基础块上进行了改进,在其深度卷积层和分离卷积层之间引入了 Squeeze-Excited 模块,对特征进行压缩处理,提出了 MobileNetV3 网络。

MobileNetV3 使用 hswish 激活函数替代 swish 激活函数,提高了模型运算效率。在网络结构上,通过一种基于终端的网络结构搜索算法(platform-aware neural architecture search,MnasNet)优化每个轻量级网络模块以及不同模块间的连接关系,进而生成一个初始网络结构。接着使用网络自适应算法(Platform-Aware Neural Network Adaptation,NetAdapt)在设置好优化目标下对MnasNet 生成的初始网络结构进行层级的参数优化,进而得到全局最优的模型。轻量级神经网络可以应用在算力较低的硬件设备上,使得 CNN 这个强大的特征提取器可以普及到任何终端设备,完成设备的功能扩展以及应用的开发。

1、深度可分离卷积

卷积层是 CNN 中最核心的一层,在提取特征时使用卷积核完成卷积运算。在图像处理中,卷积核通过线性运算可以对图像的局部特征进行提取,对图像局部区域进行感知,随着 CNN 卷积层数的增加,CNN 可以获得更大的局部区域感知视野,进而完成对整张图像的感知。

通常卷积核包括 4 个参数:卷积核高度 D h D_ℎ Dh,卷积核宽度 D w D_w Dw,卷积核通道数 M M M,卷积核个数 N N N。其中卷积核的尺寸大小一般是奇数 × 奇数,即 D h D_ℎ Dh = D w D_w Dw,最常见的是 1×1,3×3 或 5×5,因此这里用 D k D_k Dk 来共同表示 D h D_h Dh D w D_w Dw
在单通道卷积运算中,卷积操作可以把卷积核当作一个滑动窗口,从左往右、从上到下依次和图像被“遮住”的区域进行卷积操作,每次完成对应位置相乘再相加的点积运算,待扫描完整张图片之后,得到的一个矩阵即为一个特征图。在多通道卷积运算中,对每个通道得到的特征图按相应位置进行相加,得到最终的特征图。传统卷积操作如下图所示。

在这里插入图片描述

CNN 在做卷积运算时,除了卷积核 4 个参数外,还引入卷积核每次滑动的步长(stride)和填充值(padding)。如果 stride 设置为 1,则相邻两次扫描的局部区域在感知视野之间存在较大的重复区域,如果 stride 值大于 D k D_k Dk,则相邻两次扫描的局部区域在感知视野之间存在原图信息上的丢失。使用 padding 可以对原特征图边缘进行像素 0 的填充,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输入和输出的特征图大小保持一致。其中 padding 有两种模式:1)Valid padding:padding 值为 0,对原特征图或原始图像不进行任何处理,不允许卷积核超出原特征图或原始图像边界;2)Same padding:padding 值为 D k − 1 2 \frac{D_k−1}{2} 2Dk1 ,对原特征图或原始图像进行像素 0 的填充,允许卷积核超出原特征图或原始图像边界,并使得卷积后特征图的大小与原来的一致。
设输入特征尺寸为 s i z e i n × s i z e i n size_{in} × size_{in} sizein×sizein,通道数为 c h a n n e l i n channel_{in} channelin,则输入特征维数,输出特征的维数和卷积核参数之间存在如下特定关系:

1)输入特征的通道数 c h a n n e l i n channel_{in} channelin = 卷积核的通道数

2)输出特征的通道数 c h a n n e l o u t channel_{out} channelout = 卷积核的个数 N N N

3)输出特征的尺寸 s i z e o u t size_{out} sizeout为:

s i z e o u t = ⌊ s i z e i n + 2 × p a d d i n g − D k s t r i d e ⌋ + 1 size_{out} = \lfloor \frac{size_{in} + 2 \times padding - D_k}{stride} \rfloor + 1 sizeout=stridesizein+2×paddingDk+1

因此对于每一次传统的卷积运算,卷积参数总数 P a r a m n u m Param_{num} Paramnum 和卷积计算量 𝐶𝑜𝑠𝑡 分别为

P a r a m n u m = D k × D k × M × N Param_{num} = D_k \times D_k \times M \times N Paramnum=Dk×Dk×M×N C o s t = D k × D k × M × N × s i z e o u t × s i z e o u t Cost = D_k \times D_k \times M \times N \times size_{out} \times size_{out} Cost=Dk×Dk×M×N×sizeout×sizeout

MobileNet 中最大的突破在于引入了深度可分离卷积,将传统的卷积操作分解成逐通道卷积(Depthwise Convolutional,DW)和逐点卷积(Pointwise Convolutional,PW)两部分。深度可分离卷积操作如下图所示。

在这里插入图片描述

与传统卷积相比,每个卷积层的 DW 卷积核的个数只有一个,其通道数和输入特征图的通道数保持一致,因此每次 DW 操作时只会得到一种类型的特征图,不能对原始特征进行升维和降维功能。为了解决这个问题,MobileNet 引入了逐点卷积(PW),其实际上是使用 1 × 1 × M × N 1 \times 1 \times M \times N 1×1×M×N 的卷积核对 DW 卷积得到的特征图进行传统的卷积操作( M M M 为 PW 卷积核的通道数, N N N 为 PW 卷积核的个数),深度可分离卷积最终输出的特征的通道数即为 PW 卷积核的个数。
在 MobileNet 的每个卷积层中,先进行 DW 卷积再进行 PW 卷积,DW 卷积核个数只有一个,目的是为了获得对图像中局部区域的感知,而 PW 卷积核尺寸只有 1 × 1,可以通过扩展PW 卷积核个数来实现特征的升维和降维,相较于传统卷积而言,降低了升维和降维带来的参数量的增加。

对于每一次深度可分离卷积运算,卷积参数总数 P a r a m n u m Param_{num} Paramnum 和卷积计算量 𝐶𝑜𝑠𝑡 分别为

P a r a m n u m = D k × D k × M + 1 × 1 × M × N Param_{num} =D_k \times D_k \times M + 1 \times 1 \times M \times N Paramnum=Dk×Dk×M+1×1×M×N C o s t = D k × D k × M × s i z e o u t × s i z e o u t + s i z e o u t × s i z e o u t × 1 × M × N Cost = D_k \times D_k \times M \times size_{out} \times size_{out} + size_{out} \times size_{out} \times 1 \times M \times N Cost=Dk×Dk×M×sizeout×sizeout+sizeout×sizeout×1×M×N

深度可分离卷积和传统卷积的计算量比较如下:

D k × D k × M × s i z e o u t × s i z e o u t + s i z e o u t × s i z e o u t × 1 × M × N D k × D k × M × N × s i z e o u t × s i z e o u t = 1 N + 1 D k 2 \frac{D_k \times D_k \times M \times size_{out} \times size_{out} + size_{out} \times size_{out} \times 1 \times M \times N}{D_k \times D_k \times M \times N \times size_{out} \times size_{out}} \\ = \frac{1}{N} + \frac{1}{D^2_k} Dk×Dk×M×N×sizeout×sizeoutDk×Dk×M×sizeout×sizeout+sizeout×sizeout×1×M×N=N1+Dk21

可以看到,如果仅生成一种类型的特征图(𝑁 = 1),深度可分离卷积的方法在参数量和计算量上都不如传统卷积好,随着生成越来越多类型的特征图,深度可分离卷积就能够节省更多的参数。由于卷积核大小 D k D_k Dk 一般远小于卷积核的个数 N N N,因此深度可分离卷积的计算速度比正常卷积的快 D k 2 D_k^2 Dk2

尽管 MobileNet 相较于其他庞大而又结构复杂的模型已经很轻量了,但还可以使用宽度缩放因子 α ∈ ( 0 , 1 ] \alpha \in (0, 1] α(0,1] 和分辨率缩放因子 ρ ∈ ( 0 , 1 ] \rho \in (0, 1] ρ(0,1]对 MobileNet 进一步轻量化。
对于宽度缩放因子 𝛼,将每层的输入输出通道数分别缩放为 α M \alpha_M αM α N \alpha_N αN,缩放后的参数量 P a r a m n u m Param_{num} Paramnum 和计算量 𝐶𝑜𝑠𝑡 如下式子所示:

P a r a m n u m = D k × D k × α M + 1 × 1 × α M × α N C o s t = D k × D k × α M × s i z e o u t × s i z e o u t + s i z e o u t × s i z e o u t × α M × α N Param_{num} = D_k \times D_k \times \alpha M + 1 \times 1 \times \alpha M \times \alpha N \\ Cost = D_k \times D_k \times \alpha M \times size_{out} \times size_{out} + size_{out} \times size_{out} \times \alpha M \times \alpha N Paramnum=Dk×Dk×αM+1×1×αM×αNCost=Dk×Dk×αM×sizeout×sizeout+sizeout×sizeout×αM×αN

通过为 DW 卷积核的通道数和 PW 卷积核的个数增加一个缩放因子 𝛼,可以得到如下多种规格的 MobileNet:1.0 MobileNet-2240.75 MobileNet-2240.5 MobileNet-224,其中卷积核数量和通道数的减少会降低模型的分类精度。
对于分辨率缩放因子𝜌,将每层的输入输出特征图的尺寸分别缩放为 𝜌𝑠𝑖𝑧𝑒𝑜𝑢𝑡,结合宽度缩放因子 𝛼,缩放后的参数量和计算量分别为:

P a r a m n u m = D k × D k × α M + 1 × 1 × α M × α N C o s t = D k × D k × α M × ρ s i z e o u t × ρ s i z e o u t + ρ s i z e o u t × ρ s i z e o u t × α M × α N Param_{num} = D_k \times D_k \times \alpha M + 1 \times 1 \times \alpha M \times \alpha N \\ Cost = D_k \times D_k \times \alpha M \times \rho size_{out} \times \rho size_{out} + \rho size_{out} \times \rho size_{out} \times \alpha M \times \alpha N Paramnum=Dk×Dk×αM+1×1×αM×αNCost=Dk×Dk×αM×ρsizeout×ρsizeout+ρsizeout×ρsizeout×αM×αN

可以发现改变 𝜌 并没有改变 MobileNet 模型的参数量,只改变模型输出特征图的尺寸大小。通过分辨率缩放因子 𝜌,可以得到如下多种规格的 MobileNet:1.0 MobileNet-224、1.0 MobileNet192、1.0 MobileNet-160,其中 MobileNet 输出特征图尺寸的减少会降低模型的分类精度。

2、翻转残差块和线性瓶颈结构

在 MobileNetV2 中,作者借鉴了 Residual 残差块的思想,通过跨层的跳跃连接实现残差的正向传播,并且在反向传播时放大残差模块中关于权重的更新。残差块如下图所示。

在这里插入图片描述

在残差块中,输入的特征首先经过 1 × 1 卷积的压缩,然后利用 3 × 3 的卷积进行特征提取,最后再用 1 × 1 的卷积将整个特征图的通道数变回去,整个过程实现“降维-卷积-升维”,这样设计的目的是减少 3 × 3 卷积核在特征提取时的计算量,提高整个残差模块的计算效率。
标准的的残差块并不适用于MobileNet的深度可分离卷积操作,由上式子(param,cost)可知,深度可分离卷积随着PW卷积核个数的增加计算效率会越高,因此需要通过翻转残差块来提高MobileNetV2 的性能,翻转残差块如下图所示。

在这里插入图片描述

在翻转残差块中,输入的特征首先经过 1 × 1 的 PW 卷积进行特征图通道的扩张,然后使用 3 × 3 的 DW 卷积进行特征提取,最后再用 1 × 1 的 PW 卷积将特征图的通道数压缩回去,整个过程实现“升维-卷积-降维”,因此整个模块所做的是与标准残差块相反的操作。
在翻转残差块中使用的是 Relu6 激活函数,该函数为 Relu 函数设置了值为 6 的上界,函数表达式如下所示,函数图像如下图所示。

R e l u 6 = m i n ( 6 , m a x ( 0 , x ) ) Relu6 = min(6,max(0,x)) Relu6=min(6,max(0,x))

在这里插入图片描述

在 MobileNetV2 中,作者认为 Relu 激活函数在对低维空间进行非线性变换时,容易丢失特征的关键信息,因此在 MobileNetV2 中引入线性瓶颈结构,即在翻转残差模块中执行了第二次PW 卷积降维操作之后,用 linear 线性映射代替 Relu 激活函数进行特征提取。翻转残差模块中的线性瓶颈结构如下图所示。

在这里插入图片描述

相比于 MobileNetV1,MobileNetV2 在 DW 卷积之前先进行 PW 卷积,主要原因是 DW 卷积没有改变通道数的能力,上一层特征图有多少通道它就只能输出多少通道的特征图,如果上一层特征图的通道数很少,DW 卷积只能在低维空间上提取特征,这样效果并不好,因此这里在 DW 卷积之前使用 PW 卷积,在原来深度可分离卷积操作的基础上设计了翻转残差模块,提高 DW 卷积的特征提取能力,并有效避免梯度消失的问题。

3、h-swish 函数和 SE 模块

由于 Relu6 函数在处理低维特征时容易出现信息丢失问题,而 sigmoid 函数不存在这个问题,因此可以用 swish 函数来替代 Relu6,函数如下式所示,图像如下图所示。

s w i s h [ x ] = x ⋅ s i g m o i d ( β x ) swish[x] = x \cdot sigmoid(\beta x) swish[x]=xsigmoid(βx)

在这里插入图片描述

考虑到 sigmoid 函数在 CPU 中计算开销比 Relu 函数大,因此 MobileNetV3 使用 R e L U 6 ( x + 3 ) 6 \frac{ReLU_6(x+3)}{6} 6ReLU6(x+3)函数分段线性模拟 sigmoid 函数,如下图所示:

最终将 swish 函数替换成 h-swish 函数,函数表达式如下式所示,函数图像如下图所示。

h − s w i s h [ x ] = x R e L U 6 ( x + 3 ) 6 h-swish[x] = x \frac{ReLU6(x+3)}{6} hswish[x]=x6ReLU6(x+3)

MobileNetV3借鉴了Squeeze-and-Excite(SE)模块与残差块并联整合的想法,在MobileNetV2 的翻转残差块基础上加入了 SE 模块,对 DW 卷积后的特征进行增强,其中 MobileNet V3-SE 模块如下图所示。

在这里插入图片描述

在 MobileNetV3-SE 模块中,先对 DW 卷积特征图进行全局平均池化 (GAP),获得一个
1 × 1 × C 1 \times 1 \times C 1×1×C的向量; 接着设置 SE ratio 为 0.25,经过第一次全连接和激活操作之后,将输出通道数压缩为原来的 1 4 \frac{1}{4} 41;接着经过第二次全连接和激活操作,将输出通道数扩张为 𝐶,SE 模块输出 1 × 1 × C 1 \times 1 \times C 1×1×C 的向量。最终将 1 × 1 × C 1 \times 1 \times C 1×1×C 向量与 DW 卷积后的 H × W × C H \times W \times C H×W×C 特征图逐通道相乘,实现特征增强。SE 模块对输入特征图的整个通道进行压缩,输出的 scale 可以把重要的特征进行增强,不重要的特征进行减弱,让提取的特征更具有指向性。

4、网络结构搜索

MobileNetV3 使用基于终端的的网络结构自动搜索算法 MnasNet 生成一个初始网络,使用下式对每个 Block 内的超参数进行搜索和优化,其中 A C C ( m ) ACC(m) ACC(m)表示第 m m m 个模型在 COCO 测试集上的预测准确率, L A T ( m ) LAT(m) LAT(m)是第 m m m 个模型的预测时延, T A R TAR TAR是人为设置下模型预测时允许的最大时延, w w w是时延惩罚项。

A C C ( m ) × [ L A T ( m ) / T A R ] w ACC(m) × [LAT(m)/TAR]^w ACC(m)×[LAT(m)/TAR]w

关于每个 Block 的参数搜索空间如下:

  • 卷积算子:传统卷积算子,深度可分离卷积算子,倒置瓶颈卷积算子;

  • 卷积核尺寸:3 × 3, 5 × 5;

  • 跳跃连接算子:最大池化,平均池化,残差连接块,不使用跳跃连接;

  • 卷积核个数:𝐹𝑖;

  • 每个块包含的层数:𝑁𝑖;

网络结构搜索问题是一个多目标的搜索问题,在 MnasNet 中使用强化学习方法来寻找该问题的帕累托最优解。首先将搜索空间中的每个 Block 映射成一个 token 向量,用于表示智能体在基于模型参数 𝜃 下,选择要将哪个 Block 加入到现有的模型中,MnasNet 的优化目标是最大化如下式所示的期望奖励函数。

J = E P ( α 1 : T ; θ ) [ R ( m ) ] J = E_P(\alpha_{1:T};\theta) [R(m)] J=EP(α1:T;θ)[R(m)]

其中 m m m 表示通过动作 α 1 : T \alpha_{1:T} α1:T 采样得到的唯一模型,而 R ( m ) R(m) R(m)是该模型通过式上上式子 计算的指标值。

作者在使用 MnasNet 优化网络结构时发现,对于小模型而言,时延的增加会导致模型精度 的急剧增大,为了让 NetAdapt 参数优化过程更加平稳,需要将式 (2.14) 中的 w = 0.07 修改为 w = 0.15 w= 0.15 w=0.15 来加大因时延增加对优化指标带来的惩罚。

MnasNet在确定好Block块内部层结构以及Block块之间的连接关系之后,使用NetAdapt 对MnasNet优化得到的网络结构进行层级的参数优化,优化目标设置为 Δ A c c ∣ Δ L a t e n c y ∣ \frac{ΔAcc}{|ΔLatency|} ∣ΔLatencyΔAcc。关于NetAdapt 的参数优化算法如下:

  1. 使用 MnasNet 优化得到一个网络结构;

  2. 每一步的迭代过程如下(如果大于预期设置好的时延则迭代结束):

    1)增加关于时延变化量的约束,如果当前探索到的局部最优模型相较于全局最优模型,
    其时延变化量大于 𝛿,则将当前的局部最优模型作为全局最优模型;

    2)对上一步得到的预训练模型的层结构参数,通过删除或随机初始化参数方式进行微
    调。在对当前步的模型进行 𝑇 步微调之后计算其在 COCO 数据集上的准确率;

    3)输出当前全局最优的模型;

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

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

相关文章

力扣sql中等篇练习(二十九)

力扣sql中等篇练习(二十九) 1 计算每个销售人员的影响力 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT s1.salesperson_id,s1.name,IFNULL(t.total…

毕业季到底是去大厂还是去小公司

(点击即可收听) 毕业季到底是去大厂还是去小公司 相信很多人在选择大小公司的时候,会比较痛苦,外面的人想进去,里面的人想出来,至于选择大厂还是小公司 这是因人而异的,不同的阶段都可以有不同的选择 进大厂不一定就是对的,进小公司也不一定就是错的,学习东西,增长经…

股票量化分析工具QTYX使用攻略——涨停个股挖掘热门板块(更新2.6.5)

搭建自己的量化系统 如果要长期在市场中立于不败之地!必须要形成一套自己的交易系统。 行情不等人!边学习边实战,在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习,也可以用于实战炒股分析的量化系统——QTYX。 QTY…

软考A计划-试题模拟含答案解析-卷九

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

JetBrains的多数据库管理和SQL工具DataGrip 2023版本在Win10系统的下载与安装配置教程

目录 前言一、DataGrip 安装二、使用配置总结 前言 DataGrip是一款多数据库管理和SQL工具,适用于不同类型的数据库。它提供了丰富的功能和工具,可以帮助开发人员更高效地管理数据库、编写SQL查询和执行数据操作。 DataGrip的主要特点: ——…

这里有3个Tips,也许可以帮你躲过ChatGPT大规模封号 | AIGC实践

据说,从昨天开始,ChatGPT又双叒叕开始大规模封号,很多注册用户收到这样一则消息: 大意是说:OpenAI 发现了你的 ChatGPT 账号存在可疑活动,为了保障平台安全,已自动退款并取消你的 ChatGPT Plus …

驱动开发:内核解析内存四级页表

当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了9-9-9-9-12的分页模式,9-9-9-9-12分页表示物理地址拥有四级页表,微软将这四级依次命名为PXE、PPE、P…

七年老程序员的三四月总结:三十岁、准备婚礼、三次分享

你好,我是 shixin,一名工作七年的安卓开发。 每两个月我会做一次总结,记下这段时间里有意义的事和值得反复看的内容,为的是留一些回忆、评估自己的行为、沉淀有价值的信息。 一转眼 2023 年过去了三分之一,这两个月经历…

【数据湖仓架构】数据湖和仓库:Databricks 和 Snowflake

是时候将数据分析迁移到云端了。我们比较了 Databricks 和 Snowflake,以评估基于数据湖和基于数据仓库的解决方案之间的差异。 在这篇文章中,我们将介绍基于数据仓库和基于数据湖的云大数据解决方案之间的区别。我们通过比较多种云环境中可用的两种流行技…

HTML+CSS+JavaScript制作弹幕效果

全屏弹幕 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>弹幕效果</title><style>/* 设置弹幕的样式 */.bullet {position: absolute;font-size: 20px;color: white;text-shadow: 1px 1px 1px black;white-s…

用Python让小朋友的手绘图跳起来(附源码)

大家好&#xff0c;我是小F&#xff5e; 今天给大家介绍一个非常有趣的项目&#xff0c;基于AI识别&#xff0c;制作儿童手绘图舞蹈图。 只需几分钟&#xff0c;就能自动生成儿童手绘人物或类人角色&#xff08;即具有双臂、两条腿等的角色&#xff09;的动画&#xff0c;而且生…

波奇学C++:模板和STL

什么是模板&#xff1f;为什么我们需要模板&#xff1f; 先假设一个场景&#xff0c;我们要编写一个函数交换a,b两个数的值 void swap(int& a,int& b) {int cmpa;ab;ba; } swap函数可以帮我们交换两个int型的值&#xff0c;那如果要交换的类型是float&#xff0c;do…

基础篇010.1 STM32驱动RC522 RFID模块之一:基础知识

目录 1. RFID概述 1.1 RFID工作原理 1.2 RFID分类 1.3 RFID模块 1.4 RFID卡片 1.5 IC卡和ID卡介绍 1.6 IC卡和ID的区分 2. Mifare卡结构原理 2.1 Mifare卡概述 2.2 Mifare非接触式 IC 卡性能简介&#xff08;M1&#xff09; 2.2.1 Mifare S50与Mifare S70 2.2.2 S5…

操作系统的发展史

█ DOS操作系统 上期提到&#xff0c;20世纪70年代&#xff0c;伴随着计算机技术的成熟&#xff0c;操作系统也进入了一个快速发展阶段。现代操作系统的概念&#xff0c;也在那一时期逐渐形成。 1975年初&#xff0c;MITS电脑公司推出了基于Intel 8080芯片的Altair 8800微型计算…

7 种常见的路由协议

网络路由是网络通信的重要组成部分&#xff0c;通过互联网将信息从源地址移动到目的地的过程。路由发生在 OSI 模型的第 3 层&#xff08;网络层&#xff09;。实际网络中通常会将静态和动态路由结合使用。静态路由适用于小型网络&#xff0c;而动态路由适用于大型网络。 什么…

Office project 2013安装

哈喽&#xff0c;大家好。今天一起学习的是project 2013的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

Anthropic 推出 Claude ,一款与ChatGPT竞争的聊天机器人

最近&#xff0c;谷歌承诺向 Anthropic 投资 3 亿美元&#xff0c;收购这家初创公司 10% 的股份。 Anthropic 是一家由前 OpenAI 员工共同创立的初创公司&#xff0c;近日推出一款与ChatGPT对标的产品。 Anthropic 名为 Claude 的人工智能聊天机器人&#xff0c;可以被指示执行…

【Zero to One系列】window系统安装Linux、docker

1、在window系统安装Linux&#xff08;开启微软的Linux子系统功能-WSL&#xff09; 1.1 什么是WSL&#xff1f; 传送门&#xff1a;适用于 Linux 的 Windows 子系统安装指南 (Windows 10) 链接里有全部的步骤 1.2 开启 WSL 在 控制面板-->程序和功能 页面找到 Windows 功…

【运维知识进阶篇】Ansible自动化运维-PlayBook详解

这篇文章给大家介绍下PlayBook&#xff0c;我们叫它剧本&#xff0c;它是以一种固定的格式&#xff0c;将多个ad-hoc放入yml文件中。在Ansible中&#xff0c;剧本文件是yml结尾的&#xff0c;在SaltStack中剧本文件是sls结尾的&#xff0c;但是两者语法都是使用的yaml语法。 P…

军用电子元器件质量如何界定?

为了保证元器件的质量&#xff0c;我国制定了一系列的元器件标准。在上世纪70年代末期制定了“七专”7905技术协议和80年代初制定了“七专”8406技术协议&#xff0c;已具备了军用器件标准的雏形&#xff0c;但标准是在改革开放之前制定的&#xff0c;有很多局限性&#xff0c;…