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

深度学习基础02_损失函数BP算法(上)

目录

一、损失函数

1、线性回归损失函数

1.MAE损失

2.MSE损失

3.SmoothL1Loss

2、多分类损失函数--CrossEntropyLoss

3、二分类损失函数--BCELoss

4、总结

二、BP算法

1、前向传播

1.输入层(Input Layer)到隐藏层(Hidden Layer)

2.隐藏层(Hidden Layer)到输出层(Output Layer)

2、反向传播

1.原理

2.链式法则 

3.案例

神经元计算

损失计算

参数更新

反向传播写法01

反向传播写法02(更常用)


一、损失函数

1、线性回归损失函数

1.MAE损失

MAE(Mean Absolute Error,平均绝对误差)通常也被称为 L1-Loss,通过对预测值和真实值之间的绝对差取平均值来衡量他们之间的差异。

公式

\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} \left| y_i - \hat{y}_i \right|

特点

  1. 鲁棒性:与均方误差(MSE)相比,MAE对异常值(outliers)更为鲁棒,因为它不会像MSE那样对较大误差平方敏感。

  2. 物理意义直观:MAE以与原始数据相同的单位度量误差,使其易于解释。

应用场景

MAE通常用于需要对误差进行线性度量的情况,尤其是当数据中可能存在异常值时,MAE可以避免对异常值的过度惩罚。

import torch
import torch.nn as nndef test01():"""MAE 平均绝对误差 通常也被称为 L1-Loss预测值和真实值之间的绝对差取平均值"""l1_loss_fn = nn.L1Loss()y_pred = torch.tensor([1,2,3],dtype=torch.float32)y_true = torch.tensor([1.5,2.5,3.5],dtype=torch.float32)loss = l1_loss_fn(y_pred,y_true)print(loss) # tensor(0.5000)
2.MSE损失

MSE(Mean Squared Error,均方误差),平均评分误差通过对预测值和真实值之间的误差平方取平均值,来衡量预测值与真实值之间的差异。

公式

\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left( y_i - \hat{y}_i \right)^2

特点

  1. 平方惩罚:因为误差平方,MSE 对较大误差施加更大惩罚,所以 MSE 对异常值更为敏感。

  2. 凸性:MSE 是一个凸函数,这意味着它具有一个唯一的全局最小值,有助于优化问题的求解。

应用场景

MSE被广泛应用在神经网络中。

def test02():"""MSE 平均平方误差 通常也被称为 L2-Loss测值和真实值之间的误差平方取平均值"""l2_loss_fn = nn.MSELoss()y_pred = torch.tensor([1,2,3],dtype=torch.float32)y_true = torch.tensor([1.5,2.5,3.5],dtype=torch.float32)loss = l2_loss_fn(y_pred,y_true)print(loss) # tensor(0.2500)
3.SmoothL1Loss

SmoothL1Loss可以做到在损失较小时表现为 L2 损失,而在损失较大时表现为 L1 损失。

公式

\text{SmoothL1Loss}(x) = \begin{cases} 0.5 \cdot x^2, & \text{if } |x| < 1 \\ |x| - 0.5, & \text{otherwise} \end{cases}

所有样本的平均损失:\\L=\frac{1}{n} \sum_{i=1}^{n} L_{i} 

特点

  1. 平滑过渡:当误差较小时,损失函数表现为 L2 Loss(平方惩罚);当误差较大时,损失函数逐渐向 L1 Loss过渡。这种平滑过渡既能对大误差有所控制,又不会对异常值过度敏感。

  2. 稳健性:对于异常值更加稳健,同时在小误差范围内提供了较好的优化效果。

应用场景

SmoothL1Loss常用于需要对大误差进行一定控制但又不希望完全忽略小误差的回归任务。特别适用于目标检测任务中的边界框回归,如 Faster R-CNN 等算法中。

def test03():"""SmoothL1Loss 平滑损失函数在损失较小时表现为 L2 损失,而在损失较大时表现为 L1 损失"""# 方式一loss_fn = nn.SmoothL1Loss()# 方式二loss_fn = nn.funtional.smooth_l1_lossy_pred = torch.tensor([1,2,3,6],dtype=torch.float32)y_true = torch.tensor([1.5,2.5,3.5,4.5],dtype=torch.float32)loss = loss_fn(y_pred,y_true)print(loss)

2、多分类损失函数--CrossEntropyLoss

交叉熵损失函数,使用在输出层使用softmax激活函数进行多分类时,一般都采用交叉熵损失函数。

公式

\text{CrossEntropyLoss}(y, \hat{y}) = - \sum_{i=1}^{C} y_i \log(\hat{y}_i)

其中,样本的实际标签 y 和模型预测的概率分布\hat{y}_i​, y 是one-hot编码形式,表示真实类别 ,\hat{y}_i 表示第 i 类的概率估计值(经过 softmax 后的概率分布) 。

*one-hot 编码

假设我们有一个三分类问题,三个可能的类别分别是0、1和2。如果某个样本的真实标签是1,那么它的one-hot编码就是 [0,1,0]。这意味着:

  • 第一个位置(索引0)是0,表示该样本不属于类别0。
  • 第二个位置(索引1)是1,表示该样本属于类别1。
  • 第三个位置(索引2)是0,表示该样本不属于类别2。

特点

Softmax 直白来说就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节点,作为我们的预测目标类别

def test04():"""CrossEntropyLoss 交叉熵损失函数使用在输出层使用softmax激活函数进行多分类"""# 初始化criterion = nn.CrossEntropyLoss()# 设有三个类别,模型输出是未经softmax的logitsone_hot = torch.tensor([[1.5, 2.0, 0.5], [0.5, 1.0, 1.5]]) # 两个输出loss = criterion(one_hot, labels) # (L1+L2)/2print(loss.item()) # 0.6422001123428345

3、二分类损失函数--BCELoss

二分类交叉熵损失函数,使用在输出层使用sigmoid激活函数进行二分类时。对于二分类问题,CrossEntropyLoss 的简化版本称为二元交叉熵(Binary Cross-Entropy Loss)

公式

\text{BinaryCrossEntropy}(y, \hat{y}) = - \left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right]

 log的底数一般默认为e,y是真实类别目标,根据公式可知L是一个分段函数 :

  • y=1时,L = -log(sigmoid 激活值)
  • y=0时,L = -log(1-sigmoid 激活值)
def test05():"""BCELoss 二分类交叉熵损失函数使用在输出层使用sigmoid激活函数进行二分类时"""# y 是模型的输出,已经被sigmoid处理过,确保其值域在(0,1)y = torch.tensor([[0.7], [0.2], [0.9], [0.7]])# targets 是真实的标签,0或1t = torch.tensor([[1], [0], [1], [0]], dtype=torch.float)# 方式一bce_loss_fn = nn.BCELoss()loss = bce_loss_fn(y,t)# 方式二loss = nn.functional.binary_cross_entropy(y,t)print(loss)

4、总结

以上损失函数是一个样本的损失值,总样本的损失值是求损失均值即可。

  • 当输出层使用softmax多分类时,使用交叉熵损失函数;

  • 当输出层使用sigmoid二分类时,使用二分类交叉熵损失函数, 比如在逻辑回归中使用;

  • 当功能为线性回归时,使用smooth L1损失函数或均方差损失-L2 loss;

二、BP算法

多层神经网络的学习能力比单层网络强得多。想要训练多层网络,需要更强大的学习算法。误差反向传播算法(Back Propagation)是其中最杰出的代表,它是目前最成功的神经网络学习算法。

现实任务使用神经网络时,大多是在使用 BP 算法进行训练,值得指出的是 BP 算法不仅可用于多层前馈神经网络,还可以用于其他类型的神经网络。

通常说 BP 网络时,一般是指用 BP 算法训练的多层前馈神经网络。

误差反向传播算法(BP)的基本步骤 

  1. 前向传播:正向计算得到预测值。

  2. 计算损失:通过损失函数 L(y{\text{pred}}, y{\text{true}})  计算预测值和真实值的差距。

  3. 梯度计算:反向传播的核心是计算损失函数 L 对每个权重和偏置的梯度。

  4. 更新参数:一旦得到每层梯度,就可以使用梯度下降算法来更新每层的权重和偏置,使得损失逐渐减小。

  5. 迭代训练:将前向传播、梯度计算、参数更新的步骤重复多次,直到损失函数收敛或达到预定的停止条件。

1、前向传播

前向传播(Forward Propagation)把输入数据经过各层神经元的运算并逐层向前传输,一直到输出层为止。

 一个简单的三层神经网络(输入层、隐藏层、输出层)前向传播的基本步骤分析:

1.输入层(Input Layer)到隐藏层(Hidden Layer)

给定输入 x 和权重矩阵 W 及偏置向量 b,隐藏层的输出(激活值)计算如下:

z^{(1)} = W_1 \cdot x + b_1

将z通过激活函数激活:

a^{(1)} = \sigma(z^{(1)})

2.隐藏层(Hidden Layer)到输出层(Output Layer)

隐藏层的输出a^{(1)}经过输出层的权重矩阵 W 和偏置 b 生成最终输出:

z^{(2)} = W_2 \cdot a^{(1)} + b_2

z通过输出层的激活函数激活后就是最终预测结果:

y_{\text{pred}} = a^{(2)} = \sigma(z^{(2)})

前向传播的主要作用

  1. 计算神经网络的输出结果,用于预测或计算损失。

  2. 在反向传播中使用,通过计算损失函数相对于每个参数的梯度来优化网络。

2、反向传播

反向传播(Back Propagation,简称BP)通过计算损失函数相对于每个参数的梯度来调整权重,使模型在训练数据上的表现逐渐优化。

反向传播结合了链式求导法则和梯度下降算法,是神经网络模型训练过程中更新参数的关键步骤。

1.原理

利用链式求导法则对每一层进行求导,直到求出输入层x的导数,然后利用导数值进行梯度更新。

2.链式法则 

链式求导法则(Chain Rule)是微积分中的一个重要法则,用于求复合函数的导数。在深度学习中,链式法则是反向传播算法的基础,这样就可以通过分层的计算求得损失函数相对于每个参数的梯度,以下面函数为例:

\mathrm{f(x)=\frac{1}{1+e^{-(wx+b)}}}

\begin{aligned} \frac{\partial f(x;w,b)}{\partial w}|_{x=1,w=0,b=0}& =\frac{\partial f(x;w,b)}{\partial h_6}\frac{\partial h_6}{\partial h_5}\frac{\partial h_5}{\partial h_4}\frac{\partial h_4}{\partial h_3}\frac{\partial h_3}{\partial h_2}\frac{\partial h_2}{\partial h_1}\frac{\partial h_1}{\partial w} \\ &=1\times-0.25\times1\times1\times-1\times1\times1 \\ &=0.25 \end{aligned}

import torchdef test01():"""链式求导"""x = torch.tensor(1.0)w = torch.tensor(0.0,required_grad=True)b = torch.tensor(0.0,required_grad=True)fx = torch.sigmoid(w*x + b)fx.backward() # fx对w求导print(w.grad) # tensor(0.2500)print(b.grad) # tensor(0.2500)if __name__ == '__main__':test01()
3.案例

神经元计算

输入层到隐藏层:

\mathrm{h}_{1}=\mathrm{w}_{1}*\mathrm{i}_{1}+\mathrm{w}_{2}*\mathrm{i}_{2}+\mathrm{b}_{1}\quad =0.15 * 0.05 + 0.20 * 0.10 + 0.35 =0.3775 \\ k_{1}=sigmoid(h1)=sigmoid(0.3775)=0.5933

同理 h2=0.3925, k2=0.5969

隐藏层到输出层:

\mathrm{o}_{1}=\mathrm{w}_{5}*\mathrm{k}_{1}+\mathrm{w}_{6}*\mathrm{k}_{2}+\mathrm{b}_{2}\quad =0.40 * 0.5933 + 0.45 * 0.5969 + 0.60 =1.1059 \\ m_{1}=sigmoid(o1)=sigmoid(1.1059)=0.7514

同理 o2=1.2249, m2 =0.7729

所以,最终的预测结果分别为: 0.7514、0.7729

损失计算

预测值和真实值(target)进行比较计算损失:

MSELoss = \frac{1}{2}((\mathrm{m}_{1}\mathrm{-target}_{1})^{2}+((\mathrm{m}_{2}\mathrm{-target}_{2})^{2}) \\ = \frac{1}{2}((0.7514-0.01)^{2}+((0.7729-0.99)^{2}) =0.2984

import torch"""手动计算代码过程"""
i1 = 0.05
i2 = 0.10b1 = 0.35
b2 = 0.60def h1():w1 = 0.15w2 = 0.20l1 = i1 * w1 + i2 * w2 + b1l1 = torch.tensor(l1)return torch.sigmoid(l1) # 1/(1+torch.e**(-l1))
print(f'h1:{h1()}') # 0.5933def h2():w3 = 0.25w4 = 0.30l2 = i1 * w3 + i2 * w4 + b1l2 = torch.tensor(l2)return torch.sigmoid(l2) # 1/(1+torch.e**(-l2))
print(f'h2:{h2()}') # 0.5969def o1():w5 = 0.40w6 = 0.45l3 = h1() * w5 + h2() * w6 + b2l3 = torch.tensor(l3)m1 = torch.sigmoid(l3) # 1/(1+torch.e**(-l3))return m1
print(f'o1:{o1()}') # 0.7514def o2():w7 = 0.50w8 = 0.55l4 = h1() * w7 + h2() * w8 + b2l4 = torch.tensor(l4)m2 = torch.sigmoid(l4) # 1/(1+torch.e**(-l4))return m2
print(f'o2:{o2()}') # 0.7729# 手动反向传播
def mse():o1_target = 0.01o2_target = 0.99return 0.5*((o1() - 0.01)**2 + (o2() - 0.99)**2)loss = mse()

 梯度计算

使用链式法则计算w1,w5,w7梯度:

\begin{aligned} \frac{\partial\mathrm{L}}{\partial\mathrm{w}_{5}}& =\frac{\partial\mathrm{L}}{\partial\mathrm{m}_{1}}*\frac{\partial\mathrm{m}_{1}}{\partial\mathrm{o}_{1}}*\frac{\partial\mathrm{o}_{1}}{\partial\mathrm{w}_{5}} \\ &=(\mathrm{m}_{1}-\mathrm{target}_{1})*\mathrm{sigmoid}(\mathrm{o}_{1})*\left(1-\mathrm{sigmoid}(\mathrm{o}_{1})\right)*\mathrm{k}_{1} \\ &=(0.7514-0.01)*sigmoid(1.1059)*\left(1-sigmoid(1.1059)\right)*0.5933 \\ &=0.0822 \end{aligned}

 \begin{aligned} \frac{\partial\mathrm{L}}{\partial\mathrm{w}_7}& =\frac{\partial\mathrm{L}}{\partial\mathrm{m}_2}*\frac{\partial\mathrm{m}_2}{\partial\mathrm{o}_2}*\frac{\partial\mathrm{o}_2}{\partial\mathrm{w}_7} \\ &=(\mathrm{m}_{2}-\mathrm{target}_{2})*\mathrm{sigmoid}(\mathrm{o}_{2})*\left(1-\mathrm{sigmoid}(\mathrm{o}_{2})\right)*\mathrm{k}_{1} \\ &=(0.7729-0.99)*sigmoid(1.2249)*\left(1-sigmoid(1.2249)\right)*0.5933 \\ &=-0.0226 \end{aligned}

 

import torch"""反向传播api手动实现"""
def train():# 前向传播# x1 x2i=torch.tensor([[0.05,0.1]])model1=torch.nn.Linear(2,2)# w1 w2 w3 w4model1.weight.data=torch.tensor([[0.15,0.20],[0.25,0.30]])# b1model1.bias.data=torch.tensor([0.35,0.35])l1_l2=model1(i)h1_h2=torch.sigmoid(l1_l2)model2=torch.nn.Linear(2,2)# w5 w6 w7 w8model2.weight.data=torch.tensor([[0.40,0.45],[0.50,0.55]])# b2model2.bias.data=torch.tensor([0.60,0.60])l3_l4=model2(h1_h2)o1_o2=torch.sigmoid(l3_l4)# 误差计算o1_o2_true=torch.tensor([[0.01,0.99]])loss=torch.sum((o1_o2 - o1_o2_true) ** 2) / 2# mse=torch.nn.MSELoss()# loss=mse(o1_o2,o1_o2_true)# 反向传播loss.backward()print(model1.weight.grad)print(model2.weight.grad)train()
参数更新

现在就可以进行权重更新了:假设学习率是0.5:

w_5=0.40-0.5*0.0822=0.3589 \\ w_7=0.50+0.5*0.0226=0.5113 \\ w_1=0.15-0.5*0.0004=0.1498

整合一下,完整的反向传播写法:

反向传播代码写法01
import torch
import torch.nn as nn
import torch.optim as optimclass MyNet(nn.Module):def __init__(self):super(MyNet, self).__init__()# 定义网络结构self.linear1 = nn.Linear(2, 2)self.linear2 = nn.Linear(2, 2)self.activation = torch.sigmoid# 网络参数初始化# 隐藏层权重self.linear1.weight.data = torch.tensor([[0.15, 0.20], [0.25, 0.30]])# 输出层权重self.linear2.weight.data = torch.tensor([[0.40, 0.45], [0.50, 0.55]])# 隐藏层偏置self.linear1.bias.data = torch.tensor([0.35, 0.35])# 输出层偏置self.linear2.bias.data = torch.tensor([0.60, 0.60])def forward(self, x):x = self.linear1(x)x = self.activation(x)x = self.linear2(x)x = self.activation(x)return xdef train():net = MyNet()# 优化方法optimizer = optim.SGD(net.parameters(), lr=0.1)inputs = torch.tensor([[0.05, 0.10]])target = torch.tensor([[0.01, 0.99]])# 获得网络输出值pred = net(inputs) # module父类已实现前向传播mes = torch.nn.MSELoss()# 计算误差loss = mes(pred, target)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 打印(w1-w8)观察w5、w7、w1 的梯度值是否与手动计算一致print(net.linear1.weight.grad.data)print(net.linear2.weight.grad.data)#更新梯度optimizer.step()# 打印更新后的网络参数# print(net.state_dict())train()
反向传播代码写法02(更常用)
import torch
import torch.nn as nn
import torch.optim as optimclass MyNet(nn.Module):def __init__(self):super(MyNet, self).__init__()# 定义网络结构# self.linear1 = nn.Linear(2, 2)# self.linear2 = nn.Linear(2, 2)# self.activation = torch.sigmoidself.hide1 = torch.nn.Sequential(nn.Linear(2, 2),torch.nn.Sigmoid())self.out = torch.nn.Sequential(nn.Linear(2, 2),torch.nn.Sigmoid())# 网络参数初始化 线性层# # 隐藏层权重# self.linear1.weight.data = torch.tensor([[0.15, 0.20], [0.25, 0.30]])# # 输出层权重# self.linear2.weight.data = torch.tensor([[0.40, 0.45], [0.50, 0.55]])# # 隐藏层偏置# self.linear1.bias.data = torch.tensor([0.35, 0.35])# # 输出层偏置# self.linear2.bias.data = torch.tensor([0.60, 0.60])self.hide1[0].weight.data = torch.tensor([[0.15, 0.20], [0.25, 0.30]])self.out[0].weight.data = torch.tensor([[0.40, 0.45], [0.50, 0.55]])self.hide1[0].bias.data = torch.tensor([0.35, 0.35])self.out[0].bias.data = torch.tensor([0.60, 0.60])def forward(self, x):# x = self.linear1(x)# x = self.activation(x)# x = self.linear2(x)# x = self.activation(x)x = self.hide1(x)x = self.out(x)return xdef train():net = MyNet()# 优化方法optimizer = optim.SGD(net.parameters(), lr=0.1)inputs = torch.tensor([[0.05, 0.10]])target = torch.tensor([[0.01, 0.99]])# 获得网络输出值pred = net(inputs) # module父类已实现前向传播mes = torch.nn.MSELoss()# 计算误差loss = mes(pred, target)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 打印(w1-w8)观察w5、w7、w1 的梯度值是否与手动计算一致print(net.hide1[0].weight.grad.data) # 0:线性层 1:激活函数print(net.out[0].weight.grad.data) # 0:线性层 1:激活函数#更新梯度optimizer.step()# 打印更新后的网络参数# print(net.state_dict())train()

相关文章:

深度学习基础02_损失函数BP算法(上)

目录 一、损失函数 1、线性回归损失函数 1.MAE损失 2.MSE损失 3.SmoothL1Loss 2、多分类损失函数--CrossEntropyLoss 3、二分类损失函数--BCELoss 4、总结 二、BP算法 1、前向传播 1.输入层(Input Layer)到隐藏层(Hidden Layer) 2.隐藏层(Hidden Layer)到输出层(Ou…...

6.584-Lab4A

6.584-LabA HomeworkReference CodeReference Blog 通过作业提供的概览图可以看出整个系统的组成&#xff1a;用户 Clerk 会发出命令&#xff08;Get、Put、Append&#xff09;到每个 Service&#xff0c;每个 Service 接收到命令后向下传递到 RaftCode 层&#xff0c;由 RaftC…...

语义版本控制

注意&#xff1a; 本文内容于 2024-11-27 22:25:05 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;语义版本控制。感谢您的关注与支持&#xff01; 由于自己平时喜欢写点小玩意&#xff0c;自然而…...

深入理解HTML基本结构:构建现代网页的基石

深入理解HTML基本结构&#xff1a;构建现代网页的基石 在数字时代&#xff0c;HTML&#xff08;超文本标记语言&#xff09;是构建和设计网页的基础。了解HTML的基本结构对于任何希望掌握网页开发的人来说至关重要。本文将详细介绍HTML文件的基本骨架&#xff0c;包括其核心标…...

一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单

近日&#xff0c;由 FreeBuf 主办的 FCIS 2024 网络安全创新大会在上海隆重举行。大会现场揭晓了第十届 WitAwards 中国网络安全行业年度评选获奖名单&#xff0c;该评选自 2015 年举办以来一直饱受赞誉&#xff0c;备受关注&#xff0c;评选旨在以最专业的角度和最公正的态度&…...

【机器学习】机器学习的基本分类-监督学习(Supervised Learning)

监督学习是一种通过已有的输入数据&#xff08;特征&#xff09;和目标输出&#xff08;标签&#xff09;对模型进行训练的机器学习方法&#xff0c;旨在学到一个函数&#xff0c;将输入映射到正确的输出。 1. 监督学习概述 监督学习需要&#xff1a; 输入数据&#xff08;特…...

Oracle之提高PLSQL的执行性能

目录 1、SQL解析详解 2、演示示例 3、启用Oracle跟踪事件 4、查看改造后SQL性能对比结果 更多技术干货,关注个人博客吧 1、SQL解析详解 SQL解析是数据块处理SQL语句不可缺少的步骤,是在解析器中执行的。将SQL转换成数据库可以执行的低级指令。 SQL解析分为硬解析和软…...

[VSCode] vscode下载安装及安装中文插件详解(附下载文件)

前言 vscode 链接&#xff1a;https://pan.quark.cn/s/3acbb8aed758 提取码&#xff1a;dSyt VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 …...

PHP中类名加双冒号的作用

在 PHP 中&#xff0c;类名加双冒号&#xff08;::&#xff09; 是一种用于访问类的静态成员和常量的语法。它也可以用来调用类的静态方法和访问 PHP 的类相关关键词&#xff08;如 parent、self 和 static&#xff09;。以下是详细的解释和用法。 1. 用途概述 :: 被称为作用域…...

前端编程训练 异步编程篇 请求接口 vue与react中的异步

文章目录 前言代码执行顺序的几个关键点接口请求vue与react中的异步vue中的异步react的state修改异步 前言 本文是B站三十的前端课的笔记前端编程训练,异步编程篇 代码执行顺序的几个关键点 我们可以理解为代码就是一行一行&#xff0c;一句一句是执行&#xff08;定义变量&…...

【kafka03】消息队列与微服务之Kafka 读写数据

Kafka 读写数据 参考文档 Apache Kafka 常见命令 kafka-topics.sh #消息的管理命令 kafka-console-producer.sh #生产者的模拟命令 kafka-console-consumer.sh #消费者的模拟命令 创建 Topic 创建topic名为 chen&#xff0c;partitions(分区)为3&#xff0…...

【分布式系统】唯一性ID的实现

1、UUID&#xff08;通用唯一标识符&#xff09; 1、UUID本身 一种用于标识信息的标准化方法。一个128位的数字&#xff0c;常表示为32个十六进制数字&#xff0c;以连字符分隔成五组&#xff1a;8-4-4-4-12。 版本&#xff1a; UUID有不同的版本&#xff0c;最常见的是基于时…...

哪里能找到好用的动物视频素材 优质网站推荐

想让你的短视频增添些活泼生动的动物元素&#xff1f;无论是搞笑的宠物瞬间&#xff0c;还是野外猛兽的雄姿&#xff0c;这些素材都能让视频更具吸引力。今天就为大家推荐几个超实用的动物视频素材网站&#xff0c;不论你是短视频新手还是老手&#xff0c;都能在这些网站找到心…...

SRAM芯片数据采集解决方案

SRAM芯片数据采集解决方案致力于提供一种高效、稳定且易于操作的方法&#xff0c;以确保从静态随机存取存储器SRAM芯片中准确无误地获取数据。 这种解决方案通常包括硬件接口和软件工具&#xff0c;它们协同工作&#xff0c;以实现对SRAM芯片的无缝访问和数据传输。 在硬件方…...

【贪心算法第七弹——674.最长连续递增序列(easy)】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码分析 1.题目解析 题目来源 674.最长递增子序列——力扣 测试用例 2.算法原理 贪心思路 3.实战代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();in…...

[AI] 知之AI推出3D智能宠物:助力语言学习与口语提升的新选择

Hello! 知之AI官网 [AI] 知之AI推出3D智能宠物&#xff1a;助力语言学习与口语提升的新选择 随着人工智能技术的飞速发展&#xff0c;虚拟助手和智能设备不断进入我们的生活。近日&#xff0c;知之AI重磅推出了一款创新产品——3D智能宠物。这一产品不仅具备多国语言交流能力&…...

Android 14之HIDL转AIDL通信

Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依…...

【R库包安装】R库包安装总结:conda、CRAN等

【R库包安装】R studio 安装rgdal库/BPST库 R studio 安装rgdal库解决方法 R studio 安装BPST库&#xff08;github&#xff09;解决方法方法1&#xff1a;使用devtools安装方法2&#xff1a;下载安装包直接在Rstudio中安装 参考 基础 R 库包的安装可参见另一博客-【R库包安装】…...

学习PMC要不要去培训班?

在当今快速变化的商业环境中&#xff0c;PMC作为供应链管理的核心环节之一&#xff0c;其重要性日益凸显。PMC不仅关乎产品的物料计划、采购、库存控制及物流协调&#xff0c;还直接影响到企业的生产效率、成本控制以及市场竞争力。面对这一专业领域的学习需求&#xff0c;许多…...

前端 用js封装部分数据结构

文章目录 Stack队列链表Setset 用来数组去重set用来取两个数组的并集set用来取两个数组的交集set用来取两个数组的差集 字典 Stack 栈&#xff0c;先进后出&#xff0c;后进先出。用数组来进行模拟&#xff0c;通过push存入&#xff0c;通过pop取出。 class Stack {// 带#表示…...

cocoscreator-doc-TS:目录

cocoscreator-doc-TS-脚本开发-访问节点和组件-CSDN博客 cocoscreator-doc-TS-常用节点和组件接口-CSDN博客 cocoscreator-doc-TS-脚本开发-创建和销毁节点-CSDN博客 cocoscreator-doc-TS-脚本开发-加载和切换场景-CSDN博客 cocoscreator-doc-TS-脚本开发-获取和设置资源-CS…...

理解Java集合的基本用法—Collection:List、Set 和 Queue,Map

本博文部分参考 博客 &#xff0c;强烈推荐这篇博客&#xff0c;写得超级全面&#xff01;&#xff01;&#xff01; 图片来源 Java 集合框架 主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集合&#xff08;单列…...

IOC容器实现分层解耦

文章开始之前&#xff0c;先引入软件开发的两个名词&#xff1a;耦合和内聚。耦合是指&#xff1a;衡量软件中各个层&#xff08;三层架构&#xff09;/各个模块的依赖关联程度&#xff1b;内聚是指&#xff1a;软件中各个功能模块内部的功能联系。三层架构中Controller、Servi…...

Flutter 共性元素动画

在 Flutter 中&#xff0c;共性元素动画&#xff08;Shared Element Transitions&#xff09;用于在页面导航或组件切换时创建视觉上更流畅和连贯的动画效果。这种动画可以使用户感受到两个界面之间的“物理联系”&#xff0c;比如图片从缩略图到全屏的扩大效果。 前置知识点整…...

K8s内存溢出问题剖析:排查与解决方案

文章目录 一、背景二、排查方案&#xff1a;1. 可能是数据量超出了限制的大小&#xff0c;检查数据目录大小2. 查看是否是内存溢出2.1 排查数据量&#xff08;查看数据目录大小是否超过limit限制&#xff09;2.2 查看pod详情发现问题 三、解决过程 一、背景 做redis压测过程中…...

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…...

使用 pycharm 新建使用 conda 虚拟 python 环境的工程

1. conda 常见命令复习&#xff1a; conda env list // 查看 conda 环境列表 conda activate xxxenv // 进入指定 conda 环境2. 环境展示&#xff1a; 2.1. 我的物理环境的 Python 版本为 3.10.9&#xff1a; 2.2. 我的 conda 虚拟环境 env_yolov9_python_3_8 中的 pyth…...

Docker的save和export命令的区别,load和import的区别 笔记241124

Docker的save和export命令的区别,load和import的区别 解说1: Docker的save和export命令&#xff0c;以及load和import命令&#xff0c;在功能和使用场景上存在显著的区别。以下是对这两组命令的详细对比和解释&#xff1a; Docker save和export命令的区别 使用方式和目的&am…...

通俗理解人工智能、机器学习和深度学习的关系

最近几年人工智能成为极其热门的概念和话题&#xff0c;可以说彻底出圈了。但人工智能的概念在1955年就提出来了&#xff0c;可以说非常古老。我在上小学的时候《科学》课本上就有人工智能的概念介绍&#xff0c;至今还有印象&#xff0c;但那些年AI正处于“寒冬”&#xff0c;…...

使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程

有时候我们发现一个好玩的 demo&#xff0c;想赶快在电脑上 pip install 一下跑起来&#xff0c;发现因为 python 的 venv、conda 环境还挺费劲的&#xff0c;因为随着时间的发展&#xff0c;之前记得很清楚的 venv、conda 的用法&#xff0c;不经常使用&#xff0c;半天跑不起…...

网站 只做程序/百度推荐现在为什么不能用了

使用Python可以很容易地创建一个AI。首先&#xff0c;您需要了解Python的基本编程概念&#xff0c;这可以通过编写简单的程序&#xff0c;如计算器&#xff0c;来实现。其次&#xff0c;您需要学习如何使用Python的机器学习库&#xff0c;例如scikit-learn和TensorFlow&#xf…...

hexo建设网站/b站好看的纪录片免费

转载&#xff0c;原文https://blog.csdn.net/mieleizhi0522/article/details/82142856 首先&#xff0c;如果你还没有对yield有个初步分认识&#xff0c;那么你先把yield看做“return”&#xff0c;这个是直观的&#xff0c;它首先是个return&#xff0c;普通的return是什么意…...

吴江建设网站/产品推广平台排行榜

我们这次实现的命令行计算器&#xff0c;支持加减乘除、括号、浮点数、负数&#xff0c;以及查看历史和退出功能。 主要的思路&#xff1a;read - parse - print - loop。 read 阶段是指读取用户在提示符(cal> )之后输入的字符串。 parse 阶段包括&#xff1a;将用户输入…...

参考消息官方网站/软文广告营销

一、A a(1) 栈中分配&#xff0c;隐式调用&#xff0c;栈中内存的分配和释放是由系统管理 二、A b A(1) 栈中分配&#xff0c;显式调用 三、A* c new A(1) 堆中分配&#xff0c;堆中内存的分配和释放必须由程序员手动释放。采用第三种方式时&#xff0c;必须注意一下几点问…...

动态网站开发服务器端脚本语言/网络营销策划方案ppt模板

代码有参考CSDN上某位前辈的&#xff0c;但是我忘记是哪一个来着了…如果有人发现侵权&#xff0c;请联系我删除。 直接上代码了&#xff0c;里面有注释。 头文件及替换 #include<stdio.h> #include<string.h> #include<windows.h> #include<conio.h>…...

南京专业做网站的公司有哪些/免费做推广的网站

相等运算符&#xff1a; 使用相等运算符来比较两个值是否相等&#xff0c;相等返回true&#xff0c;否则返回false。 1、对于简单类型来说&#xff0c;如数字、布尔值、字符串&#xff0c;比较的是两者的值是否相等。 11  // true 21  // false truetrue  // true truefa…...