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

深度学习—BP算法梯度下降及优化方法Day37

梯度下降

1.公式

w i j n e w = w i j o l d − α ∂ E ∂ w i j w_{ij}^{new}= w_{ij}^{old} - \alpha \frac{\partial E}{\partial w_{ij}} wijnew=wijoldαwijE
α为学习率
在这里插入图片描述
当α过小时,训练时间过久增加算力成本,α过大则容易造成越过最优解导致震荡。

2.梯度下降过程

1.初始化参数:权重:W,偏置:b
2.求梯度:利用损失函数求出权重W的导数。
3.参数更新:按照梯度下降公式求出新的W。
4.循环迭代:按照设定的条件或次数循环更新W。

3.常见梯度下降方法

3.1批量梯度下降

Batch Gradient Descent BGD

  • 特点

    • 每次更新参数时,使用整个训练集来计算梯度。
  • 优点

    • 收敛稳定,能准确地沿着损失函数的真实梯度方向下降。
    • 适用于小型数据集。
  • 缺点

    • 对于大型数据集,计算量巨大,更新速度慢。
    • 需要大量内存来存储整个数据集。
  • 公式
    θ : = θ − α 1 m ∑ i = 1 m ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta := \theta - \alpha \frac{1}{m} \sum_{i=1}^{m} \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ:=θαm1i=1mθL(θ;x(i),y(i))
    其中, m m m 是训练集样本总数,$x^{(i)}, y^{(i)} $是第 i i i 个样本及其标签。

3.2随机梯度下降

Stochastic Gradient Descent, SGD

  • 特点

    • 每次更新参数时,仅使用一个样本来计算梯度。
  • 优点

    • 更新频率高,计算快,适合大规模数据集。
    • 能够跳出局部最小值,有助于找到全局最优解。
  • 缺点

    • 收敛不稳定,容易震荡,因为每个样本的梯度可能都不完全代表整体方向。
    • 需要较小的学习率来缓解震荡。
  • 公式
    θ : = θ − α ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta := \theta - \alpha \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ:=θαθL(θ;x(i),y(i))

3.3小批量梯度下降

Mini-batch Gradient Descent MGBD

  • 特点

    • 每次更新参数时,使用一小部分训练集(小批量)来计算梯度。
  • 优点

    • 在计算效率和收敛稳定性之间取得平衡。
    • 能够利用向量化加速计算,适合现代硬件(如GPU)。
  • 缺点

    • 选择适当的批量大小比较困难;批量太小则接近SGD,批量太大则接近批量梯度下降。
    • 通常会根据硬件算力设置为32\64\128\256等2的次方。
  • 公式
    θ : = θ − α 1 b ∑ i = 1 b ∇ θ L ( θ ; x ( i ) , y ( i ) ) \theta := \theta - \alpha \frac{1}{b} \sum_{i=1}^{b} \nabla_\theta L(\theta; x^{(i)}, y^{(i)}) θ:=θαb1i=1bθL(θ;x(i),y(i))
    其中, b b b 是小批量的样本数量,也就是 b a t c h _ s i z e batch\_size batch_size
    其中, x ( i ) , y ( i ) x^{(i)}, y^{(i)} x(i),y(i) 是当前随机抽取的样本及其标签。

4.存在问题

在这里插入图片描述

  • 收敛速度慢:BGD和MBGD使用固定学习率,太大会导致震荡,太小又收敛缓慢。

  • 局部最小值和鞍点问题:SGD在遇到局部最小值或鞍点时容易停滞,导致模型难以达到全局最优。

  • 训练不稳定:SGD中的噪声容易导致训练过程中不稳定,使得训练陷入震荡或不收敛。

5.优化方法

5.1指数加权平均数

在这里插入图片描述
其中:

  • St 表示指数加权平均值(EMA);
  • Yt 表示 t 时刻的值;
  • β \beta β 是平滑系数,取值范围为 0 ≤ β < 1 0\leq \beta < 1 0β<1 β \beta β 越接近 1 1 1,表示对历史数据依赖性越高;越接近 0 0 0 则越依赖当前数据。该值越大平均数越平缓
import numpy as np
import matplotlib.pyplot as pltdef test01():np.random.seed(666)y = np.random.randint(5,40,30)print(y)x = np.arange(30)plt.plot(x,y,color='b')plt.scatter(x,y,color='r')plt.show()def test02(beta = 0.9):np.random.seed(666)y = np.random.randint(5,40,30)print(y)x = np.arange(30)y_e = []for i in range(30):if i == 0:y_e.append(y[0])else:st = beta*y_e[-1]+(1-beta)*y[i]y_e.append(st)plt.plot(x,np.array(y_e),color='b')plt.scatter(x,y,color='r')plt.show()if __name__ == '__main__':test01()test02()

在这里插入图片描述
在这里插入图片描述

5.2Momentum

Momentum 的基本思想
在传统的梯度下降法中,参数的更新仅依赖于当前的梯度方向。Momentum 方法通过引入一个累积的动量来加速参数的更新。具体来说,Momentum 方法在参数更新时不仅考虑当前的梯度方向,还考虑了过去梯度的方向。

  • 惯性效应: 该方法加入前面梯度的累积,这种惯性使得算法沿着当前的方向继续更新。如遇到鞍点,也不会因梯度逼近零而停滞。
  • 减少震荡: 该方法平滑了梯度更新,减少在鞍点附近的震荡,帮助优化过程稳定向前推进。
  • 加速收敛: 该方法在优化过程中持续沿着某个方向前进,能够更快地穿越鞍点区域,避免在鞍点附近长时间停留。

梯度计算公式:
D t = β ∗ S t − 1 + ( 1 − β ) ∗ D t Dt = β * S_{t-1} + (1- β) * Dt Dt=βSt1+(1β)Dt

  1. S t − 1 S_{t-1} St1 表示历史梯度移动加权平均值
  2. Dt 表示当前时刻的梯度值
  3. β 为权重系数

Momentum 算法是对梯度值的平滑调整,但是并没有对梯度下降中的学习率进行优化。

import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.SGD(net.parameters(), lr=0.1,momentum=0.6)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step()  # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()

5.3AdaGrad

AdaGrad(Adaptive Gradient Algorithm)为每个参数引入独立的学习率,它根据历史梯度的平方和来调整这些学习率,这样就使得参数具有较大的历史梯度的学习率减小,而参数具有较小的历史梯度的学习率保持较大,从而实现更有效的学习。AdaGrad避免了统一学习率的不足,更多用于处理稀疏数据和梯度变化较大的问题。

AdaGrad流程:

  1. 初始化学习率 α、初始化参数 θ、小常数 σ = 1e-6

  2. 初始化梯度累积变量 s = 0

  3. 从训练集中采样 m 个样本的小批量,计算梯度 g

  4. 累积平方梯度 s = s + g ⊙ g,⊙ 表示各个分量相乘

  5. 学习率 α 的计算公式如下:在这里插入图片描述

  6. 参数更新公式如下:在这里插入图片描述

其中:

  • α \alpha α 是全局的初始学习率。

  • $ \sigma$ 是一个非常小的常数,用于避免除零操作(通常取$ 10^{-8}$)。

  • $ \frac{\alpha}{\sqrt{s }+\sigma} $ 是自适应调整后的学习率。

import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.Adagrad(net.parameters(), lr=0.1)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step()  # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()

5.4RMSProp

RMSProp(Root Mean Square Propagation)在时间步中,不是简单地累积所有梯度平方和,而是使用指数加权平均来逐步衰减过时的梯度信息。这种方法专门用于解决AdaGrad在训练过程中学习率过度衰减的问题。

RMSProp过程

  1. 初始化学习率 α、初始化参数 θ、小常数 σ = 1e-8( 用于防止除零操作(通常取 1 0 − 8 10^{-8} 108))。

  2. 初始化参数 θ

  3. 初始化梯度累计变量 s=0

  4. 从训练集中采样 m 个样本的小批量,计算梯度 g

  5. 使用指数移动平均累积历史梯度,公式如下:在这里插入图片描述

  6. 学习率 α 的计算公式如下:在这里插入图片描述

  7. 参数更新公式如下:在这里插入图片描述

优点

  • 适应性强:RMSProp自适应调整每个参数的学习率,对于梯度变化较大的情况非常有效,使得优化过程更加平稳。

  • 适合非稀疏数据:相比于AdaGrad,RMSProp更加适合处理非稀疏数据,因为它不会让学习率减小到几乎为零。

  • 解决过度衰减问题:通过引入指数加权平均,RMSProp避免了AdaGrad中学习率过快衰减的问题,保持了学习率的稳定性

缺点

依赖于超参数的选择:RMSProp的效果对衰减率 $ \beta$ 和学习率 $ \alpha$ 的选择比较敏感,需要一些调参工作。

需要注意的是:AdaGrad 和 RMSProp 都是对于不同的参数分量使用不同的学习率,如果某个参数分量的梯度值较大,则对应的学习率就会较小,如果某个参数分量的梯度较小,则对应的学习率就会较大一些。

import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.RMSprop(net.parameters(), lr=0.01,momentum=0.8)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step()  # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()

5.5Adam

Adam(Adaptive Moment Estimation)算法将动量法和RMSProp的优点结合在一起:

  • 动量法:通过一阶动量(即梯度的指数加权平均)来加速收敛,尤其是在有噪声或梯度稀疏的情况下。
  • RMSProp:通过二阶动量(即梯度平方的指数加权平均)来调整学习率,使得每个参数的学习率适应其梯度的变化。
  • Momentum 使用指数加权平均计算当前的梯度值、AdaGrad、RMSProp 使用自适应的学习率,Adam 结合了 Momentum、RMSProp 的优点,使用:移动加权平均的梯度和移动加权平均的学习率。使得能够自适应学习率的同时,也能够使用 Momentum 的优点。

优点

  1. 高效稳健:Adam结合了动量法和RMSProp的优势,在处理非静态、稀疏梯度和噪声数据时表现出色,能够快速稳定地收敛。

  2. 自适应学习率:Adam通过一阶和二阶动量的估计,自适应调整每个参数的学习率,避免了全局学习率设定不合适的问题。

  3. 适用大多数问题:Adam几乎可以在不调整超参数的情况下应用于各种深度学习模型,表现良好。

缺点

  1. 超参数敏感:尽管Adam通常能很好地工作,但它对初始超参数(如 $ \beta_1 、 、 \beta_2$ 和 η \eta η)仍然较为敏感,有时需要仔细调参。
  2. 过拟合风险:由于Adam会在初始阶段快速收敛,可能导致模型陷入局部最优甚至过拟合。因此,有时会结合其他优化算法(如SGD)使用。
import torch# 1.创建一个神经网络:继承官方的nn.Module
class mynet(torch.nn.Module):# 2.定义网络结构def __init__(self, input_size, output_size):# 3.初始化父类:python语法要求调用super方法生成父类的功能让子类对象去继承super(mynet, self).__init__()# 4.定义网络结构self.hide1 = torch.nn.Sequential(torch.nn.Linear(input_size, 3), torch.nn.Sigmoid())self.hide2 = torch.nn.Sequential(torch.nn.Linear(3, 2), torch.nn.Sigmoid())self.hide3 = torch.nn.Sequential(torch.nn.Linear(2, 12), torch.nn.Sigmoid())self.out = torch.nn.Sequential(torch.nn.Linear(12, output_size), torch.nn.Sigmoid())def forward(self, input):# input.shape[1]x = self.hide1(input)x = self.hide2(x)x = self.hide3(x)pred = self.out(x)return preddef train():# 数据集input = torch.tensor([[0.5, 0.1],[0.05, 0.180],[0.05, 0.310]])target = torch.tensor([[1, 2],[0, 3],[1, 123]], dtype=torch.float32)# 5.创建网络net = mynet(2, 2)# 6.定义损失函数loss_func = torch.nn.MSELoss()# 7.定义优化器optimizer = torch.optim.Adam(net.parameters(), lr=0.1)# 8.训练for epoch in range(100):# 9.前向传播y_pred = net(input)# 10.计算损失loss = loss_func(y_pred, target)# 11.梯度清零optimizer.zero_grad()# 12.反向传播(计算每一层的w的梯度值)loss.backward()# print(net.hide1[0].weight.data)# 13.梯度更新optimizer.step()  # w = w -lr*当前的移动指数加权平均(s = momentum*s + (1-momentum)*w.gradprint(loss)if __name__ == '__main__':train()

相关文章:

深度学习—BP算法梯度下降及优化方法Day37

梯度下降 1.公式 w i j n e w w i j o l d − α ∂ E ∂ w i j w_{ij}^{new} w_{ij}^{old} - \alpha \frac{\partial E}{\partial w_{ij}} wijnew​wijold​−α∂wij​∂E​ α为学习率 当α过小时&#xff0c;训练时间过久增加算力成本&#xff0c;α过大则容易造成越过最…...

elasticsearch8.16 docker-compose 多机器集群安装

在网上找了一圈, 发现要么就是单机版的部署了多个节点, 很少有多台机器部署集群的, 有些就拿官网的例子写一写, 没有实战经验, 下面分享一个教程, 实实在在的多台机器, 每台机器部署2个节点的例子 先上.env , docker-compose.yml文件, 这个文件是核心, 里面掺杂太多坑, 已经帮你…...

Flink--API 之 Source 使用解析

目录 一、Flink Data Sources 分类概览 &#xff08;一&#xff09;预定义 Source &#xff08;二&#xff09;自定义 Source 二、代码实战演示 &#xff08;一&#xff09;预定义 Source 示例 基于本地集合 基于本地文件 基于网络套接字&#xff08;socketTextStream&…...

uniapp在小程序连接webScoket实现余额支付

webScoket文档&#xff1a;uni.connectSocket(OBJECT) | uni-app官网 /plugins/event.js const Dep function() {this.Evens Object.create(null); } class Event {constructor({dep new Dep()} {}) {if (dep.constructor Object && Object.keys(dep).length 0…...

Spring Boot【三】

自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式&#xff1a; <bean id"" class"" autowire"byType|byName|constructor|default" /> byName&#xff1a;按照名称进行注入 byType&#xff1a;按类型进行注入 constr…...

R 因子

R 因子 引言 在金融领域&#xff0c;风险管理和投资策略的优化一直是核心议题。传统的风险度量工具&#xff0c;如波动率、Beta系数等&#xff0c;虽然在一定程度上能够帮助投资者理解市场的波动和资产的相对风险&#xff0c;但它们往往无法全面捕捉到市场动态的复杂性。因此…...

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代&#xff0c;程序开…...

深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用

目录 前言1. 使用 systemctl 启动 MySQL1.1 什么是 systemctl1.2 systemctl 启动 MySQL 的方法1.3 应用场景1.4 优缺点优点缺点 2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqld2.2 mysqld 启动 MySQL 的方法2.3 应用场景2.4 优缺点优点缺点 3. 对比分析结语 前言 MySQL …...

【python】windows pip 安装 module 提示 Microsoft Visual C++ 14.0 is required 处理方法

参考链接&#xff1a;https://blog.csdn.net/qzzzxiaosheng/article/details/12511900 1.问题引入 在使用pip 安装一些module经常会出现报错&#xff1a; Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools很明显这是缺少C的编译的相关依…...

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…...

go sync.WaitGroup

1、数据结构 type WaitGroup struct {noCopy noCopystate atomic.Uint64 // high 32 bits are counter, low 32 bits are waiter count.sema uint32 } 计数器&#xff1a;原子变量&#xff0c;高32位用于为协程计数&#xff0c;低32位为等待计数&#xff08;被Wait阻塞等待&a…...

Libevent库-http通信不同请求方式的处理

做项目的时候用到了http通信&#xff0c;同事用libevent库写的&#xff0c;特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...

关于node全栈项目打包发布linux项目问题总集

1.用pm2部署nest 说明&#xff1a;如果一开始将nest直接打包放到linux服务器上用pm2执行则会报错&#xff0c;这是因为tsconfig.build.tsbuildinfo文件的路径以及相关依赖问题。 报错会为&#xff1a;什么东西找不到.... 所以建议以下为步骤一步一步配置 将整个nest添加压缩包直…...

常见的上、下采样方法

常见的‌上采样方法‌ ‌‌反卷积&#xff08;Deconvolution&#xff09;或‌转置卷积&#xff08;Transpose Convolution&#xff09;‌&#xff1a;通过学习可逆卷积核来进行上采样&#xff0c;增加特征图的尺寸。‌‌插值&#xff08;Interpolation&#xff09;‌&#xff…...

如何解决 java.rmi.NotBoundException: RMI 中没有绑定的对象问题?亲测有效的解决方法!

java.rmi.NotBoundException 是 Java RMI&#xff08;Remote Method Invocation&#xff09;中的一个常见异常&#xff0c;它通常出现在远程方法调用过程中&#xff0c;表示在 RMI 注册表中找不到指定的绑定对象。换句话说&#xff0c;当客户端尝试查找一个远程对象&#xff08…...

设计模式:14、抽象工厂模式(配套)

目录 0、定义 1、抽象工厂模式的四种角色 2、抽象工厂的UML类图 3、示例代码 0、定义 提供一个创建一系列或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 1、抽象工厂模式的四种角色 抽象产品&#xff08;Product&#xff09;&#xff1a;一个抽象类或接口&a…...

Linux环境基础开发工具使用

目录 1. Linux软件包管理器yum 1.1 什么是软件包 1.2 Linux软件生态 1.3 关于rzsz 1.4 注意事项 1.5 查看软件包 2. Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 简单vim配置 3. 编译器gcc/g 3.1 背景知识 3.2 gcc编译选项 3.2.1 预处理…...

AI生成的一个.netcore 经典后端架构

下面是一个完整的 .NET Core 后端项目示例&#xff0c;使用 Dapper 作为轻量级 ORM 访问 Oracle 数据库&#xff0c;并实现高性能架构。我们将实现学生表、课程表、成绩表和班级表的基本增删改查功能&#xff0c;以及查询某个班级学生成绩的功能&#xff0c;并使用自定义缓存来…...

深度学习-48-AI应用实战之基于face_recognition的人脸识别

文章目录 1 人脸识别1.1 识别原理1.2 应用场景2 python实现人脸识别2.1 windows安装face_recognition2.2 安装问题及解决3 使用示例3.1 人脸区域检测3.2 对齐与编码3.3 人脸匹配3.4 信息录入4 附录4.1 函数cv2.rectangle4.2 参考附录1 人脸识别 通过图片或者摄像头的方式,将识…...

【Rabbitmq篇】高级特性----事务,消息分发

目录 事务 消息分发 应用场景 1. 限流 2.负载均衡 事务 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败. 何为原…...

Python进程和线程适用场景

在选择使用 进程&#xff08;Process&#xff09;和 线程&#xff08;Thread&#xff09;时&#xff0c;通常取决于任务的类型、程序的需求以及硬件资源的限制。进程和线程各自有不同的特点&#xff0c;适用于不同的场景。下面是关于进程和线程的一些常见应用场景和选择指导&am…...

flutter开发环境—Windows

一、简介 我们使用最新版的flutter版本安装。 参考链接 名称地址官方网站https://flutter.dev/官方中文网站文档 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter软件下载路径https://docs.flutter.dev/release/archive?tabwindows 二、操作流程 2.1 下载软件 点…...

展示和添加篮球队信息--laravel与elementplus

之前使用laravel与inertia来做过一样的功能,感觉不满意,因此再结合elementplus重做一遍,先展示下重做后的效果。重写后的代码相比之下比较优雅。 球队首页 球队添加页 球员首页 很明显的改变,我新增了侧栏菜单来控制局部模块(这里是指NBABasketba…...

写一份客服网络安全意识培训PPT

一、为什么要对客服人员定期进行网络安全培训呢&#xff1f; 人员组成复杂&#xff1a;企业既有自由人员又有采购的外包公司客服&#xff0c;为了节约成本可能外包占大多数&#xff0c;这必然加强了人群的流动性所以往往得不到系统的培训。人员素质参差不齐&#xff1a;因为工…...

具体的技术和工具在县级融媒体建设3.0中有哪些应用?

以下是结合数据来看县级融媒体建设3.0的一些情况&#xff1a; 技术应用方面 大数据&#xff1a;人民网舆情数据中心执行主任董盟君提到&#xff0c;通过大数据分析可让融媒体单位快速关注聚焦点&#xff0c;实现智能策划、智能推送、智能传播&#xff0c;推动媒体传播影响力提…...

【uniapp】轮播图

前言 Uniapp的swiper组件是一个滑块视图容器组件&#xff0c;可以在其中放置多个轮播图或滑动卡片。它是基于微信小程序的swiper组件进行封装&#xff0c;可以在不同的平台上使用&#xff0c;如微信小程序、H5、App等。 效果图 前端代码 swiper组件 <template><vi…...

Rust编程语言代码详细运行、编译方法

以下是针对不同类型的 Rust 代码&#xff08;以常见的命令行程序为例&#xff09;详细的运行方法&#xff1a; 前提条件 在运行 Rust 代码之前&#xff0c;确保你已经在系统上安装了 Rust 编程语言环境。如果尚未安装&#xff0c;可以通过以下步骤进行安装&#xff1a; 访问…...

node.js基础学习-http模块-JSONP跨域传值(四)

前言 JSONP&#xff08;JSON with Padding&#xff09;是一种用于跨域数据传输的技术。在浏览器的同源策略限制下&#xff0c;一般情况下&#xff0c;JavaScript 不能直接从不同域的服务器获取数据。JSONP 通过利用 <script> 标签的跨域特性来绕过这个限制。 它本质上是一…...

Unity高效编程经验50条分享

1.避免频繁创建临时对象 错误写法&#xff1a;obj.transform.position pos;这种写法会在Lua中频繁返回transform对象导致gc正确写法&#xff1a;创建一个静态方法来设置位置&#xff0c;例如 class LuaUtil { static void SetPos(GameObject obj, float x, float y, float z)…...

TypeScript 泛型

在 TypeScript 中&#xff0c;泛型是一种强大的工具&#xff0c;它允许你在定义函数、类、接口或类型别名时不指定具体的类型。这意味着你可以为这些实体创建可重用的组件&#xff0c;这些组件可以在不同的类型上以一致的方式工作。今天&#xff0c;我们将深入探讨 TypeScript …...

最好的产品网站建设/网络推广费用大概价格

如何使技术工程师也能写出清晰和简洁的语句&#xff1f; 以新闻报道的文风加上技术报告的格式。在新闻报道里&#xff0c;各段落都是以重要性先后排列的&#xff0c;所以读者可以在任何一个丧失兴趣的段落停下来&#xff0c;他们知道最重要的部分都已经读到&#xff0c;余下未读…...

校园网站建设与管理/游戏推广员骗局

本文转自摄像头的MIPI接口、DVP接口和CSI接口-百度经验 (baidu.com)&#xff0c;感谢作者分享 一般来讲&#xff0c;摄像头的接口主要有MIPI接口、DVP接口、CSI接口三大类&#xff1b; 我们常用的电脑摄像头接口是USB接口&#xff0c;而常见的智能手机上的摄像头是MIPI接口&am…...

摄影网站的意义/中级经济师考试

Oracle创建和使用序列1 语法create sequence 序列名称2 创建序列SQL> create sequence emp_seq;Sequence created.序列是一个数据库对象&#xff0c;因此可以在数据字典中获得其信息。与序列相关的视图为user_objects和user_sequences。SQL> col object_name format a15;…...

网站建设维护学什么/百度seo排名优化系统

装好docker 1. master上&#xff1a; cd shell && sh init.sh && sh master.sh 2. node上&#xff1a;cd shell && sh init.sh 3. 在node上执行master输出的join命令即可 (命令忘记了可以用这个查看&#xff0c;kubeadm token create --print-join-com…...

dreamweaver绿色版下载/seo搜索引擎优化推荐

本文刚刚发在51CTO.com网站&#xff0c;文章链接&#xff1a;[url]http://soft.51cto.com/art/200611/34788.htm[/url]11月中旬&#xff0c;CA EXPO 2006分别在上海和北京召开。作为一直与CA保持联系的记者&#xff0c;51CTO老杨受邀参与北京站的会议。我是2000年开始接触和了解…...

建设网站企业邮箱/网站seo外包公司有哪些

本博文记录阅读《C Primer》过程中遇到的未理解知识点&#xff0c;便于日后回头有针对性的攻克。 教材&#xff1a;《C Primer中文第四版&#xff08;非扫描&#xff09;》 1.第369页有这么一句“。 正如前面第 7.8 节所提到的&#xff0c;当形参以副本传递时&#xff0c;不能基…...