【CVPR_2024】:逐元素乘积为什么会产生如此令人满意的结果?

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除!


文章目录


前言

自AlexNet以来,出现了无数的深度网络,一系列模型主要是基于混合线性投影(即卷积和线性层)和非线性激活的块。最近,通过逐元素乘法(element-wise multiplication)融合不同的子空间特征获得了较好的性能。论文将其称为“星型操作”,逐元素乘法在各个研究领域都表现出良好的性能和效率,包括自然语言处理(Monarch Mixer、Mamba、Hyena Hierarchy等)、计算机视觉(FocalNet、HorNet、VAN等)。

举个简单的例子:如下图,使用左图构建的网络,逐元素相加和逐元素乘积的性能差异如右图。
在这里插入图片描述

显而易见,在不同的宽度的网络中,逐元素乘积比逐元素相加的性能更好,尤其是在宽度较窄的情况下。因此,建议设计紧凑、高效网络时,推荐使用星形操作。


星形操作非常简单,为什么它会产生如此令人满意的结果?

部分解释:

FocalNet:假设星形操作可以作为调制或门控机制,动态改变输入特征。
HorNet:假设有效利用高阶特征。
VAN、Monarch Mixer:假设其有效性归因于卷积注意。

以上解释主要基于直觉和假设,缺乏全面的分析和有力的证据。

该论文则是通过明确地证明星型运算具有将输入映射到一个非常高维的非线性特征空间的能力,来解释星型运算的强代表性能力。

  • 揭示了星形运算具有将特征投射到极高维隐式特征空间的能力
  • 通过实证结果和理论探索来验证分析以及视觉表现
  • 提出StarNet,超越了许多高效的设计。
  • 该论文的分析可作为一个指导框架,引导研究人员进行的络设计。

论文

论文名: Rewrite the Stars

论文速递: 点我转跳哦

代码通道: GitHub(StarNet)

重写星形运算

主要创新网络
深度可分离卷积MobileNet
特征洗牌ShuffleNet, ShuffleNetv2
特征重用GhostNet, FasterNet
网络架构搜索EfficientNet, MnasNet
重参数MobileOne, FasterViT
混合架构Mobile-Former, EdgeViT
隐式高维StarNet

一层网络

在单层神经网络中,星形运算通常写成 ( W 1 T X + B 1 ) ∗ ( W 2 T X + B 2 ) ( W _ { 1 } ^ { T } X + B _ { 1 } ) * ( W _ { 2 } ^ { T } X + B _ { 2 } ) (W1TX+B1)(W2TX+B2),通过元素乘法实现两个线性变换特征的融合。为方便起见,将权重矩阵和偏差合并为一个实体,记为:
W = [ W B ] , X = [ X 1 ] W = \begin{bmatrix} W \\ B \end{bmatrix} , X = \begin{bmatrix} X \\ 1 \end{bmatrix} W=[WB],X=[X1]

进而,星形运算表示为: ( W 1 T X ) ∗ ( W 2 T X ) ( W _ { 1 } ^ { T } X ) * ( W _ { 2 } ^ { T } X ) (W1TX)(W2TX)

为了简化分析,将重点放在涉及单输出通道转换和单元素输入的场景上。具体定义 w 1 , w 2 , x ∈ R ( d + 1 ) × 1 w _ { 1 } , w _ { 2 },x \in R^{( d + 1 ) \times 1} w1,w2,xR(d+1)×1,其中 d d d为输入通道号。它可以很容易地扩展以适应多个输出通道 W 1 , W 2 ∈ R ( d + 1 ) × ( d ′ + 1 ) W _ { 1 } , W _ { 2 } \in R^{( d + 1 ) \times ( d ^ { \prime } + 1 )} W1,W2R(d+1)×(d+1),并处理多个特征元素,其中 X ∈ R ( d + 1 ) × n X \in R ^ { ( d + 1 ) \times n } XR(d+1)×n

一般来说,重写星号运算:

w 1 T x ∗ w 2 T x w _ { 1 } ^ { T } x \ast w _ { 2 } ^ { T } x w1Txw2Tx
= ( ∑ i = 1 d + 1 w 1 i x i ) ∗ ( ∑ j = 1 d + 1 w 2 j x j ) = ( \sum _ { i = 1 } ^ { d + 1 } w _ { 1 } ^ { i } x ^ { i } ) \ast ( \sum _ { j = 1 } ^ { d + 1 } w _ { 2 } ^ { j } x ^ { j } ) =(i=1d+1w1ixi)(j=1d+1w2jxj)
= ∑ i = 1 d + 1 ∑ j = 1 d + 1 w 1 i w 2 j x i x j = \sum _ { i = 1 } ^ { d + 1 } \sum _ { j = 1 } ^ { d + 1 } w _ { 1 } ^ { i } w _ { 2 } ^ { j } x ^ { i } x ^ { j } =i=1d+1j=1d+1w1iw2jxixj
= α ( 1 , 1 ) x 1 x 1 + ⋯ + α ( 4 , 5 ) x 4 x 5 + ⋯ + α ( d + 1 , d + 1 ) x d + 1 x d + 1 =\alpha _ { ( 1 , 1 ) } x ^ { 1 } x ^ { 1 } + \cdots + \alpha _ { ( 4 , 5 ) } x ^ { 4 } x ^ { 5 } + \cdots + \alpha _ { ( d + 1 , d + 1 ) } x ^ { d + 1 } x ^ { d + 1 } =α(1,1)x1x1++α(4,5)x4x5++α(d+1,d+1)xd+1xd+1

其中 i , j i, j i,j表示来通道索引, α α α是每个项的系数:

α ( i , j ) = { w 1 i w 2 j ,     i f   i   =   j . w 1 i w 2 j + w 1 j w 2 i ,      i f   i ! = j . } \alpha _ { ( i , j ) } = \left\{ \begin{matrix} w _ { 1 } ^ { i } w _ { 2 } ^ { j }, \: \: \: if \: i \:= \: j. \\ w _ { 1 } ^ { i } w _ { 2 } ^ { j } + w _ { 1 } ^ { j } w _ { 2 } ^ { i }, \: \: \: \:if \: i !=j. \end{matrix} \right\} α(i,j)={w1iw2j,ifi=j.w1iw2j+w1jw2i,ifi!=j.}

如上,星型操作可展开为 ( d + 2 ) ( d + 1 ) 2 \frac { ( d + 2 ) ( d + 1 ) } { 2 } 2(d+2)(d+1)个不同项目的组合,值得注意的是,除 α ( d + 1 , : ) x d + 1 x \alpha _ { ( d + 1 , : ) } x ^ { d + 1 } x α(d+1,:)xd+1x项外,每个项都与x呈非线性关系,表明它们是独立的、隐含的维度。

因此,可使用计算效率高的星形操作在 d d d维空间内执行计算,进而在一个 ( d + 2 ) ( d + 1 ) 2 ≈ ( d 2 ) 2 \frac { ( d + 2 ) ( d + 1 ) } { 2 } \approx ( \frac { d } { \sqrt { 2 } } ) ^ { 2 } 2(d+2)(d+1)(2 d)2(其中 d > > 2 d >> 2 d>>2),隐维特征空间中实现了一个等效表示,显着放大特征维度,而不会在单个层内产生任何额外的计算开销。

推广多层网络

以递归的方式将隐维指数增加到接近无限。考虑初始网络层宽度为 d d d,应用一个星形运算得到 ∑ i = 1 d + 1 ∑ j = 1 d + 1 w 1 i w 2 j x i x j \sum _ { i = 1 } ^ { d + 1 } \sum _ { j = 1 } ^ { d + 1 } w _ { 1 } ^ { i } w _ { 2 } ^ { j } x ^ { i } x ^ { j } i=1d+1j=1d+1w1iw2jxixj,这是在 R ( d 2 ) 2 1 R^{ ( \frac { d } { \sqrt { 2 } } ) ^ { 2 ^ { 1 } }} R(2 d)21的隐式特征空间中的表示。

O l O_l Ol表示第 l l l ∗ * 操作的输出,得到:
O 1 = ∑ i = 1 d + 1 ∑ j = 1 d + 1 w ( 1 , 1 ) i w ( 1 , 2 ) j x i x j       ∈ R ( d 2 ) 2 1 O _ { 1 } = \sum _ { i = 1 } ^ { d + 1 } \sum _ { j = 1 } ^ { d + 1 } w _ { ( 1 , 1 ) } ^ { i } w _ { ( 1 , 2 ) } ^ { j } x ^ { i } x ^ { j } \: \:\:\:\:\in R^{ ( \frac { d } { \sqrt { 2 } } ) ^ { 2 ^ { 1 } }} O1=i=1d+1j=1d+1w(1,1)iw(1,2)jxixjR(2 d)21
O 2 = W 2 , 1 T O 1 ∗ W 2 , 2 T O 1                ∈ R ( d 2 ) 2 2 O _ { 2 } = W _ { 2 , 1 } ^ { T } O _ { 1 } \ast W _ { 2 , 2 } ^ { T } O _ { 1 } \: \:\:\:\:\:\:\:\:\:\:\:\:\:\in R^{ ( \frac { d } { \sqrt { 2 } } ) ^ { 2 ^ { 2 } }} O2=W2,1TO1W2,2TO1R(2 d)22
O 3 = W 3 , 1 T O 2 ∗ W 3 , 2 T O 2                ∈ R ( d 2 ) 2 3 O _ { 3 } = W _ { 3 , 1 } ^ { T } O _ { 2 } \ast W _ {3 , 2 } ^ { T } O _ { 2 } \: \:\:\:\:\:\:\:\:\:\:\:\:\:\in R^{ ( \frac { d } { \sqrt { 2 } } ) ^ { 2 ^ { 3 } }} O3=W3,1TO2W3,2TO2R(2 d)23
. . . ... ...
O l = W l , 1 T O l − 1 ∗ W l , 2 T O l − 1             ∈ R ( d 2 ) 2 l O _ { l } = W _ { l , 1 } ^ { T } O _ { l-1 } \ast W _ { l , 2 } ^ { T } O _ { l-1 } \: \:\:\:\:\:\:\:\:\:\:\in R^{ ( \frac { d } { \sqrt { 2 } } ) ^ { 2 ^ { l } }} Ol=Wl,1TOl1Wl,2TOl1R(2 d)2l

意味着, l l l层网络即可隐式地获得一个属于 R ( d 2 ) 2 l R^{ ( \frac { d } { \sqrt { 2 } } ) ^ { 2 ^ { l } }} R(2 d)2l的特征空间。

如给定宽度为128的10层各向同性网络,通过星形运算获得的隐式特征维数约为 9 0 1024 90^{1024} 901024,可以合理地近似为无限维。因此,通过堆叠多层,甚至只是几层,星型运算可以以指数方式大幅放大隐含维度。

特殊情况

并非所有星型操作都遵循上述公式,其中每个分支都要进行转换。例如,VAN和SENet包含一个恒等分支,而GENet不进行任何可学习变换。

W 1 W_1 W1和/或 W 2 W_2 W2的非线性性质
  • 在实际场景中,大量的研究(如Conv2Former、FocalNet等)通过合并激活函数将变换函数 W 1 W_1 W1 W 2 W_2 W2实现为非线性。尽管如此,一个关键的方面是对通道通信的维护。重要的是,隐式维度的数量保持不变(约为 d 2 2 \frac { d ^ { 2 } } { 2 } 2d2)。
W 1 T X ∗ X W _ { 1 } ^ { T } X * X W1TXX
  • 当去掉变换 W 2 W_2 W2时,隐维数从大约 d 2 2 \frac { d ^ { 2 } } { 2 } 2d2减小到 2 d 2d 2d.
X ∗ X X * X XX
  • 星形运算将特征从特征空间 { x 1 , x 2 , ⋯   , x d } ∈ R d \left\{ x ^ { 1 } , x ^ { 2 } , \cdots , x ^ { d } \right\} \in R ^ { d } {x1,x2,,xd}Rd转换为特征为 { x 1 x 1 , x 2 x 2 , ⋯   , x d x d } ∈ R d \left\{ x ^ { 1 } x ^ { 1 } , x ^ { 2 } x ^ { 2 } , \cdots , x ^ { d } x ^ { d } \right\} \in R ^ { d } {x1x1,x2x2,,xdxd}Rd的新空间。

有几个值得注意的方面需要考虑。星型操作及其特殊情况通常与空间相互作用相结合,通常通过池化或卷积实现,如VAN所示。这些方法中有许多都强调扩大接受域的好处,但往往忽略了隐含的高维空间所带来的好处。其次,将这些特殊情况结合起来是可行的。


实验

为了证实和验证分析,从不同的角度对明星运营进行了广泛的研究。

性能优势

在这里插入图片描述
在这里插入图片描述
从表2和表3可以看出,无论网络深度和宽度如何,星型运算始终优于求和运算。这种现象验证了明星运营的有效性和优越性。此外,观察到,随着网络宽度的增加,星型运算带来的性能增益逐渐减少。然而,在不同深度的情况下没有观察到类似的现象。

这种差异提出了两个关键的见解:

  • 表2所示的星型运算带来的收益逐渐减少并不是模型尺寸扩大的结果;
  • 星型操作在本质上确实扩大网络的维度,降低了网络扩大的增量效益。

决策边界比较

在2D Noisy Moon数据集上可视化这两种操作的决策边界,该数据集由两组月球形状的2D点组成。在模型配置方面,从演示块中消除了归一化层和卷积层。考虑到该数据集相对简单的性质,将模型配置为宽度为100,深度为4。
在这里插入图片描述

图2(上行)显示了求和和星型操作划定的决策边界。很明显,星形运算比求和运算更精确、更有效地描绘了一个决策边界。值得注意的是,观察到的决策边界的差异并非源于非线性,因为两种操作都在各自的构建块中包含激活函数。主要的区别在于星形运算能够达到极高的维度。

如上所述,星型运算类似于核函数,特别是多项式核函数。为了证实这一点,还用高斯和多项式来说明支持向量机的决策边界内核(使用scikit-learn包实现),见图2(下一行)。与预期一致,星型运算产生的决策边界与多项式核的决策边界非常接近,而与高斯核有明显的偏离。

扩展到无激活函数的网络

激活函数是神经网络中必不可少的基本组成部分。然而,常用的ReLU和GELU等激活方法存在一定的缺陷,如“均值偏移”和信息丢失等。如果没有激活函数,传统的神经网络会因为缺乏非线性而崩溃为单层网络。

在本研究中,虽然主要关注的是通过星型运算获得的隐式高维特征,但非线性方面也具有深远的重要性。为了研究这一点,通过从DemoNet(第一张图)中删除所有激活来进行实验,从而创建一个无激活的网络。
在这里插入图片描述

如上表,去除所有激活后,求和操作的性能明显恶化,从66.2%降至32.4%。与之形成鲜明对比的是,星形操作仅受到消除激活的最小影响,精度仅下降1.2%。该实验不仅证实理论分析,而且为未来的研究开辟了广阔的道路。

公开讨论和更广泛的影响

虽然基于简单的操作,本文的分析为探索深度学习的基本挑战奠定了基础。下面,概述了几个有希望和有趣的研究问题,值得进一步研究,其中恒星操作可能发挥关键作用。

激活函数真的不可或缺吗?

在本文研究中,主要集中在星型运算引入的隐式高维方面。值得注意的是,星型运算还包含非线性,这是核函数区别于其他线性机器的一个特点。研究的初步实验证明了在神经网络中消除激活层的潜在可行性。

星型运算与自注意力和矩阵乘法有什么关系?

自注意利用矩阵乘法在 R n × n R ^ { n \times n } Rn×n空间中生成矩阵。可以证明,自注意中的矩阵乘法与元素乘法具有相似的属性(非线性和高维)。值得注意的是,与元素乘法相比,矩阵乘法促进了全局交互。然而,矩阵乘法改变了输入形状,需要额外的操作(例如,池化,另一轮矩阵乘法等)来调和张量形状,这是通过元素乘法避免的复杂性。本文分析可以为自注意力的有效性提供新的见解,并有助于重新审视神经网络中的“动态”特征。

如何优化隐式高维空间中的系数分布?

传统的神经网络可以为每个通道学习一组不同的权重系数,但是星形运算中每个隐含维度的系数是固定的,类似于核函数。例如,在多项式核函数 k ( x 1 , x 2 ) = ( γ x 1 ⋅ x 2 + c ) d k ( x _ { 1 } , x _ { 2 } ) = ( \gamma x _ { 1 } \cdot x _ { 2 } + c ) ^ { d } k(x1,x2)=(γx1x2+c)d中,可以通过超参数调整系数分布。

在星形运算中,虽然权重 W 1 W_1 W1 W 2 W_2 W2是可学习的,但它们只提供了有限的范围来微调分布,而不像传统神经网络那样允许为每个通道定制系数。这个约束可以解释为什么极高的维度只能带来适度的性能改进。值得注意的是,跳跃连接似乎有助于平滑系数分布,密集连接(如DenseNet)可能提供额外的好处。此外,采用指数函数可以直接映射到隐式无限维,类似于高斯核函数。

StarNet

鉴于星型运算的独特优势——它能够在低维空间中进行计算,同时产生高维特征——确定了它在高效网络架构领域的实用性。因此,本文引入StarNet作为概念验证模型。StarNet的特点是极简的设计和显著减少人为干预。尽管它很简单,但StarNet展示了卓越的性能,强调了星型操作的有效性。

StarNet的结构为4阶段分层架构,利用卷积层进行下采样,并利用改进的演示块进行特征提取。为了满足效率的要求,用批归一化代替层归一化,并将其置于深度卷积之后(可以在推理过程中融合)。从MobileNeXt中汲取灵感,在每个块的末尾合并深度卷积。通道扩展因子始终设置为4,网络宽度在每个阶段加倍。演示块中的GELU激活被ReLU6取代,遵循MobileNetv2设计。StarNet框架如下图,仅通过改变块号和输入嵌入通道号来构建不同大小的StarNet。
在这里插入图片描述

虽然许多先进的设计技术(如重新参数化、与注意力集成、SE-block等)可以在经验上提高性能。通过刻意避开这些复杂的设计元素并尽量减少人为设计干预,强调星型操作在StarNet概念化和功能中的关键作用。

实验

实验设置

  • 优化器:AdamW
  • batch size: 2048
  • 学习率:3e−3
  • epoch:300

实验结果

在这里插入图片描述
实验结果见上表。与许多其他最先进的高效模型相比,StarNet具有最小的手工设计,能够提供有希望的性能。值得注意的是,StarNet在iPhone 13设备上的准确率仅为0.7秒,达到了73.5%的第一名,超过了mobileone - 50 2.1% (73.5% vs 71.4%),在相同的延迟。当将模型缩放到1G FLOPs预算时,StarNet继续表现出卓越的性能,比MobileOne-S2高出1.0%,比EdgeViT-XS高出0.9%,同时速度提高了三倍(1.0 ms vs 3.5 ms)。
在这里插入图片描述

StarNet的简洁设计,主要归功于星型操作的基本作用。图4进一步说明了各种模型之间的延迟-精度权衡。能否进一步推动StarNet的性能再上一个台阶? 通过仔细的超参数优化,利用表1的见解,并应用训练增强,如更多的时代或蒸馏,可以对StarNet的性能进行实质性的改进。


消融实验

星型操作被认为是模型高性能的唯一贡献者。为了从经验上验证这个断言,在实现中系统地用求和取代了星号运算。具体来说,这需要用模型架构中的“+”替换“*”操作符。
在这里插入图片描述
结果如上表所示。取消所有星型作业导致性能显著下降,精度下降3.1%。有趣的是,在模型的第一和第二阶段,星型操作对性能的影响似乎很小。这种观察是合乎逻辑的。在非常窄的宽度下,ReLU6激活会导致一些特征变为零。在星形运算的背景下,这导致其隐含的高维空间中的许多维度也变为零,从而限制了其全部潜力。然而,它的贡献在最后两个阶段(更多的渠道)变得更加明显,分别导致1.6%和1.6%的改进。
在这里插入图片描述
星型操作的延迟影响,如上表。从理论上讲,与简单的求和运算相比,乘法运算被认为具有更高的计算复杂度,正如几篇相关著作所指出的那样。然而,实际的延迟结果可能并不总是与理论预测一致。本文进行了基准测试,比较了用求和替换所有星型操作的延迟。从表中,观察到延迟影响取决于硬件。在实践中,星型操作并不会导致GPU和iPhone设备上相对于求和操作的任何额外延迟。然而,在CPU上,求和运算比星型运算效率略高(例如,StarNet-S4的求和运算为8.4ms,星型运算为9.4 ms)。考虑到相当大的性能差距,CPU上的这个小延迟开销可以忽略不计。
在这里插入图片描述

激活函数放置的研究。对网络块中激活函数(ReLU6)的位置进行了全面的分析。为清晰起见,用x1和x2表示两个分支的输出,以StarNet-S4作为示范模型。研究了在StarNet中实现激活功能的四种方法:1)不使用激活,2)激活两个分支,3)激活后星型操作,以及4)激活单个分支。表明只激活一个分支产生最高的准确率,达到78.4%。令人鼓舞的是,完全去除来自StarNet的激活(除了在茎层中的激活)导致准确率仅降低2.8%,使其降至75.6%,这一性能仍然与表6中一些强大的基线具有竞争力。强调了无激活网络的潜力。

在这里插入图片描述
在这里插入图片描述

星形操作块的设计研究。在StarNet中,星形运算通常被实现为 a c t ( W 1 T X ) ∗ ( W 2 T X ) a c t ( W _ { 1 } ^ { T } X ) * ( W _ { 2 } ^ { T } X ) act(W1TX)(W2TX),使StarNet-S4的准确率达到84.4%。然而,替代实现是可能的。本文尝试了一个变化: ( W 2 T a c t ( W 1 T X ) ) ∗ X ( W _ { 2 } ^ { T } a c t ( W _ { 1 } ^ { T } X ) ) * X (W2Tact(W1TX))X,其中 W 1 ∈ R d × d ′ W _ { 1 } \in R ^ { d \times d ^ { \prime } } W1Rd×d被设计为扩展宽度,而 W 2 ∈ R d ′ × d W _ { 2 } \in R ^ { d ^ { \prime } \times d } W2Rd×d将其恢复为 d d d。这种调整导致仅转换一个分支,而另一个分支保持不变。改变 d ′ d' d以确保与StarNet-S4相同的计算复杂度。因此,性能从78.4%下降到74.4%。虽然更好和更仔细的设计可能会减轻这种性能差距,但准确性的显着差异强调了在利用星型操作能力方面的初始实施的有效性,并强调了在星型操作中转换两个分支的关键重要性。


总结

总结: 对星形操作进行了重新语境化,发现它们强大的表征能力来源于隐含的高维空间。在许多方面,星号运算反映了多项式核函数的行为。在此基础上,将star操作定位于高效网络设计领域,并推出了简单的原型网络StarNet。StarNet令人印象深刻的表现,在没有依赖复杂的设计或精心选择的超参数的情况下取得的,证明了星型操作的有效性。


致谢

欲尽善本文,因所视短浅,怎奈所书皆是瞽言蒭议。行文至此,诚向予助与余者致以谢意。


参考

[1]. Ma, Xu, **yang Dai, Yue Bai, Yizhou Wang, and Yun Fu. “Rewrite the Stars.” arxiv preprint arxiv:2403.19967 (2024).
[2]. Markdown常见语法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-3.12.0文档解读-内置函数sorted()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 Python-3.12.0文档解读详细说明 功能描述 参数说明 用法示例 备注 进阶用法 参考…

集合操作进阶:关于移除列表元素的那点事

介绍 日常开发中,难免会对集合中的元素进行移除操作,如果对这方面不熟悉的话,就可能遇到 ConcurrentModificationException,那么,如何优雅地进行元素删除?以及其它方式为什么不行? 数据初始化…

力扣--双指针15.三数之和

详细思路 排序数组:首先对数组 nums 进行排序,目的是为了方便后续使用双指针查找和避免重复结果。遍历数组:使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素:如果当前元素 nums[i] 与前一个元素…

使用matplotlib绘制折线条形复合图

使用matplotlib绘制折线条形复合图 介绍效果代码 介绍 在数据可视化中,复合图形是一种非常有用的工具,可以同时显示多种数据类型的关系。在本篇博客中,我们将探讨如何使用 matplotlib 库来绘制包含折线图和条形图的复合图。 效果 代码 imp…

登录安全分析报告:小米官网注册

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

【算法】模拟算法——数青蛙(medium)

题解:模拟算法——数青蛙(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接:LINK 2.题解 用循环进行遍历, 如果该字符为o\o\a\k 找一下前驱字符是否存在 如果存在,前驱字符–,该字符如果不存在&#x…

STM32_IIC

1、IIC简介 I2C,即Inter IC Bus。是由Philips公司开发的一种串行通用数据总线,主要用于近距离、低速的芯片之间的通信;有两根通信线:SCL(Serial Clock)用于通信双方时钟的同步、SDA(Serial Data…

echarts渐变色与css渐变色互转(两个坐标点转角度)

前言 用于 echarts 的小伙伴都知道,他使用的渐变色写法和 css 的写法不一样。css 中直接使用角度定义渐变的方向,而 echarts 使用的是两个坐标点来进行标识方向(线性渐变)。 本文主要针对线性渐变的转换 那怎么在 css 中使用 e…

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型 返回论文目录 项目地址 模型地址 作者:华东师范大学,计算机科学与技术学院,智能教育研究院的小怪兽会微笑。 介绍 BrainGPT1是一个工具调用多轮对话模型,与G…

[机器学习]GPT LoRA 大模型微调,生成猫耳娘

往期热门专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、VueJava微服务实战Java 微服务实战,Spring Cloud Netflix套件、Spring Cloud Alibaba套件、Seata、gateway、shadingjdbc…

BU01板卡引脚

概述 BU01 是一款高速采集卡,主要用于高带宽数据采集及传输,应用领域多为数据中 心及数据采集领域。 端口提供60Gbps 传输带宽,可兼容2 个SFP万兆网口,和1 个40GE QSFP 光 口。和主机通信采用的是PCIE 2.0 x8 模式,最…

C++哈希的应用:位图 布隆过滤器 哈希切割

目录 位图 bitset 构造空间 将某个位变为0 将某个位变为1 检查是否存在 完整代码 拓展问题一 ​编辑 拓展问题二 布隆过滤器 判断是否存在 使用场景 哈希切割 拓展问题一 拓展问题二 位图 问题:有四十个亿未排序的不重复的无符号整数,此…

算法导论 总结索引 | 第三部分 第十四章:数据结构的扩张

1、通过存储 额外信息的方法来扩张一 种标准的数据结构,然后对这种数据结构,编写新的操作来支持所需的应用。因为添加的信息 必须要能被该数据结构上的常规操作更新和维护 2、通过扩张红黑树构造出的两种数据结构:14.1介绍 一种支持一般动态…

对boot项目拆分成cloud项目的笔记

引言:这里我用的是新版本的技术栈 spring-boot-starter-parent >3.2.5 mybatis-spring-boot-starter >3.0.3 mybatis-plus-boot-starter >3.5.5 spring-cloud-dependencies …

给Docker一个辈分(备份),免得无后...

定期备份所有 Docker 镜像 Linux 脚本 创建一个名为 backup_all_docker_images.sh 的脚本文件,内容如下: #!/bin/bash# 定义变量 BACKUP_DIR"/backup/docker" TIMESTAMP$(date "%Y%m%d%H%M") BACKUP_FILE"${BACKUP_DIR}/doc…

vx小程序初学

小程序初学 在我还没接触到微信小程序之前,通常使用轮播要么手写或使用swiper插件去实现,当我接触到微信小程序之后,我看到了微信小程序的强大之处,让我为大家介绍一下吧! swiper与swiper-item一起使用可以做轮播图 …

Facebook开户 | Facebook二不限户

Facebook二不限户的正确使用方法 Facebook 二不限是指 Facebook 国内二不限户,是通过代理开出来的一种特殊账户,️需要广告主准备主页。 其特点是:限主页、不限域名、额度没解限,解限后则不限额度。 相比于三不限户,…

Keras 3.0强势回归,助力深度学习

大家好,Keras的简洁代码风格一直受到开发者的青睐,自从Keras宣布支持Pytorch和Jax后,开发者们迎来了新的选择。 本文将介绍Keras 3.0的实用技巧,以一个典型的编码器-解码器循环神经网络为例,展示如何利用子类化API构建…

【Ubuntu】100 系统字体安装和更改

系统:Ubuntu18.04LTS 1 Why we need? 写这篇经验贴的原因: ①我需要装一下中文字体(Qt要用); ②想调一下字体大小和默认中文字体的样式 2 装第三方字体 Step1:安装软件Font Manager sudo ap…

AI数据分析:用kimi生成一个正弦波数学动画

正弦波公式: ƒ(x) a * sin(x x0) b 公式中: a: 决定正弦函数振动幅度的大小; x0:表示x开始比0拖后的弧度值; b:表示函数偏离X轴的距离; 对于难以理解的学生来说,可以用动画把这个公式直观的展现出…