深度学习基础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,通过对预测值和真实值之间的绝对差取平均值来衡量他们之间的差异。
公式
特点
-
鲁棒性:与均方误差(MSE)相比,MAE对异常值(outliers)更为鲁棒,因为它不会像MSE那样对较大误差平方敏感。
-
物理意义直观: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,均方误差),平均评分误差通过对预测值和真实值之间的误差平方取平均值,来衡量预测值与真实值之间的差异。
公式
特点
-
平方惩罚:因为误差平方,MSE 对较大误差施加更大惩罚,所以 MSE 对异常值更为敏感。
-
凸性: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 损失。
公式
所有样本的平均损失:
特点
-
平滑过渡:当误差较小时,损失函数表现为 L2 Loss(平方惩罚);当误差较大时,损失函数逐渐向 L1 Loss过渡。这种平滑过渡既能对大误差有所控制,又不会对异常值过度敏感。
-
稳健性:对于异常值更加稳健,同时在小误差范围内提供了较好的优化效果。
应用场景
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激活函数进行多分类时,一般都采用交叉熵损失函数。
公式
其中,样本的实际标签 y 和模型预测的概率分布, y 是one-hot编码形式,表示真实类别 ,
表示第 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)
公式
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)的基本步骤
-
前向传播:正向计算得到预测值。
-
计算损失:通过损失函数
计算预测值和真实值的差距。
-
梯度计算:反向传播的核心是计算损失函数 L 对每个权重和偏置的梯度。
-
更新参数:一旦得到每层梯度,就可以使用梯度下降算法来更新每层的权重和偏置,使得损失逐渐减小。
-
迭代训练:将前向传播、梯度计算、参数更新的步骤重复多次,直到损失函数收敛或达到预定的停止条件。
1、前向传播
前向传播(Forward Propagation)把输入数据经过各层神经元的运算并逐层向前传输,一直到输出层为止。
一个简单的三层神经网络(输入层、隐藏层、输出层)前向传播的基本步骤分析:
1.输入层(Input Layer)到隐藏层(Hidden Layer)
给定输入 x 和权重矩阵 W 及偏置向量 b,隐藏层的输出(激活值)计算如下:
将z通过激活函数激活:
2.隐藏层(Hidden Layer)到输出层(Output Layer)
隐藏层的输出经过输出层的权重矩阵 W 和偏置 b 生成最终输出:
z通过输出层的激活函数激活后就是最终预测结果:
前向传播的主要作用
计算神经网络的输出结果,用于预测或计算损失。
在反向传播中使用,通过计算损失函数相对于每个参数的梯度来优化网络。
2、反向传播
反向传播(Back Propagation,简称BP)通过计算损失函数相对于每个参数的梯度来调整权重,使模型在训练数据上的表现逐渐优化。
反向传播结合了链式求导法则和梯度下降算法,是神经网络模型训练过程中更新参数的关键步骤。
1.原理
利用链式求导法则对每一层进行求导,直到求出输入层x的导数,然后利用导数值进行梯度更新。
2.链式法则
链式求导法则(Chain Rule)是微积分中的一个重要法则,用于求复合函数的导数。在深度学习中,链式法则是反向传播算法的基础,这样就可以通过分层的计算求得损失函数相对于每个参数的梯度,以下面函数为例:
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.案例
神经元计算
输入层到隐藏层:
同理 h2=0.3925, k2=0.5969
隐藏层到输出层:
同理 o2=1.2249, m2 =0.7729
所以,最终的预测结果分别为: 0.7514、0.7729
损失计算
预测值和真实值(target)进行比较计算损失:
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梯度:
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:
整合一下,完整的反向传播写法:
反向传播代码写法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…...
Flutter:列表分页,上拉加载下拉刷新,在GetBuilder模板使用方式
GetBuilder模板使用方式参考上一节 本篇主要代码记录如何使用上拉加载下拉刷新, 接口请求和商品组件的代码不包括在内 pubspec.yaml装包 cupertino_icons: ^1.0.8# 分页 上拉加载,下拉刷新pull_to_refresh_flutter3: 2.0.2商品列表:controlle…...
使用eclipse构建SpringBoot项目
我这里用eclipse2018版本做演示,大家有需要的可以下载Eclipse Downloads | The Eclipse Foundation 1.打开eclipse,选择存放代码的位置 2.选择 file >> new >> project >> 选择springboot文件下的 spring starter project 2.这里选择N…...
Linux系统存储挂载与管理:从基础到高级
标题:Linux系统存储挂载与管理:从基础到高级 摘要 在Linux系统中,合理的存储管理和分配对于系统的性能、稳定性和资源利用至关重要。本文将详细介绍存储挂载的基本概念、如何进行存储分配和管理,并解释系统盘的作用。通过这些内…...
Flutter 权限申请
这篇文章是基于permission_handler 10.2.0版本写的 前言 在App开发过程中我们经常要用到各种权限,我是用的是permission_handler包来实现权限控制的。 pub地址:https://pub.dev/packages/permission_handler permission_handler 权限列表 变量 Androi…...
Linux之信号的产生,保存,捕捉
Linux之信号的产生,保存,捕捉处理 一.信号的概念1.1概念1.2分类 二.信号的产生2.1通过键盘产生的信号2.2系统调用接口产生的信号2.3硬件异常产生的信号2.4软件条件产生的信号 三.信号的保存四.信号的捕捉五.信号的其他杂碎知识5.1可重入函数5.2volatile关…...
基于AutoEncode自编码器的端到端无线通信系统matlab误码率仿真
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 自编码器是…...
泛化调用 :在没有接口的情况下进行RPC调用
什么是泛化调用? 在RPC调用的过程中,调用端向服务端发起请求,首先要通过动态代理,动态代理可以屏蔽RPC处理流程,使得发起远程调用就像调用本地一样。 RPC调用本质:调用端向服务端发送一条请求消息&#x…...
2025年人工智能,自动化与机械工程国际学术会议(AIAME2025)
早鸟通道开启: 2025年人工智能,自动化与机械工程国际学术会议(AIAME2025) 2025 International Conference on Artificial Intelligence, Automation, and Mechanical Engineering 【重要日期】 早鸟征稿截止日期:…...
docker compose 快速搭建Nacos单节点测试环境(mysql 版)
〓 参考: https://nacos.io/docs/latest/quickstart/quick-start-docker/?sourcewuyi https://github.com/nacos-group/nacos-docker https://nacos.io/docs/latest/manual/admin/deployment/deployment-standalone/?sourcewuyi https://nacos.io/docs/latest/man…...
数字3D虚拟展厅成熟运用于旅游业
在数字空间展览会与VR3D虚拟企业展厅设计的兴起中,我们迎来了互联网、物联网与3D技术融合的大时代。这些企业虚拟展厅主要依托互联网作为传播媒介,利用图片、文字和Flash动画等形式,生动展现企业的核心产品。作为一种新型的网络信息技术展厅&…...
模数转换芯片AD9215
AD9215 是 Analog Devices 公司推出的一款高性能、低功耗、单通道 10 位模数转换器(ADC)。它具有采样速率高达 65 MSPS 或 105 MSPS(不同型号),并广泛应用于通信、成像和仪器仪表等领域。 AD9215 的关键特性 分辨率: 10 位,适合高精度应用。采样速率: 两种型号: AD921…...
MongoDB注入攻击测试与防御技术深度解析
MongoDB注入攻击测试与防御技术深度解析 随着NoSQL数据库的兴起,MongoDB作为其中的佼佼者,因其灵活的数据模型和强大的查询能力,受到了众多开发者的青睐。然而,与任何技术一样,MongoDB也面临着安全威胁,其…...
总结贴:Servlet过滤器、MVC拦截器
一:Servlet过滤器 1.1解析 Filter 即为过滤,用于请求到达Servlet之前(Request),以及再Servlet方法执行完之后返回客户端进行后处理(HttpServletResponse)。简单说就是对请求进行预处理,对响应进行后处理 在请求到达Servlet之前,可以经过多个Filt…...
鸿蒙开发-在ArkTS中制作音乐播放器
音频播放功能实现 导入音频播放相关模块 首先需要从ohos.multimedia.audio模块中导入必要的类和接口用于音频播放。例如: import audio from ohos.multimedia.audio;创建音频播放器实例并设置播放源 可以通过audio.createAudioPlayer()方法创建一个音频播放器实…...
mapstruct DTO转换使用
定义一个基础接口 package com.example.mapstruct;import org.mapstruct.Named;import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; import java.util.List;/*** Author zmn Dat…...
C++内存对齐
一、内存对齐的定义 内存对齐是一种计算机内存管理策略。在这种策略下,数据存储的内存地址必须是数据类型大小(或者是某个特定对齐模数)的整数倍。 例如,在一个 32 位系统中,如果一个int类型(通常占用 4 …...
关于node全栈项目打包发布linux项目问题总集
1.用pm2部署nest 说明:如果一开始将nest直接打包放到linux服务器上用pm2执行则会报错,这是因为tsconfig.build.tsbuildinfo文件的路径以及相关依赖问题。 报错会为:什么东西找不到.... 所以建议以下为步骤一步一步配置 将整个nest添加压缩包直…...
40 基于单片机的温湿度检测判断系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用dht11温湿度传感器检测温湿度, 通过lcd1602显示屏各个参数,四个按键分别可以增加温湿度的阈值, 如果超过阈值,则…...
Vue 原理详解
Vue 原理详解 Vue.js 是一个渐进式框架,它通过数据驱动视图更新和响应式编程使得前端开发变得更加简单高效。在 Vue 的内部实现中,编译过程和响应式机制是两个至关重要的组成部分。本文将详细介绍 Vue.js 的编译器、响应式系统和运行时的工作原理&#…...
w064基于springboot的高校学科竞赛平台
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件࿰…...
vue实现弹窗输入验证码
实现思路:前端输入完账号和密码,点击登录按钮的时候,弹出一个输入验证码的窗口,后端把验证码图片通过base64的字符传给前端,前端把字符当成图片展示出来。输入完验证码,点击确认进行登录,把验证…...
maven,java相关调试等
maven 增加调试信息的命令: mvn clean compile -Xmvn -X clean installmvn -e exec:execmodule jdk.compiler does not “opens com.sun.tools.java c.processing” 报错是因为用了JDK17,而老版本的1.18.4不支持。将lombok升级到1.18.32问题解决。 报错…...
ARP欺骗-断网攻击
ARP协议 arp协议(地址解析) ,在局域网中传输的是帧,帧里面有目标主机的MAC地址,其中一台电脑和另一台电脑需要知道对面的ip地址所对应的MAC地址 ARP欺骗的原理 把自己的MAC地址伪造成网段来欺骗其他用户 实验环境 kali:192.168.21.128 win…...
鬼谷子的捭阖之道
捭(bai)是打开,开口说的意思,代表阴阳中的阳面 阖(he)是关闭,是闭嘴、观察,代表阴阳中的阴面 捭阖就是通过话术来试探对方的实情,用谋略让对方信服,从而推动…...
mysql之找回忘记的root密码
mysql之找回忘记的root密码 1.方法1,init-file重置密码2.方法2,–skip-grant-tables重置密码 1.方法1,init-file重置密码 使用init-file参数来对密码进行重新设置 1.停止mysql服务进程 首先将mysql的服务停用掉; 输入命令&#x…...
IDEA中Maven相关使用
一、Maven 的配置文件与本地仓库 Maven 是一种基于配置的工具,主要通过 配置文件 和 本地仓库 管理项目构建与依赖。 1. Maven 配置文件的层级 Maven 的配置文件分为两个层级:全局配置 和 用户配置。 (1)全局配置 位置&#…...
C语言基础数据类型
C语言------基础数据类型 思考、实践、总结、交流,八字真言是学习任何一门知识的内功,尤其是在很方便用鸡皮提的时代中,独立思考是很重要的。 一个 C 语言工程由多个.c(源码文件) .h(头文件)组成。.c 文件是实现逻辑的…...
excel中字符数字转换为数值类型:NUMBERVALUE()函数
excel中字符数字转换为数值类型:NUMBERVALUE()函数 例子: 假如这个文档被设置为文档类型:可以通过这个函数进行转换 有时候这个函数不起作用:可以试试对目标列的第一个字符数字进行设置单元单元格-设置为数值型 然后对第一个字…...
【LeetCode刷题之路】283:移动零的普通解法与优化解法(含动图演示)
LeetCode刷题记录 🌐 我的博客主页:iiiiiankor🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!📝 专栏系列:LeetCode…...
AtomicIntegerFieldUpdater能否降低内存
1. 代码如下: import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTest {final AtomicInteger startPosition new AtomicInteger(0);final AtomicInteger wrotePosition new Atom…...
一个实用的 Maven localRepository 工具
目录 1 现状2 当前解决3 更好的解决3.1 下载 Maven localRepository 工具包3.2 上传本地 localRepository 包3.3 清理 localRepository 中指定后缀的文件 1 现状 在使用 Maven 时,我们可能会经常与本地仓库和私服仓库打交道。 例如对于本地仓库,因为某…...
【算法day4】链表:应用拓展与快慢指针
题目引用 两两交换链表节点删除链表的倒数第n个节点链表相交环形链表 1.两两交换链表节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换&am…...
拉格朗日乘子法和罚函数法
求目标函数 f ( x , y ) x 2 y 2 f(x, y) x^2 y^2 f(x,y)x2y2 的极值 约束条件为: g ( x , y ) x y − 1 0 g(x, y) x y - 1 0 g(x,y)xy−10 直接求解 消去变量由约束条件 x y − 1 0 x y - 1 0 xy−10,可得 y 1 − x y 1 - x y1−…...
关于创建新登录用户使用SQL Server验证登录时报错全过程解决方法(错误: 18456,不包含网络连接,此教程为本地单机连接)
想必大家在创建新登录用户时会遇到一些问题例如: 但是账号密码都已经反复确认过没错了 之前我在很多博文看到的解决方法都不能正确解决这个问题,接下来我就来解决下这个问题 1.首先创建一个新的登录用户 下面配置是这样子的: 登录名test login 密码12…...
前端通用Axios 请求拦截配置
前端通用Axios 请求拦截配置 配置 目录在request或者plugins都可以,看自己习惯 文件名ReqAxios.js/ReqAxios.ts import axios from "axios"; //消息提示 import { message } from "ant-design-vue"; import Vue from vueconst reqAxios ax…...
docker搭建socks5代理
准备工作 VPS安全组/策略放行相应端口如启用了防火墙,放行相应端口 实际操作 我们选用“历史悠久”的Dante socks5 代理服务器,轻量、稳定。Github也有对dante进行进一步精简的镜像,更为适宜。github项目地址如下: https://gi…...
抓包之wireshark基础用法介绍
写在前面 wireshark作为最优秀的抓包工具,有必要详细的看下其基本用法,所以本文就一起来做这件事吧! 1:初步介绍 打开wireshark首先会进入如下的界面: 想要开始抓包,需要进行如下操作: 接着…...
JVM的生命周期
目录 引言1. 虚拟机的启动1.1 引导类加载器1.2 初始化步骤 2. 虚拟机的执行2.1 主要任务2.2 运行时数据区2.3 垃圾收集2.3.1 标记-清除算法2.3.2 复制算法2.3.3 标记-整理算法2.3.4 分代收集 3. 虚拟机的退出3.1 正常退出3.2 异常退出3.3 其他退出方式3.4 关闭钩子 4. 结论 引言…...
【第三讲】Spring Boot 3.4.0 新特性详解:增强的配置属性支持
Spring Boot 3.4.0 版本在配置属性的支持上进行了显著增强,使得开发者能够更灵活地管理和使用应用程序的配置。新的特性包括对配置属性的改进、类型安全增强、以及对环境变量的更好支持。这些改进旨在提升开发效率和代码可读性,同时简化配置过程。本文将…...
搭建环境-PHP简介及环境搭建教程
搭建环境-PHP简介及环境搭建教程 前言 在现代Web开发中,PHP是一种广泛使用的服务器端脚本语言,它以简洁、高效和跨平台的特性受到开发者的青睐。无论是小型网站还是大型企业应用,PHP都能提供强大的支持。本文将为您详细介绍PHP的基本概念、特点,以及如何搭建PHP开发环境。…...
linux模拟HID USB设备及wireshark USB抓包配置
文章目录 1. 内核配置2. 设备配置附 wireshark USB抓包配置 linux下模拟USB HID设备的简单记录,其他USB设备类似。 1. 内核配置 内核启用USB Gadget,使用fs配置usb device信息。 Device Drivers ---> [*] USB support ---><*> USB …...
微前端架构 qiankun
背景:随着业务功能的扩展,原有开发模式已无法满足需求。上线后出现问题时,排查过程变得异常复杂,新开发人员也难以迅速理解现有代码。同时,系统间界面风格和交互差异较大,导致跨系统办理业务时工作量增加。…...
RAT:融合RAG和CoT的高效多步推理任务策略
今天分享的是由北京大学、加州大学洛杉矶分校和北京通用人工智能研究院合作发表的一篇文章 论文题目:RAT: Retrieval Augmented Thoughts Elicit Context-Aware Reasoning in Long-Horizon Generation 论文链接:https://arxiv.org/pdf/2403.05313 代码地址:https://githu…...
C++之虚基类
虚基类(Virtual Base Class)是 C 中的一个特性,用于解决菱形继承问题,避免因为多重继承而导致的重复继承和冗余问题。 菱形继承问题 假设有如下的类结构: 一个基类 Base。两个类 Derived1 和 Derived2 继承自 Base。…...
大小写转换
描述 将下面的字符串中的大小写进行转换。 输入描述 输入一行仅包含字母的字符串(字符串长度 ≤100)。 输出描述 将其中的大写转换为小写,小写转换为大写。 abcD ABCd #include<iostream> #include<string> using namespace std; int main() { …...
Flink 热存储维表 使用 Guava Cache 减轻访问压力
目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中,Flink 应用中…...
09.ES13 10.ES14
9.1、class扩展 9.1.1、类成员声明 在ES13之前,我们只能在构造函数里面声明类的成员,而不能像其他大多数语言一样在类的最外层作用域里面声明成员。不过ES13出来之后,这都不算什么事儿了。现在我们终于可以突破这个限制,写下面这…...
Day 30 贪心算法 part04
今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 这种题还是属于那种,做过了也就会了,没做过就很难想出来。 不过大家把如下三题做了之后, 重叠区间 基本上差不多了 452. 用最少数量的箭引爆气球…...
ProtonBase 教育行业解决方案
01/方案概述 当前,大数据、云计算等技术正加速教育行业的数字化转型,教学模式从线下转向线上,传统教育企业向具有互联网性质的新型教育企业转变。在此背景下,教育企业亟需探索多源数据的融合扩展,以应对复杂的业务场景…...