当前位置: 首页 > news >正文

【分类】【损失函数】处理类别不平衡:CEFL 和 CEFL2 损失函数的实现与应用

引言

在深度学习中的分类问题中,类别不平衡问题是常见的挑战之一。尤其在面部表情分类任务中,不同表情类别的样本数量可能差异较大,比如“开心”表情的样本远远多于“生气”表情。面对这种情况,普通的交叉熵损失函数容易导致模型过拟合到大类样本,忽略少数类样本。为了有效解决类别不平衡问题,Class-balanced Exponential Focal Loss (CEFL)Class-balanced Exponential Focal Loss 2 (CEFL2) 损失函数应运而生。

本文将详细介绍CEFLCEFL2损失函数,阐述它们在面部表情分类任务中的应用,并提供PyTorch实现代码,带有详细注释,适合开发者在实际项目中使用。

目录

  • 引言
  • 一、CEFL 和 CEFL2 损失函数概述
    • 1.1 Focal Loss 的背景
    • 1.2 CEFL 的定义
    • 1.3 CEFL2 的扩展与改进
    • 1.4 对比 CEFL 和 CEFL2
  • 二、面部表情分类中的类别不平衡问题
    • 2.1 类别不平衡对模型训练的影响
    • 2.2 解决策略
  • 三、如何使用 CEFL 和 CEFL2 损失函数
    • 3.1 CEFL 和 CEFL2 损失函数的核心公式
    • 3.2 类别频率的计算与应用
    • 3.3 计算类别频率的代码示例
  • 四、PyTorch 实现
    • 4.1 CEFL 实现
    • 4.2 CEFL2 实现
    • 4.3 训练过程
  • 总结
  • 参考文献

一、CEFL 和 CEFL2 损失函数概述

1.1 Focal Loss 的背景

在传统的分类任务中,交叉熵损失(Cross-Entropy Loss)常常用作优化目标。然而,交叉熵损失函数并没有很好地解决类别不平衡问题,特别是在少数类样本较少时。Focal Loss(焦点损失)由 Lin et al. (2017) 提出,主要用于解决 类别不平衡 问题,旨在通过减小容易分类样本的损失权重,增强模型对困难样本的关注。

Focal Loss 引入了一个调节因子 ( 1 − p t ) γ (1 - p_t)^\gamma (1pt)γ,通过减小容易分类样本的损失,聚焦模型训练中的难分类样本,从而引导模型更加关注难以分类的样本,尤其在类别不平衡的情形下,避免多数类样本主导训练。其公式如下:

F L ( p t ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t) FL(pt)=αt(1pt)γlog(pt)

其中:

  • p t p_t pt 是预测类别的概率。
  • γ \gamma γ 调节因子,是一个常量超参数,通常设为大于 0 的值(例如 2),用于控制易分类样本的惩罚程度。较大的 γ \gamma γ 会增加对难分类样本的关注。当 γ \gamma γ=0时 ,焦点损失在形式上等价于交叉熵损失。
  • α t \alpha_t αt 是一个用于平衡类别不平衡的权重因子,可以根据每个类别的频率进行调整。

1.2 CEFL 的定义

Class-balanced Exponential Focal Loss (CEFL) 是在 Focal Loss 基础上的进一步改进。它通过在焦点损失中引入类别平衡策略,赋予每个类别不同的权重,从而有效地应对类别不平衡问题。
通过引入类别平衡策略来处理类别不平衡问题。与 Focal Loss 相比,CEFL 会根据每个类别的频率赋予不同的权重,从而调整损失函数,特别是在类别不平衡的情况下更加有效。

CEFL 的公式如下:

CEFL ( p t ) = − ( 1 − p t ) log ⁡ ( p t ) − p t ( 1 − p t ) γ log ⁡ ( p t ) \text{CEFL}(p_t) = -(1 - p_t) \log(p_t) - p_t (1 - p_t)^\gamma \log(p_t) CEFL(pt)=(1pt)log(pt)pt(1pt)γlog(pt)

其中:

  • p t p_t pt:表示样本属于正确类别的预测概率。
  • γ \gamma γ:( γ \gamma γ>0)焦点损失的调节因子,通常设置为 2,用于放大难以分类的样本的损失,使得模型更加关注困难的样本。注意当 γ \gamma γ=0时 ,CEFL损失在形式上是交叉熵损失。

公式的第一项是传统的交叉熵损失,第二项则是引入焦点损失后的部分,用来减小易分类样本的影响权重,使得困难样本对总损失的贡献更大,从而模型更加专注于难分类的样本。特别地,第二项通过 $( (1 - p_t)^\gamma ) $调节了模型对不同难度样本的关注程度。

1.3 CEFL2 的扩展与改进

CEFL2 是对 CEFL 损失函数的扩展,它进一步考虑了类别的频率信息,通过精细的调整每个类别的损失权重,使得模型在极度不平衡的数据集上表现更好。CEFL2 引入了类别频率(class frequency)作为权重,使用每个类别在数据集中出现的频率来调整每个类别的影响。

CEFL2 的公式为:
CEFL2 ( p t ) = − ( 1 − p t ) 2 ( 1 − p t ) 2 + p t 2 log ⁡ ( p t ) − p t 2 ( 1 − p t ) 2 + p t 2 ( 1 − p t ) γ log ⁡ ( p t ) \text{CEFL2}(p_t) = -\frac{(1 - p_t)^2}{(1 - p_t)^2 + p_t^2} \log(p_t) - \frac{p_t^2}{(1 - p_t)^2 + p_t^2} (1 - p_t)^\gamma \log(p_t) CEFL2(pt)=(1pt)2+pt2(1pt)2log(pt)(1pt)2+pt2pt2(1pt)γlog(pt)

其中:

  • 第一个项和第二个项分别对应于不同类别的损失权重和焦点损失的加权贡献。
  • ( 1 − p t ) 2 ( 1 − p t ) 2 + p t 2 \frac{(1 - p_t)^2}{(1 - p_t)^2 + p_t^2} (1pt)2+pt2(1pt)2 p t 2 ( 1 − p t ) 2 + p t 2 \frac{p_t^2}{(1 - p_t)^2 + p_t^2} (1pt)2+pt2pt2是根据类别的频率对损失进行调整的权重项。具体来说,它们的比例反映了每个类别相对于整个数据集的频率。

该损失函数通过动态调整类别的权重,使得模型对少数类样本的损失更加敏感,从而提升对少数类的识别能力。

1.4 对比 CEFL 和 CEFL2

特性CEFLCEFL2
核心思想结合焦点损失和类别平衡引入类别频率,进一步优化类别平衡
类别权重通过 α t \alpha_t αt 设置权重通过类别频率动态调整权重
适用场景通用的类别不平衡问题极度不平衡的类别问题
主要优点简单有效,适合一般类别不平衡问题更适用于处理极端类别不平衡的数据

二、面部表情分类中的类别不平衡问题

2.1 类别不平衡对模型训练的影响

在面部表情分类任务中,可能会出现不同表情类别样本不平衡的情况。例如,常见表情如“开心”或“惊讶”在数据集中占有大量样本,而“生气”或“害怕”等情绪类别可能样本较少。这种类别不平衡将导致模型偏向于大类表情,忽视少数类表情,从而影响分类性能,尤其是对少数类样本的识别。

影响

  • 模型可能会对大类表情有较高的分类准确率,而忽视少数类表情。
  • 少数类表情样本的训练效果较差,难以学到有效的特征表示。

2.2 解决策略

使用 CEFLCEFL2 损失函数可以有效缓解类别不平衡问题,在训练过程中让模型更多关注少数类样本,从而提升少数类样本的分类效果。

三、如何使用 CEFL 和 CEFL2 损失函数

3.1 CEFL 和 CEFL2 损失函数的核心公式

损失函数公式说明
CEFL − ( 1 − p t ) log ⁡ ( p t ) − p t ( 1 − p t ) γ log ⁡ ( p t ) -(1 - p_t) \log(p_t) - p_t (1 - p_t)^\gamma \log(p_t) (1pt)log(pt)pt(1pt)γlog(pt)基于 Focal Loss,加入类别权重调整
CEFL2 − ( 1 − p t ) 2 ( 1 − p t ) 2 + p t 2 log ⁡ ( p t ) − p t 2 ( 1 − p t ) 2 + p t 2 ( 1 − p t ) γ log ⁡ ( p t ) -\frac{(1 - p_t)^2}{(1 - p_t)^2 + p_t^2} \log(p_t) - \frac{p_t^2}{(1 - p_t)^2 + p_t^2} (1 - p_t)^\gamma \log(p_t) (1pt)2+pt2(1pt)2log(pt)(1pt)2+pt2pt2(1pt)γlog(pt)引入类别频率,进一步调整损失权重

3.2 类别频率的计算与应用

CEFL2 中,需要根据训练集中的类别分布计算每个类别的频率。这些频率作为权重在损失函数中进行调整。类别频率的计算公式如下:

class_freq t = 1 num_samples_in_class t \text{class\_freq}_t = \frac{1}{\text{num\_samples\_in\_class}_t} class_freqt=num_samples_in_classt1

随后,将类别频率归一化,使其和为 1:

normalized_class_freq t = class_freq t ∑ class_freq \text{normalized\_class\_freq}_t = \frac{\text{class\_freq}_t}{\sum \text{class\_freq}} normalized_class_freqt=class_freqclass_freqt

3.3 计算类别频率的代码示例

import numpy as npdef compute_class_frequencies(targets, num_classes):# 计算每个类别的样本数量class_counts = np.bincount(targets.numpy(), minlength=num_classes)# 防止除零错误,计算每个类别的频率class_freq = 1.0 / (class_counts + 1e-6)# 归一化类别频率class_freq = class_freq / np.sum(class_freq)return torch.tensor(class_freq, dtype=torch.float32)

四、PyTorch 实现

4.1 CEFL 实现

import torch	
import torch.nn as nn
import torch.nn.functional as Fclass CEFL(nn.Module):def __init__(self, alpha, gamma=2.0):super(CEFL, self).__init__()self.alpha = alpha  # 类别的权重self.gamma = gamma  # 焦点损失的调节参数def forward(self, inputs, targets):# 使用softmax计算类别概率p = F.softmax(inputs, dim=1)# 选择正确类别的预测概率p_t = p.gather(1, targets.view(-1, 1))# 计算损失loss = -self.alpha * (1 - p_t) ** self.gamma * torch.log(p_t)return loss.mean()

代码解释

  1. 类的构造函数 (__init__):

    • alpha: 这是一个超参数,用于对各类别的损失加权。它在训练过程中控制类别的重要性。一般来说,alpha 用来增加或减少某些类别的损失权重(通常在类别不平衡时使用)。
    • gamma: 这是焦点损失的调节参数。焦点损失(Focal Loss)是一种为了解决类别不平衡问题而提出的损失函数,gamma 控制模型对易分类样本和难分类样本的关注程度。较大的 gamma 会增加对难分类样本的关注。
  2. forward 方法:

    • inputs: 网络的输出(通常是 logits),大小为 (batch_size, num_classes),表示每个样本对于每个类别的预测得分。
    • targets: 真实标签,大小为 (batch_size,),是样本的正确类别标签。
  3. F.softmax(inputs, dim=1):

    • 对模型的输出 logits 进行 softmax 计算,将其转化为概率分布。softmax 的作用是将每个样本的所有类别得分转化为一个概率分布,概率值的总和为 1。
    • dim=1 表示在类别维度上进行归一化,即每个样本的类别概率和为 1。
  4. p.gather(1, targets.view(-1, 1)):

    • p 是通过 softmax 得到的类别概率矩阵,p.gather(1, targets.view(-1, 1)) 选择每个样本的正确类别的概率。
    • gather(1, targets.view(-1, 1)) 会根据 targets 中给出的标签索引,从 p 中提取每个样本对应类别的概率。view(-1, 1)targets 转换为列向量,确保正确地索引每个样本的类别。
  5. 焦点损失部分:

    • loss = -self.alpha * (1 - p_t) ** self.gamma * torch.log(p_t):
      • p_t: 每个样本在正确类别上的预测概率。
      • (1 - p_t) ** self.gamma: 这是焦点损失的核心部分。它会放大模型对难分类样本的关注。对于那些预测较为确定的样本(即 p_t 接近 1),(1 - p_t) 会较小,损失减少;对于难分类样本(即 p_t 接近 0),(1 - p_t) 会较大,损失增加。
      • self.alpha: 用于控制类别的重要性。如果某些类别较为不平衡,alpha 可以增加这些类别的损失权重。
      • torch.log(p_t): 计算类别概率的对数值,通常是交叉熵的一部分。
  6. 返回平均损失:

    • loss.mean(): 返回所有样本的平均损失。

4.2 CEFL2 实现

import torch
import torch.nn as nn
import torch.nn.functional as Fclass CEFL2(nn.Module):def __init__(self, class_frequencies, gamma=2.0):super(CEFL2, self).__init__()self.class_frequencies = class_frequencies  # 类别频率self.gamma = gamma  # 焦点损失的调节参数def forward(self, inputs, targets):# 使用softmax计算类别概率p = F.softmax(inputs, dim=1)# 选择正确类别的预测概率p_t = p.gather(1, targets.view(-1, 1))# 计算每个类别的加权损失loss_term_1 = (1 - p_t)**2 / ((1 - p_t)**2 + p_t**2) * torch.log(p_t)loss_term_2 = p_t**2 / ((1 - p_t)**2 + p_t**2) * (1 - p_t)**self.gamma * torch.log(p_t)# 将每个类别的频率作为加权项loss = -self.class_frequencies[targets] * (loss_term_1 + loss_term_2)return loss.mean()

代码解释

  1. 类的构造函数 (__init__):

    • class_frequencies: 这是每个类别的频率。通常,频率是类别样本的出现概率或样本的加权值。该参数在处理类别不平衡时尤其重要。较少出现的类别会赋予较高的权重,以便模型对这些类别更敏感。
    • gamma: 和 CEFL 中的 gamma 相同,用于调节焦点损失的程度,控制对难分类样本的关注。
  2. forward 方法:

    • inputs: 与 CEFL 相同,是模型的输出(即 logits)。
    • targets: 与 CEFL 相同,是真实标签。
  3. F.softmax(inputs, dim=1):

    • 对模型的输出 inputs 进行 softmax 计算,得到每个样本在各类别上的概率。
  4. p.gather(1, targets.view(-1, 1)):

    • gather 方法用来根据 targets 中的标签提取每个样本的正确类别的预测概率。
  5. 加权损失部分

    • loss_term_1 = (1 - p_t)**2 / ((1 - p_t)**2 + p_t**2) * torch.log(p_t):
      • 这是针对正确类别概率 p_t 的一个加权项。这个项的目的是将模型的关注点放在难分类的样本上。计算时考虑了正确类和错误类之间的比例,进而调整损失值。
    • loss_term_2 = p_t**2 / ((1 - p_t)**2 + p_t**2) * (1 - p_t)**self.gamma * torch.log(p_t):
      • 另一个加权项,考虑了模型对难分类样本的关注(即当 p_t 小,样本难分类时),通过增加 gamma 使得模型对难分类样本的权重更加突出。
    • 这两个损失项的组合有助于在类别不平衡问题中进行加权,增强对少数类的学习。
  6. 加权频率项

    • loss = -self.class_frequencies[targets] * (loss_term_1 + loss_term_2):
      • 将每个类别的频率(class_frequencies)引入损失计算中。这使得类别频率较低的类别(通常是少数类)在计算损失时有更高的权重,从而让模型更加关注少数类。
  7. 返回平均损失

    • loss.mean(): 返回所有样本的加权平均损失。

4.3 训练过程

为了更好地展示如何在训练过程中使用 CEFLCEFL2 损失函数,,并将其应用于一个简单的神经网络模型。以下是更新后的代码示例:

import torch
from torch.utils.data import DataLoader, Dataset
import numpy as np# 计算类别频率的函数
def compute_class_frequencies(targets, num_classes):# 计算每个类别的样本数量class_counts = torch.bincount(targets, minlength=num_classes)# 防止除零错误,计算每个类别的频率class_freq = 1.0 / (class_counts.float() + 1e-6)# 归一化类别频率class_freq = class_freq / class_freq.sum()return class_freq# 自定义数据集类
class CustomDataset(Dataset):def __init__(self, data, targets):self.data = dataself.targets = targetsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.targets[idx]# 创建一个虚拟数据集
num_samples = 1000
num_classes = 7
input_dim = 128
data = torch.randn(num_samples, input_dim)
targets = torch.randint(0, num_classes, (num_samples,))# 计算每个类别的频率
class_frequencies = compute_class_frequencies(targets, num_classes)# 创建数据加载器
dataset = CustomDataset(data, targets)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)# 定义模型(例如一个简单的全连接网络)
class SimpleModel(nn.Module):def __init__(self, input_dim, num_classes):super(SimpleModel, self).__init__()self.fc = nn.Linear(input_dim, num_classes)def forward(self, x):return self.fc(x)# 初始化模型和损失函数
model = SimpleModel(input_dim, num_classes)
criterion = CEFL2(class_frequencies)  # 使用 CEFL2 损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 训练模型
epochs = 10
for epoch in range(epochs):model.train()running_loss = 0.0for inputs, targets in dataloader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, targets)loss.backward()optimizer.step()running_loss += loss.item()avg_loss = running_loss / len(dataloader)print(f"Epoch [{epoch+1}/{epochs}], Loss: {avg_loss:.4f}")

代码解释

  1. 类别频率计算 (compute_class_frequencies):

    • 这个函数计算了每个类别在数据中的出现频率。我们通过计算每个类别的出现次数并进行归一化,得到类别频率。
    • torch.bincount(targets) 用于计算每个类别出现的次数,随后通过频率逆转的方式进行归一化。
  2. 自定义数据集 (CustomDataset):

    • 这个自定义数据集类返回每个样本的输入和标签对,适用于 PyTorch 的 DataLoader
  3. 模型定义 (SimpleModel):

    • 定义了一个简单的全连接层的神经网络,用于演示如何应用损失函数。
    • 模型输入为 input_dim,输出为 num_classes
  4. 训练循环:

    • 在每个 epoch 中,模型通过前向传播获得预测结果,并计算损失。
    • 使用 CEFL2 损失函数,基于每个类别的频率进行加权损失计算。
    • optimizer.zero_grad() 清空之前的梯度,loss.backward() 计算梯度,optimizer.step() 更新模型权重。

总结

在本文中,我们深入探讨了 Class-balanced Exponential Focal Loss (CEFL)Class-balanced Exponential Focal Loss 2 (CEFL2) 损失函数的定义、原理及其应用,重点介绍了它们如何有效解决类别不平衡问题。通过引入类别权重和类别频率,这些损失函数能够帮助模型在训练过程中更好地关注少数类样本,避免对多数类样本的过拟合,从而提升少数类的分类性能。

本文还提供了 PyTorch 实现的详细代码,包括如何计算类别频率、定义损失函数,并在训练过程中应用它们。

为帮助理解类别频率的影响,以下图示展示了不同类别在训练过程中损失调整的效果:

CSDN @ 2136
原始训练集
计算类别频率
计算类别频率加权后的损失
优化模型
训练结果
类别频率
损失调整
模型优化
CSDN @ 2136

图中展示了训练过程中如何计算类别频率,并利用这些频率对损失进行加权,从而优化模型训练效果。

通过本文的讲解,您应该对 CEFLCEFL2 损失函数的定义、实现和应用有了更深刻的理解。如果您正在处理类别不平衡的分类任务,不妨尝试使用这些损失函数,它们能有效提升模型的性能,特别是在少数类样本的分类效果上。

参考文献

  • T.-Y. Lin, P. Goyal, R. Girshick, K. He, and P. Dollar, ``Focal loss for dense object detection,’’ in Proc. IEEE Int. Conf. Comput. Vis., Oct. 2017, pp. 2980-2988.doi:10.48550/arXiv.1708.02002.
  • L. Wang, C. Wang, Z. Sun, S. Cheng and L. Guo, “Class Balanced Loss for Image Classification,” in IEEE Access, vol. 8, pp. 81142-81153, 2020, doi: 10.1109/ACCESS.2020.2991237.

相关文章:

【分类】【损失函数】处理类别不平衡:CEFL 和 CEFL2 损失函数的实现与应用

引言 在深度学习中的分类问题中,类别不平衡问题是常见的挑战之一。尤其在面部表情分类任务中,不同表情类别的样本数量可能差异较大,比如“开心”表情的样本远远多于“生气”表情。面对这种情况,普通的交叉熵损失函数容易导致模型…...

AUTOSAR从入门到精通-自动驾驶测试技术

目录 前言 算法原理 测试场景定义与作用 测试场景要素 测试场景分类 场景信息提取与挖掘方法 自动驾驶感知测试分类 自动驾驶图像系统测试 自动驾驶激光雷达系统测试 自动驾驶融合感知系统测试 自动驾驶仿真测试 1. 功能安全 2. 预期功能安全 3. 软件测试 4.敏捷…...

优化大型语言模型的表达能力和依赖关系:理论

摘要 随着自然语言处理技术的发展,大型语言模型(LLM)已经成为理解和生成人类语言的强大工具。然而,如何有效提升这些模型的表达能力以及捕捉长距离依赖关系仍然是一个挑战。本文通过具体实例探讨了词表大小(em_size&a…...

在Ubuntu下使用Wine运行MobaXterm并解决X服务器问题

MobaXterm是一款功能强大的终端模拟器,集成了SSH客户端和X服务器,常用于远程服务器管理。在Ubuntu下,我们可以通过Wine运行MobaXterm,同时解决X服务器问题,实现远程图形界面转发。这对于需要远程使用ROS(如…...

【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行

OpenHarmony LiteOS-M基于Qemu RISC-V运行 系列文章目录更新日志OpenHarmony技术架构OH技术架构OH支持系统类型轻量系统(mini system)小型系统(small system)标准系统(standard system) 简介环境准备安装QE…...

SW - 钣金零件保存成DWG时,需要将折弯线去掉

文章目录 SW - 钣金零件保存成DWG时,需要将折弯线去掉概述笔记备注END SW - 钣金零件保存成DWG时,需要将折弯线去掉 概述 如果做需要弯折的切割件,最好做成钣金零件。 最近做了几个小钣金(将钣金展开,建立新草图,在2…...

JAVA使用自定义注解,在项目中实现EXCEL文件的导出

首先定义一个注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface Excel {/*** 导出时在excel中排序*/int sort() default Integer.MAX_VALUE;/*** 导出到Excel中的名字.*/String name() default "";/*** 首行字段的批注*/String …...

【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)

文章目录 一、应用场景二、墨卡托投影1、知识点2、Arcgis中的坐标系选择 三、操作步骤1、数据转换2、数据加载3、栅格投影4、地理配准 一、应用场景 地理配准是数字化之前必须进行的一项工作。扫描得到的地图数据通常不包含空间参考信息,需要通过具有较高位置精度的…...

flutter在使用gradle时的加速

当我使用了一些过时的插件的时候,遇到了一些问题 比如什么namespace 问题等,因为有些插件库没有更新了,或者最新版本处于测试阶段 于是我就删除这些旧插件(不符合我要求的插件) 于是根据各论坛的解决方法去做了以下的工作 1:项目中删除了这…...

ABP - 缓存模块(1)

ABP - 缓存模块(1) 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching ,而对于分布式缓存…...

二、点灯基础实验

嵌入式基础实验第一个就是点灯,地位相当于编程界的hello world。 如下为LED原理图,要让相应LED发光,需要给I/O口设置输出引脚,低电平,二极管才会导通 2.1 打开初始工程,编写代码 以下会实现BLINKY常亮&…...

双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]

集合 关系 介绍 Deque 是一个接口 LinkedList 是这个接口的实现类 题目 输入输出 滑动窗口 基于双端队列实现 Deque<Integer> deque new LinkedList<>(); 滑动窗口代码 public static List<Integer> maxSlidingWindow(int[] nums, int k) {List<Int…...

HTML<img>标签

例子 如何插入图片&#xff1a; <img src"img_girl.jpg" alt"Girl in a jacket" width"500" height"600"> 下面有更多“自己尝试”的示例。 定义和用法 该<img>标签用于在 HTML 页面中嵌入图像。 从技术上讲&#x…...

【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewClause 22/Clause 45Clause 22Clause 45 PHY Link 状态的软件实现 转自&#xff1a; 开心果 Need Car 2022年10月20日 09:50 上海 Overview PHY…...

Linux虚拟机安装与FinalShell使用:探索Linux世界的便捷之旅

文章目录 软件准备安装 VMware 虚拟机下载CentOS 光盘镜像文件选择适合的 CentOS 版本选择合适的镜像文件 本教程工具版本 第一部分&#xff1a;安装 Linux 虚拟机1. 启动 VMware 并创建新虚拟机2. 默认硬件兼容性设置3. 安装操作系统的设置4. 选择操作系统类型与版本5. 为虚拟…...

Mixly米思齐1.0 2.0 3.0 软件windows版本MAC苹果电脑系统安装使用常见问题与解决

Mixly软件应用常见问题 Mixly米思齐编译或上传报错&#xff1f; 1、软件安装与驱动&#xff08;Mixly1-2&#xff09; 1-1 Windows版本 软件及驱动可以在Mixly群&#xff08;QQ群号621937623&#xff09;的群文件夹中找到&#xff0c;或到Mixly在线软件下载链接中重新下安装…...

vben5 admin ant design vue如何使用时间范围组件RangePicker

本文参考&#xff1a;https://pusdn-dev.feishu.cn/wiki/VF4hwBAUliTE6TkUPKrcBNcZn9f?fromfrom_copylink 由PUSDN整理发行&#xff0c;收录时请保留PUSDN。 前端组件专题 年月日时间范围表单回显RangePicker 推荐使用多个字段存储&#xff0c;不推荐用英文逗号拼接时间&am…...

Kafka 日志存储 — 文件目录及日志格式

日志存储机制是Kafka实现高吞吐量和持久化能力的关键。 1 文件目录布局 图 主题与日志文件的关系 Kafka中的消息持久化为日志文件。一个副本对应一个日志。日志文件在broker上是命名形式为<topic>-<partition>的文件夹。例如&#xff0c;主题par3第3分区在某个副…...

故障诊断 | BWO白鲸算法优化KELM故障诊断(Matlab)

目录 效果一览文章概述BWO白鲸算法优化KELM故障诊断一、引言1.1、研究背景及意义1.2、故障诊断技术的现状1.3、研究目的与内容二、KELM基本理论2.1、KELM模型简介2.2、核函数的选择2.3、KELM在故障诊断中的应用三、BWO白鲸优化算法3.1、BWO算法基本原理3.2、BWO算法的特点3.3、…...

一文读懂AI Agent 智能体

一、什么是智能体Agent&#xff1f; 在计算机科学和人工智能领域&#xff0c;智能体&#xff08;Agent&#xff09; 是一个抽象的概念&#xff0c;用于描述能够感知环境、执行行动并以此对环境产生影响的实体。智能体通常被设计成具有自主性和适应性&#xff0c;能够在不确定、…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...