当前位置: 首页 > 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 损失函数的实现与应用

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

支持selenium的chrome driver更新到132.0.6834.83

最近chrome释放新版本:132.0.6834.83 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...

IO模型与NIO基础二

抽象基类之二 FilterInputStream FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。 它的常用的子类有BufferedInputStream和DataInputStream。 (1) BufferedInputStream的作用就是为“输入流提供缓冲功能,以及mark()和res…...

什么是FPGA开发?

FPGA(Field-Programmable Gate Array),即现场可编程门阵列,是一种通过编程方式实现特定功能的集成电路。与传统的ASIC(专用集成电路)相比,FPGA具有灵活性高、开发周期短、成本相对较低等优势&am…...

寻找川味:成都九尺板鸭

寻找川味:成都九尺板鸭 在四川这片美食的天堂里,隐藏着无数令人垂涎的传统名吃。其中,成都九尺板鸭以其悠久的历史、独特的制作工艺和令人难以抗拒的美味,成为了许多食客心中不可错过的地道川味。 历史渊源 九尺板鸭,顾名思义,因主产于四川省成都市彭州市九尺镇而得名。早在5…...

Object常用的方法及开发中的使用场景

在前端开发中,Object 对象提供了许多常用的方法,这些方法帮助我们操作对象的属性和结构。以下是常用的 Object 方法及其功能简要说明: 对象常用的方法 1. 创建对象 Object.create(proto[, propertiesObject]) 创建一个具有指定原型对象和属性…...

ElasticSearch上

安装ElasticSearch Lucene:Java语言的搜索引擎类库,易扩展;高性能(基于倒排索引)Elasticsearch基于Lucene,支持分布式,可水平扩展;提供Restful接口,可被任何语言调用Ela…...

基于SpringCloud的广告系统设计与实现(二)

一、common公共模块 1.common的作用 通用的代码、配置不应该散落在各个业务模块中,不利于维护与更新 一个大的系统,响应对象需要统一外层格式 各种业务设计与实现,可能会抛出各种各样的异常,异常信息的收集也应该做到统一 2.统…...

2011年西部数学奥林匹克的几何题

2011G1 证明: 显然, O O O, I I I, F F F 共线, E I / / M O EI//MO EI//MO, △ E I F ∼ △ M O F \triangle EIF \sim \triangle MOF △EIF∼△MOF. 进而 E F / M F r 1 / r 2 EF/MFr_1/r_2 EF/MFr1​/r2​. ( r 1 (r_1 (r1​ 为圆 I I I 的半径, r 2 r_2 r2​ 为…...

(一)afsim第三方库编译

注意:防止奇怪的问题,源码编译的路径最好不要有中文,请先检查各文件夹名 AFSIM版本 Version: 2.9 Plugin API Version: 11 软件环境 操作系统: Kylin V10 SP1 项目构建工具: cmake-3.26.0-linux-aarch6…...

boss直聘 __zp_stoken__ 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 py代码 import execjs imp…...

python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像

目录 1. 使用plt.savefig保存无边框图形 2. 显示在屏幕上,并且去掉窗口的标题栏和工具栏 3. 通过配置 matplotlib 的 backend 和使用 Tkinter(或其他图形库) 方法 1:使用 TkAgg 后端,并禁用窗口的工具栏和标题栏 …...

AI-Talk开发板之替换唤醒词

一、说明 聆思提供的Demo唤醒词默认为"小美,小美",V2.4及之后的SDK支持替换唤醒词,聆思提供了在线工具生成唤醒词固件。 工具:tool.listenai.com/audio-custom/products/ 官方博客教程:实操给桌面AI语音助理&#xff…...

C#实现字符串反转的4种方法

见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 1、string.Reverse 方法 string content "Hello World";string reverseStri…...

【MySQL索引:B+树与页的深度解析】

文章目录 MySQL索引:B树与页的深度解析1. 索引使用的数据结构——B树1.1 B树介绍1.2 B树的特点1.3 B树和B树的对比 2. MySQL中的页2.1 页的介绍2.2 页主体2.3 页目录2.4 B树在MySQL索引中的应用 MySQL索引:B树与页的深度解析 在MySQL数据库中&#xff0…...

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容,MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令,你需要找到 mysql 可执行文件的路径。 在 macOS 上,mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此,完整的路径应该是&#xff1…...

深入HDFS——数据上传源码

引入 就如RPC篇章里提到的观点一样,任何一种能广为传播的技术,都是通过抽象和封装的思想,屏蔽底层底层复杂实现,提供简单且强大的工具,来降低使用门槛的。 HDFS的风靡自然也是如此。 通过前面深入了NameNode和DataN…...

归并排序算法

归并排序 1算法介绍 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用…...

优雅解决webview_flutter不支持安卓选择图片视频文件问题

这个问题,网上一搜索,就是要去修改别人写好的插件。 搞Flutter开发,尽量不要去修改别人的插件 ,特别是像 webview_flutter 这种比较大的官方插件。 相信我,你拿捏不了它。 主要问题就是: webview_flutter…...

Linux UDP 编程详解

一、引言 在网络编程领域,UDP(User Datagram Protocol,用户数据报协议)作为一种轻量级的传输层协议,具有独特的优势和适用场景。与 TCP(Transmission Control Protocol,传输控制协议&#xff0…...

UllnnovationHub,一个开源的WPF控件库

目录 UllnnovationHub1.项目概述2.开发环境3.使用方法4.项目简介1.WPF原生控件1.Button2.GroupBox3.TabControl4.RadioButton5.SwitchButton6.TextBox7.PasswordBox8.CheckBox9.DateTimePicker10.Expander11.Card12.ListBox13.Treeview14.Combox15.Separator16.ListView17.Data…...

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字,还实现了服务器端和客户端的通信,本…...

css3过渡总结

一、过渡的定义与作用 CSS3 过渡(Transitions)允许 CSS 属性在一定的时间区间内平滑地过渡,从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅,给用户带来更好的视觉体验。例如,当一个元素从隐藏状态…...

生产环境中常用的设计模式

生产环境中常用的设计模式 设计模式目的使用场景示例单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点- 日志记录器- 配置管理器工厂方法模式定义一个创建对象的接口,让子类决定实例化哪个类- 各种工厂类(如视频游戏工厂模式创…...

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…...

游戏行业销售数据分析可视化

完整源码项目包获取→点击文章末尾名片! 🌟分析: 可看出最近五年用户最喜爱的游戏类型依然还是Action-动作类(当然市场发行的也很多) Sports-运动类和Shooter-射击类顺序互换,但我估计现在大环境局势紧张可以会推动射击…...

微服务网关,如何选择?

什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…...

Java开发提速秘籍:巧用Apache Commons Lang工具库

一、Java 开发效率之困 在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者…...

多用户商城系统源码哪家好用?怎么选?

想拥有属于自己的多用户商城系统,但回头一看自己又是个技术小白,看着网上眼花缭乱的b2b2c商城系统,更是不知道如何选起?下面给大家分享一条较为成熟的选择思路,以作参考。 1、从需求上决定系统方向 企业在选型b2b2c商…...

聊聊如何实现Android 放大镜效果

一、前言 很久没有更新Android 原生技术内容了,前些年一直在做跨端方向开发,最近换工作用重新回到原生技术,又回到了熟悉但有些生疏的环境,真是感慨万分。 近期也是因为准备做地图交互相关的需求,功能非常复杂&#x…...

NVIDIA视频编解码

开源了两个项目:英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装,由于官方自带的demo晦涩难懂并且每块都是独立的,我对SDK进行二次封装并形成了一套较为完整的视频编解码流程,调用简单,有完整的测…...

Mysql事务隔离级

什么是事务的隔离级别 数据库事务的隔离级别是指事务在并发执行时,如何控制事务之间相互影响的程度。它决定了多个事务并发执行时,事务中的操作对其他事务的可见性,进而影响数据的一致性和并发性。 为什么会有隔离级别的概念? …...

K210视觉识别模块

K210视觉识别模块是一款功能强大的AI视觉模块,以下是对其的详细介绍: 一、核心特性 强大的视觉识别功能:K210视觉识别模块支持多种视觉功能,包括但不限于人脸识别、口罩识别、条形码和二维码识别、特征检测、数字识别、颜色识别…...

springboot使用websocket

文章目录 一、概述1、简介 二、 使用1、引包2、配置处理器3、前端测试 一、概述 1、简介 简介略,附上官方文档,spring5和spring6的官方文档内容大致是一样的: https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framewo…...

线程池底部工作原理

线程池内部是通过线程和队列实现的,当我们通过线程池处理任务时: 如果线程池中的线程数量小于corePoolSize,无论是否有处于空闲的线程,都创建新的线程来处理被添加的任务。 如果线程池中的线程数量等于corePoolSize,…...

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

在当今数字化飞速发展的时代,开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员,其发展历程与成果备受关注。值此之际,GitCode 精心整理了 DevUI 年度运营报告,为您全面呈现 DevUI 社区在过去一年里的开源之…...

Mybatis面试题

Mybatis面试题 什么是 MyBatis?讲下 MyBatis 的缓存Mybatis 是如何进行分页的?分页插件的原理是什么?简述 Mybatis 的插件运行原理,以及如何编写一个插件?Mybatis 动态 sql 是做什么的?都有哪些动态 sql&am…...

Python获取系统运行时间

有时候想获取系统启动后到现在的运行时间&#xff0c;在Linux C可以使用clock_gettime()来获得&#xff0c;如下&#xff0c; #include <time.h> #include <stdio.h>int main() {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);printf("syste…...

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…...

【18】Word:明华中学-儿童医保❗

目录 题目​ NO2 NO3 NO4 NO5 NO6 NO7 NO8 NO9 题目 NO2 布局→页面设置对话框→纸张方向&#xff1a;横向→纸张大小&#xff1a;A3 &#xff1b;页面设置对话框&#xff1a;直接输入纸张大小的宽度和高度即可→页面设置对话框&#xff1a;上下左右边距→版式&…...

Vue 中实现修改数组,并保持页面渲染数据是响应式更改

如果你在 Vue 中使用数组并希望确保对数组项的修改是响应式的&#xff0c;直接替换数组项可能不会触发 Vue 的响应式更新。为了确保响应式更新&#xff0c;你可以使用 Vue 提供的 Vue.set() 方法&#xff08;在 Vue 2 中&#xff09;或使用 this.$set() 方法&#xff08;在 Vue…...

MATLAB算法实战应用案例精讲-【数模应用】图形变换和复杂图形组合(附python和MATLAB代码实现)

目录 前言 算法原理 变换 1二维变换 1.1缩放 1.2 翻转 1.3剪切 1.4 旋转 2齐次坐标 2.1引入齐次坐标的原因 2.2 二维齐次坐标 2.3二维仿射变换 2.4逆变换 4组合变换 5三维变换(由二维变换推理而来) 5.1三维齐次坐标 5.2 三维仿射变换 5.3 缩放和平移 5.4…...

GCC支持Objective C的故事?Objective-C?GCC只能编译C语言吗?Objective-C 1.0和2.0有什么区别?

GCC支持Objective C的故事 Objective-C 主要由 Stepstone 公司的Brad Cox和 Tom Love 在1980 年左右发明。乔布斯离开苹果公司后成立了NeXT STEP公司&#xff0c; 买下了Objective-C 语言的授权。GCC对Objective-C语言的支持是在1992年加入的&#xff0c;具体是在GCC 1.3版本中…...

自动驾驶占用网格预测

文章目录 需要阅读的文献&#xff1a;github论文仓库论文idea提取BEVFormer 需要阅读的文献&#xff1a; ⭐[ECCV 2024] SparseOcc 纯稀疏3D占用网络和 RayIoU 评估指标 ECCV 2024&#xff5c;OSP&#xff1a;自动驾驶全新建模方法&#xff0c;端到端输出任意位置的占用结果 S…...

1.17组会汇报

STRUC-BENCH: Are Large Language Models Good at Generating Complex Structured Tabular Data? STRUC-BENCH&#xff1a;大型语言模型擅长生成复杂的结构化表格数据吗&#xff1f;23年arXiv.org 1概括 这篇论文旨在评估大型语言模型&#xff08;LLMs&#xff09;在生成结构…...

使用 Ansys Motor-CAD 的自适应模板加速创新

应对现代电机设计挑战 电机设计不断发展&#xff0c;Ansys 正在通过创新解决方案引领潮流&#xff0c;不断突破可能的界限。随着电动汽车、工业自动化和可再生能源系统的快速增长&#xff0c;对优化电机的需求从未如此之高。工程师面临着越来越大的压力&#xff0c;他们需要开发…...

用nginx正向代理https网站

目录 1. 缘起2. 部署nginx3. 测试3.1 http测试3.2 https测试4 给centos设置代理访问外网 1. 缘起 最近碰到了一个麻烦事情&#xff0c;就是公司的centos测试服务器放在内网环境&#xff0c;而且不能直接上外网&#xff0c;导致无法通过yum安装软件&#xff0c;非常捉急。 幸…...

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件&#xff0c;但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别&#xff1a; 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…...

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…...

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…...