说话人识别中的损失函数

news2024/11/20 18:44:27

损失函数

  • 损失函数 L ( y i , y ^ i ) L(y_i,\hat{y}_i) L(yi,y^i)用来描述神经网络的输出 y ^ i \hat{y}_i y^i和基本事实(Ground Truth,GT) y i y_i yi的差异
  • 对于回归问题,常用均方误差(Mean Square Error,MSE)损失函数
    L ( y i , y ^ i ) = ∥ y i − y ^ i ∥ 2 2 L(y_i,\hat{y}_i)=\left \| y_i-\hat{y}_i \right \|_2^2 L(yi,y^i)=yiy^i22
  • 神经网络的训练过程就是寻找一组参数 θ \theta θ,使得神经网络在一个batch的训练上,损失函数的和最小
    θ = arg ⁡ min ⁡ θ ∑ i = 1 N L ( y i , y ^ i ) \theta=\arg\min_{\theta}\sum_{i=1}^{N}L(y_i,\hat{y}_i) θ=argθmini=1NL(yi,y^i)
  • 对于说话人识别,通常有两种类型的损失函数
    • 将说话人识别看作一个多说话人分类问题,即模拟说话人辨认问题
    • 将说话人识别看作一个二值决策问题,即模拟说话人验证问题

多说话人分类

  • 在该问题中,假设不同的说话人属于不同的类
  • 训练时
    • 每个说话人都有一个全局唯一标签
    • 每个话语(Utterance)都有一个说话人标签
  • 运行时
    • 需要识别在训练集中未出现过的说话人,因此无法使用训练数据的标签作为输出
  • 得到嵌入码之后,需要经过一个MLP(该MLP的激活函数是Softmax),得到该嵌入码属于训练数据中哪一个说话人的概率分布
    在这里插入图片描述

Cross Entropy Loss

  • 得到概率分布后,使用交叉熵(Cross Entropy,CE)损失函数,计算预测的概率分布,与真实的概率分布之间的差距,假设概率分布的向量维度为K
    H ( p , q ) = − ∑ i = 1 K p i ⋅ ln ⁡ q i H(p,q)=-\sum_{i=1}^{K}p_i\cdot\ln q_i H(p,q)=i=1Kpilnqi
    其中,
    • p p p是真实的概率分布,采用独热向量(One-hot Vector),即只有真实说话人对应的值为1,其他的值都为0
    • q q q是预测的概率分布,经过Softmax激活函数之后,最大值接近1,所有值求和等于1
    • 由于 p p p为独热向量,所以损失函数简化为 H ( p , q ) = − ln ⁡ q j H(p,q)=-\ln q_j H(p,q)=lnqj q j q_j qj指预测的概率分布中,真实说话人对应的概率
    • H ( p , q ) H(p,q) H(p,q)的值越小,代表两个分布越接近
  • 训练时:在训练数据上,最小化 H ( p , q ) H(p,q) H(p,q)来优化参数
  • 运行时:直接使用嵌入码,用于说话人识别(可用余弦相似度、欧氏距离等)
  • 这种方法的缺点
    • 用于计算概率分布的MLP,其参数会随着训练数据说话人数量线性增加
    • 例如嵌入码的维度是1280,训练数据有1000人,那么MLP的参数矩阵 W S o f t m a x ∈ R 1000 × 1280 W_{Softmax} \in R^{1000 \times 1280} WSoftmaxR1000×1280,光是MLP的参数量就达到了128万
    • 训练集中,部分说话人的数据量较少,这意味着 W S o f t m a x W_{Softmax} WSoftmax中,有部分参数极少发挥作用,但是前向传播时每次都需要计算整个矩阵,这导致训练过程中,花费了大量的资源用于优化几乎没有用的参数
    • W S o f t m a x W_{Softmax} WSoftmax只在训练时发挥作用,与运行时的相似度计算不完全一致,这会导致网络难以泛化到训练集中未出现过的说话人

Angular Softmax

  • 为了改善训练和运行时,目标不匹配的问题,Softmax有一个变种,叫做Angular Softmax,思路如下:
    1. W S o f t m a x W_{Softmax} WSoftmax中的每个行向量 w r w_r wr都限制为单位长度的向量,设嵌入码为 e e e,那么 w r ⋅ e = ∣ ∣ e ∣ ∣ cos ⁡ θ i w_r \cdot e=||e|| \cos \theta_i wre=∣∣e∣∣cosθi
    2. W S o f t m a x ⋅ e W_{Softmax} \cdot e WSoftmaxe的运算结果,就是 e e e的范数,乘以一个余弦值,此时的优化过程,会与运行时的相似度计算更加一致
  • 注意,关于Softmax的计算,如果幂的值很大,取指数会导致溢出(即便是Python也要考虑这个问题),此时需要令输入向量中的每一个值,都减去向量中的最大值,然后再进行标准的Softmax运算,这不影响运算结果,但是保证了数值计算的稳定,原因如下
    y i = e x p ( x i − x m a x ) ∑ j = i K e x p ( x j − x m a x ) = e x p ( x i ) / e x p ( x m a x ) ∑ j = i K [ e x p ( x j ) / e x p ( x m a x ) ] = e x p ( x i ) ∑ j = i K e x p ( x j ) \begin{aligned} y_i&=\frac{exp(x_i-x_{max})}{\sum_{j=i}^{K}exp(x_j-x_{max})} \\ &=\frac{exp(x_i)/exp(x_{max})}{\sum_{j=i}^{K}[exp(x_j)/exp(x_{max})]} \\ &=\frac{exp(x_i)}{\sum_{j=i}^{K}exp(x_j)} \\ \end{aligned} yi=j=iKexp(xjxmax)exp(xixmax)=j=iK[exp(xj)/exp(xmax)]exp(xi)/exp(xmax)=j=iKexp(xj)exp(xi)

二值决策

  • 针对多说话人分类方法,训练和运行时,目标不匹配的问题,研究人员提出二值决策方法
  • 给定两个话语,网络对这两个话语进行二值决策:
    • 0,表示两个话语来自不同的说话人
    • 1,表示两个话语来自同一个说话人
  • 损失函数必须基于,由至少两个话语组成的样本,来定义

Pairwise Loss

  • 假设有两个输入 x i x_i xi x j x_j xj,它们都进入同一个网络,得到两个嵌入码,两个嵌入码的余弦相似度是 s i j s_{ij} sij,假设GT表示为:
    y i j = { 0 , 若 x i 和 x j 来自不同的说话人 1 , 若 x i 和 x j 来自同一个说话人 y_{ij}= \left\{\begin{matrix} 0,若x_i和x_j来自不同的说话人\\ 1,若x_i和x_j来自同一个说话人 \end{matrix}\right. yij={0,xixj来自不同的说话人1,xixj来自同一个说话人
  • 对应的损失函数为 L ( s i j , y i j ) L(s_{ij},y_{ij}) L(sij,yij)
  • 可以将这个问题视为二分类问题,使用二元交叉熵(Binary Cross Entropy,BCE)损失函数
    L B C E ( s , y ) = − y ln ⁡ s − ( 1 − y ) ln ⁡ ( 1 − s ) L_{BCE}(s,y)=-y\ln s- (1-y)\ln (1-s) LBCE(s,y)=ylns(1y)ln(1s)
  • 由于要对余弦相似度取对数,而余弦相似度可能为负数,所需需要将 s s s变换为正数,常见做法:
    s ′ = σ ( w s + b ) = 1 1 + e x p ( − ( w s + b ) ) s'=\sigma (ws+b)=\frac{1}{1+exp(-(ws+b))} s=σ(ws+b)=1+exp((ws+b))1
    其中, w w w b b b都是可学习参数, w > 0 w>0 w>0 σ ( ⋅ ) \sigma(\cdot) σ()是Sigmoid函数。从而,损失函数变为 L B C E ( s ′ , y ) L_{BCE}(s',y) LBCE(s,y),这就是基于样本对的损失函数Pairwise Loss
  • 缺点:由于网络参数随训练过程变化,所以难以平衡正样本和负样本在训练过程中的数量平衡

Triplet Loss

  • 针对Pairwise Loss的缺点,研究人员提出了基于三元组的损失函数Triplet Loss
  • 先思考:在设计损失函数时,我们希望给网络的监督信息的效果是什么?
    • 对于同一个说话人的嵌入码,我们希望这两个嵌入码在嵌入码空间中越接近越好
    • 对于不同的说话人的嵌入码,我们希望这两个嵌入码在嵌入码空间中越远离越好
  • 针对上述思考,Triplet Loss需要挑选三个话语:
    1. 锚样本(Anchor) x a x^a xa
    2. 正样本(Positive) x p x^p xp,和锚样本来自同一个说话人
    3. 负样本(Negative) x n x^n xn,和锚样本来自不同的说话人
  • 那么,这三个话语的嵌入码,经过参数更新后效果如下图所示:
    在这里插入图片描述
  • 数学形式
    L = [ ∥ f ( x a ) − f ( x p ) ∥ 2 2 − ∥ f ( x a ) − f ( x n ) ∥ 2 2 + α ] + L=[\left \| f(x^a)-f(x^p) \right \|_2^2-\left \| f(x^a)-f(x^n) \right \|_2^2 +\alpha]_+ L=[f(xa)f(xp)22f(xa)f(xn)22+α]+
    其中,
    • f ( x ) f(x) f(x)表示 x x x的嵌入码
    • α ≥ 0 \alpha \ge 0 α0,是预先定义的超参数,表示正样本,相对于负样本,更靠近锚样本的距离
    • [ x ] + [x]_+ [x]+表示函数 m a x ( x , 0 ) max(x,0) max(x,0)
    • ∥ ∥ 2 2 \left \| \right \|_2^2 22表示欧氏距离的平方
  • 上述形式的Triplet Loss常用于人脸识别,对于说话人识别,会将欧氏距离改为余弦相似度:
    L = [ cos ⁡ ( f ( x a ) , f ( x n ) ) − cos ⁡ ( f ( x a ) , f ( x p ) ) + α ] + L=[\cos (f(x^a),f(x^n)) - \cos (f(x^a),f(x^p)) +\alpha]_+ L=[cos(f(xa),f(xn))cos(f(xa),f(xp))+α]+
    在这里插入图片描述
  • 注意,由于欧氏距离是越小越靠近,而余弦相似度是越大越靠近,所以对比上一个式子,正样本对之间的距离,和负样本对之间的距离,要交换位置
  • 关键点
    • 正样本对和负样本对的选择,对于训练的效率非常关键
    • 需要挖掘困难样本,至少使 [ x ] + [x]_+ [x]+是正数,否则不会有梯度信息
    • 由于网络参数随训练过程变化,所以难以提前找到困难样本
    • 困难样本挖掘的办法:
      • 离线挖掘:每训练一定的步数,根据当前的网络参数,计算训练集的嵌入码,根据此时的嵌入码选取困难样本
      • 在线挖掘:对每个batch,计算里面每个样本的嵌入码,构造一个最困难的样本

端到端的说话人识别系统

  • 对于端到端的定义,业界尚无明确定论,一般而言:
    • 第一个“端”,是指系统的输入,如音频数据
    • 第一个“端”,是指系统的输出,如预测结果
  • 端到端系统应满足下列条件:
    • 除了神经网络外,不再使用任何其他模型,不能有GMM、因子分析、PLDA等
    • 采用单一的一个神经网络进行推理
    • 采用一个损失函数进行参数优化
  • 端到端的损失函数,能够在训练时,完全模拟运行时的情况。说话人识别在运行时的特点:
    • 注册阶段,有多个注册话语,需要对这些话语提取嵌入码,然后聚合
    • 识别阶段,话语可能来自真实说话人或仿冒说话人,需要给出二值决策

端到端的损失函数

  • 在训练时,使用 N + 1 N+1 N+1个话语
    • 其中 N N N个话语来自真实说话人
    • 另外一个话语来自真实说话人或仿冒说话人
  • N + 1 N+1 N+1个话语,经过同一个神经网络,其中来自真实说话人的 N N N个话语的嵌入码,被聚合(通常是取平均),成为说话人模型
  • 另外一个嵌入码,与说话人模型计算余弦相似度
  • 余弦相似度经过变换成为正数,然后计算二元交叉熵损失
    s ′ = σ ( w s + b ) = 1 1 + e x p ( − ( w s + b ) ) L B C E ( s ′ , y ) = − y ln ⁡ s ′ − ( 1 − y ) ln ⁡ ( 1 − s ′ ) \begin{aligned} s'&=\sigma (ws+b)=\frac{1}{1+exp(-(ws+b))} \\ L_{BCE}(s',y)&=-y\ln s'- (1-y)\ln (1-s') \end{aligned} sLBCE(s,y)=σ(ws+b)=1+exp((ws+b))1=ylns(1y)ln(1s)
    在这里插入图片描述
  • 最后的损失函数计算过程,非常类似Pairwise Loss,只不过端到端系统的输入是 N + 1 N+1 N+1个话语,而不是两个话语
  • x-vector系统采用的是类似上述的端到端损失函数,不过将余弦相似度,替换成了另一种相似性度量:
    L ( e 1 , e 2 ) = e 1 T e 2 − e 1 T S e 1 − e 2 T S e 2 + b L(e_1,e_2)=e_1^Te_2-e_1^TSe_1-e_2^TSe_2+b L(e1,e2)=e1Te2e1TSe1e2TSe2+b
    其中,
    • 矩阵 S S S和标量 b b b都是可学习参数
    • 这是基于PLDA所衍生出来的一种相似性度量
  • 关键点
    • 关于 N N N的选定,可以按照运行时的情况来决定,如果不确定运行时会有几个注册话语,则取平均值或者中间值
    • 如何平衡正负样本比例?这是常见的问题,通常负样本数远远多于正样本数,常见的做法是:在负样本的损失函数上,乘以一个常数 K , 0 < K < 1 K,0<K<1 K0<K<1

广义端到端损失函数(Generalized End-to-End Loss,GE2E)

  • 基本思想
    • 通过减少一个batch中的重复计算,使训练更加高效
    • 对于一个batch中的所有负样本而言,只关注最困难的那个样本,利用最大间隔原理(梦回SVM)
  • 接下来将视角放在一个batch的数据中:
    在这里插入图片描述
  • 上图中,每个圆圈是一个话语的嵌入码,不同的颜色表示该话语来自不同的说话人。可见上图中有三个说话人,每个说话人对应四个嵌入码
  • 用正三角形表示每个说话人的嵌入码的中心点(也叫质心,论文中叫Centroid)
  • 将嵌入码记为 e j i e_{ji} eji j j j表示说话人, i i i表示属于第 j j j个说话人的第 i i i个话语;某个说话人的嵌入码中心记为 c j c_j cj
  • 基本思想,具体而言:
    • 对于每一个 e j i e_{ji} eji而言,我们希望它与 c j c_j cj靠近,与其他的 c k 、 c k ′ c_k、c_{k'} ckck远离
    • 在一个batch内,对于一个 e j i e_{ji} eji而言,会出现多个其他说话人的中心点,如 c k 、 c k ′ c_k、c_{k'} ckck
    • 根据最大间隔原理,只关注距离该 e j i e_{ji} eji最接近的其他说话人的中心,从图中来看,则是只关注 c k c_k ck,不关注 c k ′ c_{k'} ck
    • 对神经网络而言, c k c_k ck是区分 e j i e_{ji} eji属于 c j c_j cj,最困难的一个其他说话人。也就是说,对于 e j i e_{ji} eji而言, c k c_k ck是支持说话人(Support Speaker)
  • 计算损失函数前的准备工作
    • 假设,一个batch的维度为 N × M N \times M N×M N N N表示该batch包含的说话人个数, M M M表示该batch中每个说话人的话语数
    • 该batch的数据,经过神经网络后,每个话语都向量化,得到嵌入码 e j i e_{ji} eji,从而:
      c j = 1 M ∑ i = 1 M e j i c_j=\frac{1}{M}\sum_{i=1}^{M}e_{ji} cj=M1i=1Meji
    • 对整个batch,计算相似度矩阵,维度为 N M × N NM \times N NM×N
      S j i , k = w ⋅ cos ⁡ ( e j i , c k ) + b S_{ji,k}=w\cdot \cos (e_{ji},c_k)+b Sji,k=wcos(eji,ck)+b
      其中,
      • w > 0 , w 、 b w>0,w、b w>0wb都是可学习参数
      • 相似度矩阵,表示batch中的每一个嵌入码 e j i e_{ji} eji,与batch内所有说话人的中心点 c k c_k ck,计算相似度,然后进行线性变换,因此维度是 N M × N NM \times N NM×N
  • 损失函数的定义:有两种方法实现最大间隔原理
  1. 基于对比的方法:对于每一个 e j i e_{ji} eji而言,损失函数为
    L ( e j i ) = 1 − σ ( S j i , j ) + max ⁡ 1 ≤ k ≤ N , k ≠ j σ ( S j i , k ) L(e_{ji})=1-\sigma(S_{ji,j})+\max_{1\le k \le N,k \ne j} \sigma(S_{ji,k}) L(eji)=1σ(Sji,j)+1kN,k=jmaxσ(Sji,k)
    其中,
    • 1 − σ ( S j i , j ) 1-\sigma(S_{ji,j}) 1σ(Sji,j)表示正样本对的余弦相似度越接近1越好
    • max ⁡ 1 ≤ k ≤ N , k ≠ j σ ( S j i , k ) \max_{1\le k \le N,k \ne j} \sigma(S_{ji,k}) max1kN,k=jσ(Sji,k)表示最困难负样本对的余弦相似度越小越好
    • 这种同时考虑正样本对和负样本对的思想,与Triplet Loss类似,不同之处在于:
      • 使用中心点,模拟运行时的说话人嵌入码
      • 负样本对的优化,只针对支持说话人
    • 缺点:使用了 max ⁡ ( ⋅ ) \max(\cdot) max(),这是不可导的函数
  2. 基于Softmax的方法,针对方法1的缺点,采用 max ⁡ ( ⋅ ) \max(\cdot) max()的可微分版本——Softmax来改进
    L ( e j i ) = − S j i , j + ln ⁡ ∑ k = 1 N exp ⁡ ( S j i , k ) = − ln ⁡ ( exp ⁡ ( S j i , j ) ) + ln ⁡ ∑ k = 1 N exp ⁡ ( S j i , k ) = ln ⁡ ∑ k = 1 N exp ⁡ ( S j i , k ) exp ⁡ ( S j i , j ) = − ln ⁡ exp ⁡ ( S j i , j ) ∑ k = 1 N exp ⁡ ( S j i , k ) \begin{aligned} L(e_{ji})&=-S_{ji,j}+\ln \sum_{k=1}^{N} \exp(S_{ji,k}) \\ &=-\ln(\exp(S_{ji,j}))+\ln \sum_{k=1}^{N} \exp(S_{ji,k}) \\ &=\ln \frac{\sum_{k=1}^{N} \exp(S_{ji,k})}{\exp(S_{ji,j})} \\ &=- \ln \frac{\exp(S_{ji,j})}{\sum_{k=1}^{N} \exp(S_{ji,k})} \end{aligned} L(eji)=Sji,j+lnk=1Nexp(Sji,k)=ln(exp(Sji,j))+lnk=1Nexp(Sji,k)=lnexp(Sji,j)k=1Nexp(Sji,k)=lnk=1Nexp(Sji,k)exp(Sji,j)
    这个损失函数,将每个嵌入码推到其对应说话人中心点附近,并将其拉离所有其他说话人中心点
  • 关键点
    • 神经网络在优化时,会收敛到一个平凡解(Trivial Solutions),类似于微分方程的特解,会导致所有嵌入码都变成相同的值
    • 为了避免平凡解,一个重要的技巧是:在计算 e j i e_{ji} eji的损失函数时,对于 c j c_j cj的计算,不要将 e j i e_{ji} eji本身加进去,新的 c j c_j cj表达式如下,式中的 ( − i ) (-i) (i)表示排除 i i i
      c j ( − i ) = 1 M − 1 ∑ m = 1 , m ≠ i M e j m c_j^{(-i)}=\frac{1}{M-1}\sum_{m=1,m \ne i}^{M}e_{jm} cj(i)=M11m=1,m=iMejm
  • 步骤总结
    • 对每一个batch,经过神经网络,得到嵌入码
    • 计算batch内每个说话人的中心点
    • 计算相似度矩阵
    • 根据相似度矩阵,计算每个嵌入码的损失函数,对batch内所有嵌入码的损失函数求和,得到一个batch的总损失
      在这里插入图片描述
  • 优点
    • 动态地挖掘困难样本,每次参数优化都有足够的监督信息
    • 训练时,神经网络前向推理次数,等于样本数,而不是排列组合数,比其他基于二值决策的损失函数更加高效

其他广义端到端损失函数

  • Dynamic-additive-margin Softmax(DAM-Softmax)
  • Angular Margin Centroid Loss(AMCL)

总结

损失函数多说话人交叉熵Pairwise LossTriplet LossEnd-to-End LossGeneralized End-to-End Loss
输入单个话语两个话语三个话语 N + 1 N+1 N+1个话语 N × M N \times M N×M个话语
中心点使用使用一个说话人的中心点使用一个batch中所有说话人的中心点
实现方式SoftmaxBCE对比BCE对比或Softmax

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

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

相关文章

IB成绩该如何换算GPA?

今天就简单介绍下IB课程分数与GPA以及英国的UCAS Tariff points的分数换算&#xff01; 网传的换算方法是这样的&#xff1a; 以IB单科满分是7分为前提&#xff0c;那么把IB成绩换算成四分制的GPA的方式是&#xff1a;将IB课程分数除以7再乘以4。 举个例子&#xff0c;你某门科…

【有营养的算法笔记】从推导证明的角度深剖前缀和与差分算法

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;有营养的算法笔记 文章目录一、一维前缀和1、算法推导2、代码实现二、二维前缀和1、算法推导2、代码实现三…

数据库范式

1 数据库范式 完全函数依赖 &#xff08;Sno,Cno) —> Grade 是完全函数依赖&#xff0c;学号不能得出成绩&#xff0c;学科号也不能推出成绩。 部分函数依赖 &#xff08;Sno,Cno) --> Sdept 是部分函数依赖&#xff0c;学号能推出院系。 传递依赖 Sno --> Sdep…

肝了十天半月,献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图

01 纯手绘Spring思维脑图 纯手绘Spring思维脑图 1.1 基本概念 纯手绘Spring思维脑图-基本概念 事先申明&#xff1a;Spring/Cloud/Boot/MVC的手绘思维脑图以及详细部分解读&#xff0c;这边都是以截图的形式展示出来&#xff0c;如果需要完整的全部原件xmin思维脑图https://gi…

Shell ❀ 三剑客 - Grep + Sed + Awk

文章目录八、三剑客 - Grep Sed Awk1、Grep - 过滤1.1 常用grep参数1.2 使用方法2、Sed - 行匹配2.1 执行原理2.2 常见语法2.3 使用方法2.3.1 地址边界的设定2.3.2 基础编辑命令2.3.3 扩展操作2.3.4 命令执行案例3、Awk - 列匹配3.1 awk能做什么3.2 执行原理3.3 命令的使用3.…

生物素化聚N-异丙基丙烯酰胺,Biotin-PNIPAM

产品名称&#xff1a;生物素化聚N-异丙基丙烯酰胺 英文名称&#xff1a;Biotin-PNIPAM 聚(N-异丙基丙烯酰胺)是一种有机物&#xff0c;化学式为(C6H11NO)n&#xff0c;由单体N-异丙基丙烯酰胺(NIPAM)聚合而成 &#xff0c;主要用于药物控释、生化分离以及化学传感器等。 物…

C语言--操作符

文章目录一、数据的存储二、算术操作符三、移位操作符左移位操作符<<右移操作符四、位操作符五、赋值操作符六、单目操作符sizeof前后置七、关系操作符一、数据的存储 如果想要准确的掌握每个操作符的作用&#xff0c;那么首先需要理解数据在计算机中的存储和运算规则。…

解决智能化的最后「一公里」:深度解读小匠物联产测系统

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn测试是智能家电等产品走向交付的最后一个环节。与普通产品相比&#xff0c;智能化产品由于功能多元&#xff0c;涉及模组通信和编程&#xff0c;其可能存在问题的点位也多了起来。而作为专业的AIoT智能化解决方案服务商&#…

三、Flex布局简介

目录 一、Flex布局简介 什么是flex布局&#xff1f; flex属性 二、视图层 View WXML 三、会议OA项目-首页 一、Flex布局简介 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性 什么是flex布局&#xff1f; 1) Flex是…

电脑Tab键有什么功能?分享Tab键的6个妙用

Tab键tabulator key 的缩写&#xff0c;意思是跳格键。基本用法是可以用来绘制无边框的表格&#xff0c;还可以在单词间留下间隔&#xff0c;一般等于八个空格的长度。但是您知道电脑Tab键有什么功能吗&#xff1f;以下一些关于Tab键的使用和功能的介绍&#xff0c;希望这些可以…

Kibana:圣诞老人使用 Kibana Dashboards 驾驶他的雪橇!

又到了每年一度的圣诞节了。圣诞老人今年开始向各个国家发放礼物了。他驾驶着自己的雪橇挨个国家发放礼物了。我们收集了去世界过个国家的首都的地理位置信息&#xff0c;并按照一定的顺序来发放礼物。我们可以轻松地使用 Elastic Stack 中的 Kibana 来创建一个 Maps 可视化来展…

Elmedia Player - Mac 上最好用的音视屏媒体播放器

Elmedia Player - Mac 上最好用的音视屏媒体播放器 Elmedia是macOS的富媒体播放器&#xff0c;支持多种文件格式&#xff0c;包括大多数视频和音频。一些支持的文件类型包括FLV, SWF, WMV, AVI, MOV, MP4, MP3, DAT, FLAC, M4V, MPG和MKV。它不仅有多种格式&#xff0c;而且还为…

刷爆力扣之电话号码的字母组合

刷爆力扣之电话号码的字母组合 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

【语义感知:IVIF:实时:高级视觉任务循环】

Image fusion in the loop of high-level vision tasks: A semantic-aware real-time infrared and visible image fusion network &#xff08;高级视觉任务循环中的图像融合&#xff1a;一种具有语义感知的实时红外与可见光图像融合网络&#xff09; 本文提出了一种语义感知…

【Vue 快速入门系列】如何更优雅的使用vuex进行组件间通信

文章目录前言一、vuex是什么&#xff1f;二、vuex的使用三、四个重要的映射函数四、多组件数据共享五、模块化使用vuex前言 前面介绍过几种可以实现组件间通信的方式props、ref、自定义事件绑定、全局事件总线、插槽…&#xff0c;这些要么就是实现组件间通信只能在特定条件下…

一个基于.Net开发的Windows截屏录制工具

今天给大家推荐一个UI漂亮、功能强大的截屏录制工具。 项目简介 这是基于.Net开发的&#xff0c;屏幕截图、录屏的开源项目。功能非常强大&#xff0c;功能列表如下&#xff1a; 1、截图&#xff1a;全屏截图、滚动截图、检测窗口截图、自动截图、倒计时截图 2、录制&#…

Treap树堆

1.概念 当串行一直插入连续的数字&#xff0c;会导致树成为一个链表&#xff0c;时间复杂度变为0N 树堆概念&#xff1a; 主要体现的思想是随机插入数字&#xff0c;会给每个数字赋予一个优先级——>目的是让插入的关键字满足二叉树&#xff08;节点的性质满足&#xff08…

155. SAP Smart Table 的 Personalization(个性化配置)

本教程的前一步骤,我们介绍了 SAP Smart Table 和 Smart Filter Bar 配合起来的使用方法: SAP UI5 应用开发教程之一百五十四 - SAP UI5 Smart Table 和 Smart Filter Bar 的联合使用方法介绍本文我们在此基础上更进一步,为 Smart Table 增添一个 Personalization(个性化配置…

蓝桥杯备赛Day2——知识拾遗

目录 字符串 格式化输出 字符串的常用方法 1、去掉空格和特殊符号 2、字符串的测试和替换函数 3、字符串的分割 4、连接字符串 5.截取字符串(切片&#xff09; ​编辑 6、eval函数 7、关键字in&#xff08;返回布尔值&#xff09; 8、startswith()、endswith() 9、…

第5章 管理端(Vue)布局面的重构与路由的全局存储

1 重构路由&#xff1a;src\router\index.js import { createRouter, createWebHashHistory } from vue-router import HomeView from ../views/HomeView.vue //注意&#xff1a;path属性所对应的字符串不能与“*.vue”文件名相同否则会出现错误。 const routes [{ path: …