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

常用损失函数详解:广泛使用的优化约束方法

各类常用损失函数详解:广泛使用的优化约束方法

今天介绍下损失函数,先介绍下我常用的方法SmoothedL1,它是一个平滑的L1 penalty函数,用于处理约束violation。

标准的L1 penalty函数定义为:
L 1 ( x ) = { 0 , if  x ≤ 0 x , if  x > 0 L_1(x)=\begin{cases} 0, & \text{if } x\leq 0 \\ x, & \text{if } x>0 \end{cases} L1(x)={0,x,if x0if x>0
其中 x x x表示约束violation。然而,这个函数在 x = 0 x=0 x=0处不可导,会给基于梯度的优化算法带来数值问题。

为了解决这个问题,SmoothedL1使用了一个分段的、光滑的函数来近似L1 penalty。它的定义如下:
smoothedL1 ( x , μ ) = { 0 , if  x < 0 1 2 μ x 2 , if  0 ≤ x < μ x − 1 2 μ , if  x ≥ μ \text{smoothedL1}(x,\mu)=\begin{cases} 0, & \text{if } x<0 \\ \frac{1}{2\mu}x^2, & \text{if } 0\leq x<\mu \\ x-\frac{1}{2}\mu, & \text{if } x\geq\mu \end{cases} smoothedL1(x,μ)= 0,2μ1x2,x21μ,if x<0if 0x<μif xμ
其中 μ > 0 \mu>0 μ>0是一个平滑参数。当 μ → 0 \mu\to 0 μ0时,smoothedL1趋近于标准的L1 penalty;当 μ \mu μ增大时,smoothedL1变得更加平滑。

在代码中,smoothedL1的实现如下:

static inline bool smoothedL1(const double &x,const double &mu,double &f,double &df)
{if (x < 0.0){df = 0;return false;}else if (x < mu){f = x * x / (2.0 * mu);df = x / mu;return true;}else{f = x - 0.5 * mu;df = 1.0;return true;}
}

这个函数接受约束violation x和平滑参数mu,返回penalty值f和梯度df。具体来说:

  1. x < 0 x<0 x<0时,表示没有约束violation,penalty和梯度都为0。
  2. 0 ≤ x < μ 0\leq x<\mu 0x<μ时,使用二次函数 1 2 μ x 2 \frac{1}{2\mu}x^2 2μ1x2来近似L1 penalty,其梯度为 x μ \frac{x}{\mu} μx
  3. x ≥ μ x\geq\mu xμ时,使用线性函数 x − 1 2 μ x-\frac{1}{2}\mu x21μ来近似L1 penalty,其梯度为1。

通过这种分段定义,smoothedL1实现了对L1 penalty的光滑近似。在 x = 0 x=0 x=0 x = μ x=\mu x=μ处,虽然函数本身不可导,但左右导数存在且相等,因此不会引入数值问题。

在轨迹优化中,smoothedL1被用于计算速度约束、加速度约束等的violation对应的cost和梯度。通过将这些cost项添加到目标函数中,并将梯度信息反向传播,优化算法可以在最小化能量(minimum-energy)的同时,将轨迹逐步修正为满足约束的状态,最终得到一条动力学可行(dynamically feasible)的轨迹。这就是smoothedL1在这个问题中的作用和实现原理。

具体应用

我可以给你一个通俗的例子来解释smoothedL1函数的用途。

假设你是一家披萨店的老板,你需要制定一个披萨配送的最优路线。你的目标是找到一条路线,使得配送时间尽可能短,但同时也要考虑到路上可能会遇到一些意外情况,如交通堵塞、红绿灯等。

在这个问题中,我们可以将配送时间看作是优化的目标函数。我们希望实际的配送时间与预期的配送时间尽可能接近。如果实际配送时间比预期时间长,就会有一个惩罚项。

现在,假设我们使用二次函数(即L2损失)来计算惩罚项。这意味着,如果实际配送时间比预期时间长2分钟,惩罚值为4;如果长5分钟,惩罚值为25。你可以看到,随着差异的增大,惩罚值会急剧增加。这在某些情况下可能不太合理,因为一些小的延迟是可以接受的,而大的延迟可能是由一些无法控制的因素引起的,如交通事故。

另一种选择是使用绝对值函数(即L1损失)。这意味着,无论实际配送时间比预期时间长2分钟还是5分钟,惩罚值都是一样的。这也有问题,因为它不能区分小的延迟和大的延迟。

smoothedL1函数提供了一个折衷的方案。它在小的延迟时表现得像二次函数,惩罚值随着差异的增大而平滑增加;在大的延迟时表现得像绝对值函数,惩罚值增加的速度变慢。这样,我们就可以在考虑小的延迟的同时,也对大的延迟更加宽容。

下面是一个简单的Python代码,展示了如何使用smoothedL1函数计算惩罚值:

def smoothedL1(x, mu):if x < 0:return 0elif x > mu:return x - 0.5 * muelse:return (mu - 0.5 * x) * (x / mu)**3# 预期配送时间为10分钟
expected_time = 10# 实际配送时间为12分钟
actual_time = 12# 计算延迟
delay = actual_time - expected_time# 设定平滑参数为5分钟
mu = 5# 计算惩罚值
penalty = smoothedL1(delay, mu)print(f"The penalty for a delay of {delay} minutes is {penalty}.")

如果实际配送时间比预期时间长2分钟,惩罚值为0.384;如果长5分钟,惩罚值为2.5。你可以看到,对于小的延迟,惩罚值较小;对于大的延迟,惩罚值增加的速度变慢。

当然,在实际的路线优化问题中,情况会更加复杂。这在许多优化问题中都非常有用。

其它常用的损失函数

除了smoothedL1损失函数,还有许多其他先进的损失函数在各个领域发挥着关键作用。下面我将介绍几个常用的损失函数及其应用。

  1. 交叉熵损失(Cross-Entropy Loss)
    交叉熵损失函数常用于分类问题。它衡量了模型预测的概率分布与真实标签的差异。对于二分类问题,交叉熵损失函数定义为:
    L C E = − ∑ i = 1 N y i log ⁡ ( p i ) + ( 1 − y i ) log ⁡ ( 1 − p i ) L_{CE}=-\sum_{i=1}^N y_i\log(p_i)+(1-y_i)\log(1-p_i) LCE=i=1Nyilog(pi)+(1yi)log(1pi)
    其中 y i y_i yi是第 i i i个样本的真实标签(0或1), p i p_i pi是模型预测的概率。
    交叉熵损失函数在图像分类、自然语言处理等领域得到广泛应用。它能够促使模型学习到正确的类别,同时抑制错误的类别。许多著名的神经网络,如AlexNet, VGG, ResNet等,都使用交叉熵损失函数进行训练。

  2. 对比损失(Contrastive Loss)
    对比损失函数常用于学习嵌入空间(embedding space),使得相似的样本在嵌入空间中靠近,不相似的样本在嵌入空间中远离。它的定义如下:
    L c o n t r a s t = ∑ ( i , j ) y i j d ( x i , x j ) + ( 1 − y i j ) max ⁡ ( 0 , α − d ( x i , x j ) ) L_{contrast}=\sum_{(i,j)}y_{ij}d(x_i,x_j)+(1-y_{ij})\max(0,\alpha-d(x_i,x_j)) Lcontrast=(i,j)yijd(xi,xj)+(1yij)max(0,αd(xi,xj))
    其中 y i j y_{ij} yij表示样本 i i i j j j是否相似(1表示相似,0表示不相似), d ( x i , x j ) d(x_i,x_j) d(xi,xj)是样本 i i i j j j在嵌入空间中的距离, α \alpha α是一个margin参数。
    对比损失函数在人脸识别、图像检索等领域发挥了重要作用。通过最小化对比损失,模型可以学习到一个鲁棒的嵌入空间,使得相似的样本(如同一个人的不同照片)聚集在一起,不相似的样本(如不同人的照片)分散开来。

  3. 焦点损失(Focal Loss)
    焦点损失函数是一种用于处理类别不平衡问题的损失函数。在许多实际问题中,不同类别的样本数量差异很大。这会导致模型更加关注样本量大的类别,而忽视样本量小的类别。焦点损失函数通过引入一个调制因子来缓解这个问题:
    L f o c a l = − ∑ i = 1 N ( 1 − p i ) γ log ⁡ ( p i ) L_{focal}=-\sum_{i=1}^N(1-p_i)^\gamma\log(p_i) Lfocal=i=1N(1pi)γlog(pi)
    其中 p i p_i pi是模型预测的概率, γ \gamma γ是一个超参数。当模型预测错误时, p i p_i pi较小, ( 1 − p i ) γ (1-p_i)^\gamma (1pi)γ较大,损失函数会给这些样本更大的权重。
    焦点损失函数在目标检测领域取得了巨大成功。在著名的目标检测算法RetinaNet中,使用焦点损失函数替代交叉熵损失函数,大幅提高了对小目标的检测精度。

  4. Wasserstein损失(Wasserstein Loss)
    Wasserstein损失函数源于最优传输理论,它衡量了两个概率分布之间的距离。在生成对抗网络(GAN)中,Wasserstein损失函数被用于度量生成数据和真实数据的分布差异:
    L W a s s e r s t e i n = sup ⁡ ∣ ∣ f ∣ ∣ L ≤ 1 E x ∼ P r [ f ( x ) ] − E x ∼ P g [ f ( x ) ] L_{Wasserstein}=\sup_{||f||_L\leq1}\mathbb{E}_{x\sim P_r}[f(x)]-\mathbb{E}_{x\sim P_g}[f(x)] LWasserstein=∣∣fL1supExPr[f(x)]ExPg[f(x)]
    其中 P r P_r Pr是真实数据的分布, P g P_g Pg是生成数据的分布, f f f是一个Lipschitz连续函数。
    相比于传统的GAN损失函数,Wasserstein损失函数提供了一个更加稳定的训练过程。它在图像生成、风格迁移等领域取得了令人印象深刻的成果。著名的WGAN和WGAN-GP都是基于Wasserstein损失函数构建的。

一个好的损失函数可以引导模型学习到正确的特征表示,加速训练过程,提高模型的泛化能力。

这几种损失函数的应用和优势

  1. 交叉熵损失在图像分类中的应用
    假设我们要训练一个图像分类模型,用于识别图片中的物体类别。我们可以使用交叉熵损失函数来训练这个模型。交叉熵损失函数能够衡量模型预测的类别分布与真实标签的差异,引导模型学习到正确的分类边界。
    以下是使用PyTorch实现交叉熵损失函数的代码示例:
import torch
import torch.nn as nn
# 定义模型
class ImageClassifier(nn.Module):def __init__(self):super(ImageClassifier, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3)self.conv2 = nn.Conv2d(32, 64, 3)self.fc1 = nn.Linear(64 * 6 * 6, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.conv1(x)x = nn.functional.relu(x)x = self.conv2(x)x = nn.functional.relu(x)x = x.view(-1, 64 * 6 * 6)x = self.fc1(x)x = nn.functional.relu(x)x = self.fc2(x)return x
# 定义损失函数
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(10):for i, (images, labels) in enumerate(train_loader):outputs = model(images)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()

这个例子中定义了一个简单的卷积神经网络ImageClassifier,使用nn.CrossEntropyLoss()作为损失函数。在训练过程中,我们将图像输入模型,计算模型的预测结果和真实标签之间的交叉熵损失,然后使用优化器更新模型参数。交叉熵损失函数能够有效地指导模型学习,使其对不同类别的图像进行准确分类。

  1. 对比损失在人脸识别中的应用
    在人脸识别任务中,我们希望模型能够学习到一个鲁棒的人脸嵌入空间,使得同一个人的不同照片在嵌入空间中靠近,不同人的照片在嵌入空间中远离。我们可以使用对比损失函数来达到这个目的。
    以下是使用TensorFlow实现对比损失函数的代码示例:
import tensorflow as tf
# 定义模型
model = tf.keras.Sequential([tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),tf.keras.layers.MaxPooling2D((2, 2)),tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),tf.keras.layers.MaxPooling2D((2, 2)),tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),tf.keras.layers.Flatten(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(10)
])
# 定义损失函数
def contrastive_loss(y_true, y_pred):margin = 1square_pred = tf.math.square(y_pred)margin_square = tf.math.square(tf.math.maximum(margin - y_pred, 0))return tf.math.reduce_mean(y_true * square_pred + (1 - y_true) * margin_square)
# 编译模型
model.compile(optimizer='adam',loss=contrastive_loss,metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=5)

在这个例子中定义了一个卷积神经网络作为人脸嵌入模型。我们自定义了一个contrastive_loss函数,它接收两个参数:真实标签y_true(1表示两张图片属于同一个人,0表示属于不同的人)和模型的预测值y_pred(表示两张图片在嵌入空间中的距离)。对比损失函数鼓励模型将同一个人的照片映射到相近的位置,将不同人的照片映射到相distant的位置。通过最小化对比损失,模型可以学习到一个判别性强的人脸嵌入空间,用于人脸识别和验证。

  1. 焦点损失在目标检测中的应用
    在目标检测任务中,我们需要同时预测目标的位置和类别。然而,背景区域通常占据了图像的大部分,导致正负样本数量极度不平衡。如果直接使用交叉熵损失函数,模型可能会倾向于将大多数区域预测为背景,而忽视了真正的目标。焦点损失函数通过引入一个调制因子来缓解这个问题,使得模型更加关注难以分类的样本。
    以下是使用PyTorch实现焦点损失函数的代码示例:
import torch
import torch.nn as nn
# 定义焦点损失函数
class FocalLoss(nn.Module):def __init__(self, alpha=0.25, gamma=2):super(FocalLoss, self).__init__()self.alpha = alphaself.gamma = gammadef forward(self, pred, target):ce_loss = nn.functional.cross_entropy(pred, target, reduction='none')pt = torch.exp(-ce_loss)focal_loss = self.alpha * (1 - pt) ** self.gamma * ce_lossreturn torch.mean(focal_loss)
# 定义模型
model = nn.Sequential(nn.Conv2d(3, 32, 3, padding=1),nn.ReLU(),nn.Conv2d(32, 64, 3, padding=1),nn.ReLU(),nn.Conv2d(64, 64, 3, padding=1),nn.ReLU(),nn.Conv2d(64, 2, 1)
)
# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(10):for i, (images, targets) in enumerate(train_loader):preds = model(images)loss = FocalLoss()(preds, targets)optimizer.zero_grad()loss.backward()optimizer.step()

在这个例子中,我们定义了一个FocalLoss类,它继承自nn.Module。在forward方法中,我们首先计算交叉熵损失,然后根据预测的准确性计算一个调制因子 ( 1 − p t ) γ (1 - p_t)^\gamma (1pt)γ。这个调制因子可以减少easy example的损失贡献,同时增大hard example的损失贡献。最后将调制后的损失取平均作为最终的焦点损失。在训练过程中,使用焦点损失函数可以使模型更加关注那些难以分类的目标,提高检测精度。

  1. Wasserstein损失在图像生成中的应用
    在图像生成任务中,一般希望生成的图像能够尽可能逼真,同时具有丰富的多样性。传统的GAN使用Jensen-Shannon散度作为损失函数,但这会导致训练过程不稳定,生成质量难以提升。Wasserstein损失函数源于最优传输理论,它衡量了真实图像分布和生成图像分布之间的Wasserstein距离。使用Wasserstein损失函数可以缓解GAN训练中的模式崩溃问题,生成更加逼真和多样的图像。
    以下是使用TensorFlow实现Wasserstein损失函数的代码示例:
import tensorflow as tf
# 定义生成器
generator = tf.keras.Sequential([tf.keras.layers.Dense(7 * 7 * 256, input_shape=(100,)),tf.keras.layers.BatchNormalization(),tf.keras.layers.LeakyReLU(),tf.keras.layers.Reshape((7, 7, 256)),tf.keras.layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same'),tf.keras.layers.BatchNormalization(),tf.keras.layers.LeakyReLU(),tf.keras.layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same'),tf.keras.layers.BatchNormalization(),tf.keras.layers.LeakyReLU(),tf.keras.layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', activation='tanh')
])
# 定义判别器
discriminator = tf.keras.Sequential([tf.keras.layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=(28, 28, 1)),tf.keras.layers.LeakyReLU(),tf.keras.layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'),tf.keras.layers.LeakyReLU(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(1)
])
# 定义Wasserstein损失函数
def wasserstein_loss(y_true, y_pred):return tf.math.reduce_mean(y_true * y_pred)
# 编译模型
discriminator.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.00005), loss=wasserstein_loss,metrics=['accuracy'])
generator.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.00005), loss=wasserstein_loss)
# 训练模型
for epoch in range(100):for i in range(num_batches):noise = tf.random.normal([batch_size, 100])generated_images = generator(noise)real_images = next(iter(train_dataset))[0]x = tf.concat([real_images, generated_images], axis=0)y_dis = tf.concat([tf.ones((batch_size, 1)), tf.ones((batch_size, 1)) * -1], axis=0)discriminator.trainable = Truediscriminator.train_on_batch(x, y_dis)noise = tf.random.normal([batch_size, 100])y_gen = tf.ones((batch_size, 1))discriminator.trainable = Falsegenerator.train_on_batch(noise, y_gen)

在这个例子中定义了一个生成器网络和一个判别器网络。生成器接收一个随机噪声作为输入,输出一张生成的图像。判别器接收一张图像作为输入,输出一个标量值,表示输入图像是真实的还是生成的。我们使用wasserstein_loss作为损失函数,它计算了判别器的预测值和真实标签的乘积的平均值。在训练过程中,我们交替训练判别器和生成器。对于判别器,我们希望它能够正确区分真实图像(标签为1)和生成图像(标签为-1)。对于生成器,我们希望它能够生成更加逼真的图像,使得判别器将其预测为真实图像(标签为1)。通过最小化Wasserstein损失,生成器可以学习到真实图像的分布,生成高质量的图像。

选择合适的损失函数可以帮助模型更好地学习到数据的内在模式,提高任务的性能。同时,损失函数的设计也需要考虑问题的特点和模型的结构,根据实际情况进行进一步的调整和优化。

相关文章:

常用损失函数详解:广泛使用的优化约束方法

各类常用损失函数详解&#xff1a;广泛使用的优化约束方法 今天介绍下损失函数&#xff0c;先介绍下我常用的方法SmoothedL1&#xff0c;它是一个平滑的L1 penalty函数,用于处理约束violation。 标准的L1 penalty函数定义为: L 1 ( x ) { 0 , if x ≤ 0 x , if x > 0 …...

鸿蒙开发组件:【创建DataAbility】

创建DataAbility 实现DataAbility中Insert、Query、Update、Delete接口的业务内容。保证能够满足数据库存储业务的基本需求。BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑&#xff0c;依赖Insert、Query、Update、Delete接口逻辑&#xff0c;来实现数据的批量处理。…...

配电室数据中心巡检3d可视化搭建的详细步骤

要搭建配电室巡检的3D可视化系统&#xff0c;可以按照以下步骤进行&#xff1a; 收集配电室数据&#xff1a; 首先&#xff0c;需要收集配电室的相关数据&#xff0c;包括配电室的布局、设备信息、传感器数据等。可以通过实地调查、测量和设备手册等方式获取数据。 创建3D模型…...

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害&#xff0c;以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1&#xff1a;协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…...

搜维尔科技邀您共赴2024第四届轨道车辆工业设计国际研讨会

会议内容 聚焦“创新、设计、突破”&#xff0c;围绕“面向生命健康、可持续发展的轨道交通系统” 为主题&#xff0c;从数字化、智能化、人性化、绿色发展等方面&#xff0c;探索轨道交通行业的设计新趋势及发展新机遇。 举办时间 2024年7月10日-12日 举办地点 星光岛-青岛融…...

智能中人类造成的风险、机器造成的风险、环境造成的风险

在使用智能技术时&#xff0c;可能会面临各种类型的风险。以下是一些可能的风险情况&#xff1a; 1、人类造成的风险 错误判断和决策&#xff1a;人类在使用智能系统时可能会因为各种原因做出错误的判断和决策&#xff0c;导致不良后果。人为错误&#xff1a;技术操作人员、维护…...

MYSQL基础查询

示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315female23浙江大学Zhejiang55432male25山东大学Shandong 查询所有列 select * from user_profile&#xff1b;查询…...

【Golang】Go 中的生产者-消费者模式

Go 中的生产者-消费者模式 来源:https://medium.com/@mm.nikfarjam/the-producer-consumer-pattern-in-go-cf97299a0320 文章目录 Go 中的生产者-消费者模式介绍关键组件在 Go 中的实现结论Go 中的生产者-消费者模式 介绍 生产者-消费者模式是处理大数据的最常见设计模式之一…...

【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】

汽车的“智慧数字底盘”是一个综合性的技术平台&#xff0c;旨在提升车辆的性能、安全性和驾驶体验。它集成了多种先进的技术和系统&#xff0c;是全能程序员的必杀技&#xff01; 1. 传感器技术 a. 激光雷达&#xff08;LiDAR&#xff09; 用于生成高分辨率的3D地图&#…...

Python网络爬虫4-实战爬取pdf

1.需求背景 爬取松产品中心网站下的家电说明书。这里以冰箱为例&#xff1a;松下电器-冰箱网址 网站分析&#xff1a; 第一步&#xff1a; 点击一个具体的冰箱型号&#xff0c;点击了解更多&#xff0c;会打开此型号电器的详情页面。 第二步&#xff1a;在新打开的详情页面中…...

超神级!Markdown最详细教程,程序员的福音

超神级&#xff01;Markdown最详细教程&#xff0c;程序员的福音Markdown最详细教程&#xff0c;关于Markdown的语法和使用就先讲到这里&#xff0c;如果喜欢&#xff0c;请关注“IT技术馆”。馆长会更新​最实用的技术&#xff01;https://mp.weixin.qq.com/s/fNzhLFyYRd3skG-…...

Android OTA 升级基础知识详解+源码分析

前言&#xff1a; 本文仅仅对OTA升级的几种方式的概念和运用进行总结&#xff0c;仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解&#xff1a; https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…...

【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?

大家好&#xff0c;我是锋哥。今天分享关于 【SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f; SQL 语言包括数据定义(DDL)、…...

Redis的缓存击穿与解决

缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io) 目录 解决方案 互斥锁 实现 逻辑过期 实现 解决方案…...

网络层 IP协议【计算机网络】【协议格式 || 分片 || 网段划分 || 子网掩码】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前提 二&…...

Python学习笔记14:进阶篇(三)。类的终结篇,类的导入和模块的导入。

前言 这篇文章属于类知识的最后一篇&#xff0c;带一点点其他知识&#xff0c;学习内容来自于Python crash course。 关注我私信发送Python crash course&#xff0c;分享一份中文版PDF。 类的导入 在学习的时候&#xff0c;包括之前&#xff0c;我都是在一个文件中把所有代…...

C++ lambda表达式举例

C lambda表达式 Lambda表达式是一种简洁的方式来创建匿名函数&#xff0c;可以直接在函数调用的地方定义&#xff0c;主要用于简化代码。 Lambda表达式的基本语法如下&#xff1a; [capture](parameters) -> return_type {// function body };示例1&#xff1a;基本用法 …...

持续总结中!2024年面试必问 20 道设计模式面试题(五)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道设计模式面试题&#xff08;四&#xff09;-CSDN博客 九、请解释代理模式&#xff08;Proxy Pattern&#xff09;及其类型。 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构设计模式&#xff0c…...

嵌入式面经111题答案汇总(含技术答疑)_嵌入式项目源码分享

111道嵌入式面试题答案汇总专栏链接&#xff08;承诺免费技术答疑&#xff09; --> 《嵌入式/C面试题解析大全》 1、简介 本人是2020年毕业于广东工业大学研究生&#xff1a;许乔丹&#xff0c;有国内大厂CVTE和世界500强企业工作经验&#xff0c;整理超全面111道嵌入式面试…...

鸿蒙开发通信与连接:【@ohos.connectedTag (有源标签)】

有源标签 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import connectedTag from ohos.connectedTag;connectedTag.init init(): boolean 初始化有源标签芯片。 需要权限&#…...

在线编程工具

1.C语言在线编程 https://www.jyshare.com/compile/11/ 2.java在线编程 https://www.w3cschool.cn/tryrun/runcode1?langjava 3.Python在线编程 https://www.python123.io/index/playground/python?ivk_sa1024320u...

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…...

Vue49-props属性

一、当同一个组件标签被使用多次 因为data属性写的是函数形式&#xff01; 二、需求&#xff1a;老王也想用<Student>组件&#xff0c;但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性&#xff0c;接收的这三个参数&#xff0c;是被保存在…...

CVE-2020-1957 漏洞复现

先声明一下&#xff0c;免杀还是会更的&#xff0c;不过中间可能会穿插一下渗透的内容&#xff01;&#xff01;&#xff01; 踩坑点&#xff1a; 在一开始翻阅了CSDN之后&#xff0c;发现不同文章之间存在出入&#xff0c;于是最后去了CVE的官方文档&#xff0c;和参考一些国…...

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w

01 中国电信股份有限公司浙江分公司 &#x1f537;招聘岗位&#xff1a;系统架构师 &#x1f537;岗位职责&#xff1a; 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护&#xff0c;做好相关产数项目的支撑。 2、根据信息安全管理要求&#xff0c;负责客户…...

LLVM后端 td文件 tablegen 模式匹配 寄存器 指令集 calling convention

目录 一、寄存器 1.1 寄存器定义 1.2 寄存器分类 二、指令集 2.1 指令集定义 2.2 模式匹配 2.2.1 PatFrags与PatFrag 2.2.2 OutPatFrag 2.2.3 PatLeaf 2.2.4 ImmLeaf 2.2.5 IntImmLeaf和FPImmLeaf 2.2.6 Pat 2.2.7 ComplexPattern 2.3 指令合法化 2.3.1 Promote…...

嵌入式交叉编译:frp

参考 LINUX FRP下载编译_linux编译frpc-CSDN博客 编译 make -f Makefile.cross-compiles 检查 $ make -f Makefile.cross-compiles Build darwin-amd64... Build darwin-amd64 done Build darwin-arm64... Build darwin-arm64 done Build freebsd-amd64... Build freebsd-…...

SpringBoot实现的大文件上传

前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题&#xff0c;以提高文件传输的效率和稳定性。 首先&#xff0c;大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间&#xff0c;因为较小的文件片段更容易快…...

【Python高级编程】用 Matplotlib 绘制迷人的图表

用 Matplotlib 绘制迷人的图表 引言 Matplotlib 是 Python 中广泛使用的绘图库&#xff0c;用于创建各种图表和可视化。本文将逐步指导您使用 Matplotlib 绘制基本图表&#xff0c;包括折线图、条形图和散点图。 安装 Matplotlib 使用 pip 安装 Matplotlib&#xff1a; pi…...

【UML用户指南】-19-对基本行为建模-用例图

目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程&#xff1a; 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…...

网站制作完成后如何发布/上海全国关键词排名优化

我们可以用画布&#xff08;Canvas&#xff09;绘制各种图形&#xff0c;下面代码是绘制的一个圆形&#xff1a; <!DOCTYPE html> <html><head><title>Canvas画布</title><meta charset"UTF-8"><meta name"viewport&quo…...

秦皇岛市教育考试院网站/如何制作网站链接

ExtJS的使用方法汇总(1)——配置和表格控件使用 分类&#xff1a; .Net方面 Web开发2009-09-09 14:06 11328人阅读 评论(31) 收藏 举报extjsheaderstylesheetdatefunctionserver目录(?)[] ExtJS时一套AJAX控件,本人认为它是目前我见过最好最美的JS控件库&#xff0c;所以非常有…...

青岛网站建设公司怎么样/小程序seo推广技巧

一 原因 1.内存中加载的数据量过于庞大&#xff0c;如一次从数据库取出过多数据&#xff1b; 2.集合类中有对对象的引用&#xff0c;使用完后未清空&#xff0c;使得JVM不能回收&#xff1b; 3.代码中存在死循环或循环产生过多重复的对象实体&#xff1b; 4.使用的第三方软件中…...

网站统计系统 怎么做/360搜索引擎下载

Moved tohttp://blog.tangcs.com/2008/08/13/behavioral-design-patterns/ 转载于:https://www.cnblogs.com/WarrenTang/archive/2008/08/13/1266939.html...

专业建设 验收 网站/千锋教育官方网

行内元素(inline element)&#xff0c;又叫内联元素&#xff0c;内联元素只能容纳文本或者其他内联元素&#xff0c;常见的行内元素<span>,<a>. 块元素(block element),块元素一般都是从新行开始&#xff0c;可以容纳文本&#xff0c;其他内联元素和其它块元素&…...

权威发布型舆情回应以什么为主/seo关键词是什么

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022化工自动化控制仪表题库系化工自动化控制仪表试卷新版教材大纲题库&#xff01;2022年化工自动化控制仪表复训题库及在线模拟考试根据化工自动化控制仪表考试大纲。化工自动化控制仪表考试模拟题通过安全生产模拟…...