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

pytorch说明

深度学习中的重要概念:

激活函数:

  1. 激活函数的必要性:激活函数不是绝对必须的,但在深度学习中,它们几乎总是被使用。激活函数可以引入非线性,这使得神经网络能够学习更复杂的模式。

  2. 激活函数的位置:激活函数通常放在线性层(如全连接层)之后。这样做可以引入非线性,否则,无论有多少层,整个网络的运算都可以被简化为一个单一的线性变换。

  3. 激活函数的选择:激活函数的选择和放置通常取决于具体的应用和网络架构。有些网络架构可能会在某些层之前或之后使用不同的激活函数。

损失函数:

  1. 损失函数的作用:损失函数用于衡量模型的预测与真实值之间的差异。训练过程中,目标是最小化损失函数,从而提高模型的预测准确性。

  2. 常用的损失函数

    • 均方误差(MSE):常用于回归问题。
    • 交叉熵损失(Cross-Entropy Loss):常用于分类问题。
    • Hinge Loss:用于支持向量机(SVM)。
    • Categorical Cross-Entropy Loss:用于多分类问题。
    • Binary Cross-Entropy Loss:用于二分类问题。
  3. 分类问题和回归问题的损失函数

    • 分类问题:通常使用交叉熵损失,特别是对于多分类问题使用Categorical Cross-Entropy Loss,对于二分类问题使用Binary Cross-Entropy Loss。
    • 回归问题:通常使用均方误差损失。

前向传播和反向传播:

  1. 前向传播:指的是数据在神经网络中的正向流动,即从输入层经过每一层的计算,直到输出层。

  2. 反向传播:是与前向传播相对的过程,用于计算损失函数相对于网络参数的梯度。这是通过链式法则完成的,从输出层开始,逆向传递至输入层。

  3. 为什么使用PyTorch要定义前向传播:在PyTorch中,定义forward函数是为了指定模型如何接收输入并产生输出。PyTorch自动处理反向传播,但需要用户定义前向传播的逻辑。

  4. 梯度计算的位置:梯度计算是在反向传播的过程中进行的。在前向传播过程中,我们计算模型的输出;在反向传播过程中,我们计算如何调整模型的参数以减少损失。

重要概念,构成深度学习的基础: 

  1. 神经网络架构

    包括不同类型的网络层(如卷积层、循环层、池化层等)和它们如何组合在一起形成完整的模型。
  2. 权重和偏置

    神经网络中的参数,权重决定了连接的强度,偏置则用于调整激活输出的阈值
  3. 正则化

    技术,如L1和L2正则化,用于防止模型过拟合,通过惩罚大的权重值来鼓励更简单的模型。
  4. 优化算法

    如梯度下降(及其变体,如SGD、Adam、RMSprop等),用于在训练过程中更新模型的参数。
  5. 批量处理

    将数据分成小批量进行训练,可以提高内存效率并有助于提高模型的泛化能力
  6. 过拟合欠拟合

    过拟合发生在模型在训练数据上表现很好,但在新数据上表现差;欠拟合则是模型在训练数据上表现不足。
  7. 超参数

    模型训练前需要设置的参数,如学习率、批量大小、训练轮数等,它们对模型性能有重要影响。
  8. 特征提取

    从原始数据中提取有用信息的过程,特征的好坏直接影响模型的性能。
  9. 数据增强

    通过对训练数据进行变换(如旋转、缩放、裁剪等)来增加数据多样性,减少过拟合。
  10. 模型评估

    使用验证集和测试集来评估模型性能,常用的评估指标包括准确率、精确率、召回率、F1分数等。
  11. 迁移学习

    利用在一个任务上训练好的模型来解决另一个相关任务的技术。
  12. 模型部署

    将训练好的模型集成到应用程序中,使其能够对新数据做出预测。
  13. 计算图

    描述了操作和它们相互之间依赖关系的图,用于自动微分和梯度计算。
  14. 损失景观和优化景观

    损失函数和优化算法在参数空间中的表现,包括局部最小值、全局最小值和鞍点。
  15. 注意力机制

    一种让模型集中于输入数据的特定部分的技术,广泛应用于序列模型中。

自动求导机制: 

  1. requires_grad 属性:这个属性用来标记变量是否需要计算梯度。如果一个变量的 requires_gradTrue,那么在反向传播时会计算其梯度。如果所有输入变量都不需要梯度,则输出也不需要梯度。

  2. volatile 属性:用于纯粹的推理模式,可以提高效率,因为它使用最少的内存。如果输入是 volatile,那么输出也是 volatile,且 requires_gradFalsevolatile 属性比 requires_grad 更容易传递。

  3. 自动求导的编码历史:每个变量都有一个 .creator 属性,指向创建它的函数。这些函数形成了一个有向无环图(DAG),用于在反向传播时计算梯度。

  4. In-place 操作:在自动求导中,不鼓励使用 in-place 操作,因为它们可能会覆盖梯度计算所需的值,或者需要重写计算图。

  5. In-place 正确性检查:每个变量有一个版本计数器,每次使用时递增。如果版本计数器的值大于保存的值,将引发错误。

示例:

假设我们有一个简单的神经网络模型,我们想要训练它。在这个过程中,我们会使用 requires_grad 来控制梯度的计算。

import torch 
import torch.nn as nn 
# 定义一个简单的模型 
model = nn.Sequential( nn.Linear(10, 5), nn.ReLU(), nn.Linear(5, 2) ) 
# 假设我们已经有了一些数据 
inputs = torch.randn(1, 10, requires_grad=True)
# 输入数据,需要梯度
outputs = model(inputs) 
# 前向传播 
# 假设我们有正确的输出 
targets = torch.tensor([1.0, 0.0])
# 计算损失 
loss = (outputs - targets).pow(2).sum() 
# 均方误差损失 # 反向传播,计算梯度 
loss.backward() 
# 打印第一个线性层的梯度 
print(model[0].weight.grad)

 运行结果:

在这个例子中,我们创建了一个简单的模型,并对其进行了前向传播。我们设置了输入数据的 requires_grad 属性为 True,这样在计算损失并调用 backward() 方法时,PyTorch 会自动计算梯度。最后,打印了第一个线性层的梯度,这是自动求导机制的直接应用。

这段文字主要介绍了在使用PyTorch和CUDA进行深度学习时的一些最佳实践和概念。我会用简单的语言解释这些概念,并提供一个示例。

CUDA语义解释:

  1. GPU选择torch.cuda会记录当前选择的GPU,所有通过它创建的张量都会在该GPU上。

  2. 设备无关操作:一旦张量被分配到某个GPU,你可以在任何设备上对其进行操作,结果会自动放在与张量相同的设备上。

  3. 跨GPU操作限制:默认情况下,不支持在不同GPU上的张量之间进行操作,除非启用了对等存储器访问。

  4. 上下文管理器:使用torch.cuda.device可以临时更改所选的GPU设备。

示例:

import torch# 选择GPU 0
x = torch.cuda.FloatTensor(1)# 将一个CPU上的张量复制到GPU 0
y = torch.FloatTensor(1).cuda()# 使用上下文管理器选择GPU 1
with torch.cuda.device(1):# 在GPU 1上创建张量aa = torch.cuda.FloatTensor(1)# 将CPU上的张量复制到GPU 1b = torch.FloatTensor(1).cuda()# 张量a和b都在GPU 1上,可以进行操作c = a + b  # c也在GPU 1上# 尝试将GPU 0上的x和GPU 1上的y相加,需要先复制到同一个GPUz = x.cuda(1) + y.cuda(1)  # z现在也在GPU 1上# 即使在GPU 1的上下文中,也可以指定将张量分配到其他GPU
d = torch.randn(2).cuda(2)  # d在GPU 2上

最佳实践:

  1. 固定内存缓冲区:使用pin_memory()方法可以提高从CPU到GPU的数据传输速度。

  2. 异步GPU副本:一旦固定了张量,可以使用异步复制来提高效率。

  3. DataLoader的固定内存:通过设置pin_memory=True,可以让DataLoader返回固定内存中的batch

  4. 使用nn.DataParallel替代多进程:在多GPU环境中,使用DataParallel可以更简单地并行化模型。

  5. 多进程注意事项:使用多进程来利用CUDA模型时,需要特别注意,以避免错误或未定义的行为。

示例:

# 假设我们有一个简单的模型 
model = torch.nn.Linear(10, 5).cuda() 
# 创建一个固定内存的张量 
input_data = torch.randn(32, 10).pin_memory() 
# 异步复制到GPU input_data_gpu = input_data.cuda(async=True) 
# 进行前向传播 output = model(input_data_gpu) 
# 使用DataLoader时设置pin_memory=True 
from torch.utils.data import DataLoader,TensorDataset 
dataset = TensorDataset(torch.randn(100, 10)
torch.randint(0, 2, (100,)))
dataloader = DataLoader(dataset, batch_size=32, pin_memory=True) 
for inputs,labels in dataloader:
# inputs已经在固定内存中,可以直接用于GPU操作 outputs = model(inputs.cuda())

这个示例展示了如何在PyTorch中使用固定内存和异步复制来提高数据传输的效率,以及如何使用DataLoaderpin_memory选项。

扩展 torch.autograd

  1. 继承 Function 类:要扩展自动求导系统,你需要创建一个新的操作(Operation),这需要继承class Function

  2. 实现三个方法

    • __init__:如果操作需要额外的参数,可以在这个方法中初始化。
    • forward:执行操作的代码,参数是Variable,返回值可以是VariableVariable的元组。
    • backward:计算梯度的方法,参数是传回操作的梯度,返回值是每个输入的梯度。

示例:

假设我们要实现一个简单的平方操作:

import torchclass SquareFunction(torch.autograd.Function):@staticmethoddef forward(ctx, input):ctx.save_for_backward(input)  # 保存输入用于backwardreturn input ** 2@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensors  # 获取保存的输入return 2 * input * grad_output  # 梯度是2倍的输入值乘以输出的梯度

使用这个自定义操作:

def square(input):return SquareFunction.apply(input)x = torch.tensor([2.0], requires_grad=True)
y = square(x)
print(y)  # 输出 4
y.backward()  # 计算梯度
print(x.grad)  # 输出 4,因为梯度是 2 * x

扩展 torch.nn

  1. 使用 modules:当你需要保存参数和buffer时,使用nn.Module

  2. 实现两个方法

    • __init__:初始化模块的参数。
    • forward:使用Function执行操作。

示例:

使用上面实现的SquareFunction,我们可以创建一个nn.Module

class SquareModule(torch.nn.Module):def __init__(self):super(SquareModule, self).__init__()def forward(self, x):return square(x)  # 使用自定义的SquareFunction

使用这个模块:

square_module = SquareModule()
x = torch.tensor([2.0], requires_grad=True)
y = square_module(x)
print(y)  # 输出 4
y.backward()  # 计算梯度
print(x.grad)  # 输出 4

测试梯度正确性

使用torch.autograd.gradcheck可以检查你的梯度实现是否正确:

from torch.autograd import gradcheckinput = torch.randn(2, 2, requires_grad=True)
test = gradcheck(SquareFunction.apply, input, eps=1e-6, atol=1e-4)
print(test)  # 如果梯度正确,输出 True

这个示例展示了如何扩展PyTorch的自动求导系统和nn模块,并提供了一个简单的平方操作示例

结果:

多进程编程

主要概念:

  1. torch.multiprocessing:是Python的multiprocessing模块的扩展,它允许在进程间共享张量。

  2. 共享张量:当一个Variable被发送到另一个进程时,它的datagrad.data都会被共享。

  3. CUDA张量共享:仅在Python 3中使用spawnforkserver启动方法时才支持。

  4. 避免死锁:多进程编程时,要避免死锁,特别是由于后台线程引起的死锁。

  5. 重用缓冲区:在多进程中,应重用通过队列传递的张量,以避免不必要的内存复制。

  6. 异步多进程训练:可以使用torch.multiprocessing进行异步训练,参数可以共享或定期同步。

  7. 使用队列传递对象:建议使用multiprocessing.Queue在进程间传递PyTorch对象。

  8. Hogwild:一种并行训练方法,允许多个进程同时更新共享模型参数。

示例:

下面是一个简单的示例,展示了如何使用torch.multiprocessing来并行执行一个简单的计算任务:

# my_module.py
import torchdef compute_sum(x):return torch.sum(x)# main.py
import torch.multiprocessing as mp
from my_module import compute_sum  # 确保从模块中导入函数def main():tensors = [torch.randn(10) for _ in range(4)]with mp.Pool(processes=4) as pool:results = pool.map(compute_sum, tensors)for result in results:print(result)if __name__ == '__main__':main()

在这个示例中,我们定义了一个compute_sum函数,它接受一个张量并返回它的和。然后,我们创建了4个随机张量,并使用mp.Pool来创建一个进程池。通过pool.map方法,我们可以并行地计算每个张量的和。

注意事项:

  • 使用if __name__ == '__main__':来保护代码,以确保它只在主进程中执行,而不是在每个子进程中执行。
  • 当使用fork启动方法时,要注意全局解释器锁(GIL)和共享内存的问题。
  • 在多进程编程中,要特别注意避免死锁和内存管理问题。

序列化pytorch模型:

是将对象的状态信息转换为可以存储或传输的形式的过程。在PyTorch中,序列化通常用于保存和加载模型。以下是一些关于序列化PyTorch模型的最佳实践:

推荐方法:保存和加载模型参数

  1. 保存模型参数: 使用state_dict()方法可以获取模型的所有参数,然后使用torch.save()保存到文件。

    torch.save(the_model.state_dict(), 'model_parameters.pth')

  2. 加载模型参数: 首先,你需要实例化模型(这会恢复模型架构)。然后,使用load_state_dict()方法加载保存的参数。

    the_model = TheModelClass(*args, **kwargs)
    the_model.load_state_dict(torch.load('model_parameters.pth'))

    优点

    • 灵活性:只保存参数,不关心模型的类定义或目录结构,可以在任何具有相同模型架构的项目中使用。
    • 兼容性:参数字典可以在不同的模型架构或不同的代码库中重用。

         缺点

  1. 需要重新实例化模型:在使用模型参数之前,需要先实例化模型的架构。如果模型的构造函数或参数设置较为复杂,这可能会增加一些额外的工作。

  2. 状态丢失:除了模型参数之外的其他状态(如训练轮次、优化器状态等)不会保存。如果需要这些额外的状态信息,需要单独处理。

  3. 依赖于模型类:加载参数时需要有正确的模型类定义。如果模型类在之后的开发中被修改或重命名,可能会导致加载失败。

另一种方法:保存和加载整个模型

  1. 保存整个模型: 直接保存模型对象,包括其参数和架构。

    torch.save(the_model, 'complete_model.pth')

  2. 加载整个模型: 直接从文件加载模型对象。

    the_model = torch.load('complete_model.pth')
    优点:
    1. 简便性:可以直接保存和加载整个模型对象,包括其参数、架构以及优化器状态等,无需单独处理。2. 保持状态:模型的额外状态(如训练轮次、优化器状态)也会被保存和恢复,这对于恢复训练非常有用。3. 无需重新实例化:加载模型时,不需要担心模型的构造和初始化问题,直接从保存的状态中恢复。4. 适用于复杂模型:对于具有复杂依赖或多组件的模型,保存整个模型可以避免重新实例化时的复杂性。5. 快速迁移:在需要快速迁移模型到不同环境或项目时,只需加载整个模型,而不需要关心模型的具体实现细节。缺点:
    1.耦合性保存的数据与特定的类和目录结构绑定,如果模型类或项目结构发生变化,可能会导致序列化的数据无法使用2.重构风险在项目重构后,加载整个模型可能会遇到问题,因为依赖的类和方法可能已经改变。

示例

假设我们有一个简单的模型:

class SimpleModel(torch.nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = torch.nn.Linear(10, 5)def forward(self, x):return self.linear(x)

使用推荐的方法保存和加载模型参数:

# 保存模型参数
model = SimpleModel()
model_path = 'simple_model_parameters.pth'
torch.save(model.state_dict(), model_path)# 加载模型参数
model = SimpleModel()  # 实例化一个新的模型
model.load_state_dict(torch.load(model_path))

使用第二种方法保存和加载整个模型:

# 保存整个模型
complete_model_path = 'simple_complete_model.pth'
torch.save(model, complete_model_path)# 加载整个模型
model = torch.load(complete_model_path)

注意事项

  • 当使用torch.load()加载模型时,确保在调用之前已经实例化了模型对象。
  • 如果使用GPU训练模型,可以使用map_location参数将模型参数映射到CPU或指定的GPU。
  • 保存和加载模型时,注意文件路径和模型的版本兼容性。

通过遵循这些最佳实践,可以确保模型的序列化过程既灵活又安全。

相关文章:

pytorch说明

深度学习中的重要概念: 激活函数: 激活函数的必要性:激活函数不是绝对必须的,但在深度学习中,它们几乎总是被使用。激活函数可以引入非线性,这使得神经网络能够学习更复杂的模式。 激活函数的位置&#x…...

AI语音机器人是否可以设计开放式问题

什么叫开放式提问? 是指提出比较概括、广泛、范围较大的问题,对回答的内容限制不严格,给对方充分自由发挥的余地。 试想一下,就算不是语音机器人,是一个真人销售,和客户沟通时提的问题是开放式的&#xf…...

ModuleNotFoundError: No module named

python脚本执行出现这个错误,检查是否安装了对应的模块,确认已经安装,执行还是出错 原因是我时在c程序中启动执行的python脚本,c程序执行是使用了sudo权限,此时会报错,而在shell中执行python(下…...

【操作系统】进程管理——用信号量机制解决问题,以生产者-消费者问题为例(个人笔记)

学习日期:2024.7.10 内容摘要:利用信号量机制解决几个经典问题模型 目录 引言 问题模型 生产者-消费者问题(经典) 多生产者-多消费者问题 吸烟者问题 读者写者问题(难点) 哲学家进餐问题&#xff0…...

算法刷题笔记 KMP字符串(C++实现,并给出了求next数组的独家简单理解方式)

文章目录 题目描述基本思路实现代码 题目描述 给定一个字符串S,以及一个模式串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串P在字符串S中多次作为子串出现。求出模式串P在字符串S中所有出现的位置的起始下标。 输入格式 第一行输入整数…...

SpringCloud架构师面试

一、微服务是什么 1、基本概念 微服务是一种架构风格(区别于单体架构、垂直架构、分布式架构、SOA架构),应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化:将复杂的系统或者服务进行纵向拆分,每个…...

C语言 | Leetcode C语言题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; char** summaryRanges(int* nums, int numsSize, int* returnSize) {char** ret malloc(sizeof(char*) * numsSize);*returnSize 0;int i 0;while (i < numsSize) {int low i;i;while (i < numsSize && nums[i] nums[i …...

入职前回顾一下git-01

git安装 Linux上安装git 在linux上建议用二进制的方式来安装git&#xff0c;可以使用发行版包含的基础软件包管理工具来安装。 红帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安装git 去官网下载和操作系统位数相同的安装包.或者可以直接安装GitHub…...

this指向解析

先看题目&#xff1a; 第一题&#xff1a; var name window var person1 { name: person1, show1: function () { console.log(this.name) }, show2: () > console.log(th show3: function () { return function () { …...

学习小记-Nacos的服务注册与发现原理

服务注册&#xff1a; 当一个服务实例启动时&#xff0c;它会向 Nacos 服务器注册自己的信息&#xff0c;包括 IP 地址、端口号、元数据&#xff08;如服务版本、区域信息等&#xff09;。服务实例使用 Nacos API 发送注册请求&#xff0c;Nacos 服务器接收请求并存储服务实例信…...

视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台

在当今短视频蓬勃发展的时代&#xff0c;视频号矩阵系统源码成为了自媒体人争相探索的宝藏。这一强大的技术工具不仅能帮助我们高效管理多个短视频平台&#xff0c;更能通过AI智能生成文案和自动回复私信评论&#xff0c;为自媒体运营带来前所未有的便利与效率。 一、视频号矩…...

[Spring] SpringBoot基本配置与快速上手

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强&#xff0c;大项目不适应tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;pytnon rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用的&#xff09;动静分离 默认配置不适合生产环境&…...

Python与自动化脚本编写

Python与自动化脚本编写 Python因其简洁的语法和强大的库支持&#xff0c;成为了自动化脚本编写的首选语言之一。在这篇文章中&#xff0c;我们将探索如何使用Python来编写自动化脚本&#xff0c;以简化日常任务。 一、Python自动化脚本的基础 1. Python在自动化中的优势 Pyth…...

树与二叉树

前言&#xff1a; 树这个结构想必在日常生活中很常见到&#xff0c;而现在要介绍的是一种独特的数据结构--二叉树。 1.树 &#xff08;1&#xff09;定义&#xff1a; 是一种非线性结构&#xff0c;有一个特殊的节点叫做根节点&#xff0c;树没有前驱节点&#xff1b;树是递…...

SpringBoot+Vue实现简单的文件上传(Excel篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传xls文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el…...

科研绘图系列:R语言金字塔图(pyramid plot)

介绍 金字塔图(Pyramid chart)是一种用于展示人口统计数据的图表,特别是用于展示不同年龄段的人口数量。这种图表通常用于展示人口结构,比如性别和年龄的分布。 特点: 年龄分层:金字塔图按年龄分层,每一层代表一个年龄组。性别区分:通常,男性和女性的数据会被分别展…...

Tomcat多实例

一、Tomcat多实例 Tomcat多实例是指在同一台服务器上运行多个独立的tomcat实例&#xff0c;每个tomcat实例都具有独立的配置文件、日志文件、应用程序和端口&#xff0c;通过配置不同的端口和文件目录&#xff0c;可以实现同时运行多个独立的Tomcat服务器&#xff0c;每个服务…...

前端Vue组件化实践:自定义加载组件的探索与应用

在前端开发领域&#xff0c;随着业务逻辑复杂度的提升和系统规模的不断扩大&#xff0c;传统的开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些挑战&#xff0c;组件化开发作为一种高效、灵活的开发模式&#xff0c;受到了越来越多开发者的青睐。本文将结合实践&…...

半小时获得一张ESG入门证书【详细中英文笔记一】

前些日子&#xff0c;有朋友转发了一则小红书的笔记给我&#xff0c; 标题是《半小时获CFI官方高颜值免费证书 ESG认证》。这对考证狂魔的我来说&#xff0c;必然不能错过啊&#xff0c;有免费的羊毛不薅白不薅。 ESG课程的 CFI 官方网址戳这里&#xff1a;CFI 于是信心满满的…...

类形断言和和类型推导的区别是什么?

类型断言&#xff08;Type Assertion&#xff09;和类型推导&#xff08;Type Inference&#xff09;在TypeScript中的区别 如下&#xff1a; 定义&#xff1a; 类型断言&#xff1a;是程序员明确指定一个值的类型&#xff0c;即允许变量从一种类型更改为另一种类型。它不会进行…...

Spring-Spring、IoC、DI、注解开发

1、Spring是什么 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。 Spring整体架构 Spring优点&#xff1a; Spring属于低侵入设计。IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合&#xff0c;实现各个层之间的解耦&#xff0c;让我们更专注于业务…...

Facebook的未来蓝图:从元宇宙到虚拟现实的跨越

随着科技的不断演进和社会的数字化转型&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;作为下一代计算平台正逐渐走进人们的视野。作为全球领先的科技公司之一&#xff0c;Facebook正在积极探索并推动这一领域的发展&#xff0c;以实现其…...

Redis6.2.1版本集群新加副本

测试数据 通过redis-benchmark生成测试数据 ./bin/redis-benchmark -h 172.31.4.18 -p 6381 -a Redis_6.2.1_Sc --cluster -t set -d 128 -n 10000000 -r 100000000 -c 200新加节点 172.31.4.18:6381> AUTH Redis_6.2.1_Sc OK172.31.4.18:6381> cluster meet 172.31.4…...

2.The DispatcherServlet

The DispatcherServlet Spring的Web MVC框架与许多其他Web MVC框架一样&#xff0c;是请求驱动的&#xff0c;围绕一个中央Servlet&#xff08;即DispatcherServlet&#xff09;设计&#xff0c;该Servlet将请求分派给控制器&#xff0c;并提供其他功能以促进Web应用程序的开发…...

bug定位策略

前提--用户环境层面 hosts异常&#xff1a;hosts文件主要是加快某个域名或者网站的解析速度&#xff0c;从而达到快速访问的作用&#xff0c;也可以屏蔽网站。hosts异常可能会导致部分网页无法访问&#xff0c;能够加载&#xff0c;但是网页无法正常显示&#xff1b;测试环境脏…...

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…...

内存函数(C语言)

内存函数 以下函数的头文件&#xff1a;string.h 针对内存块进行处理的函数 memcpy 函数原型&#xff1a; void* memcpy(void* destination, const void* source, size_t num);目标空间地址 源空间地址num&#xff0c;被拷贝的字节个数 返回目标空间的起始地…...

力扣 哈希表刷题回顾

哈希表理论总结 什么时候用哈希表&#xff0c;快速判断一个元素是否出现在集合中时&#xff0c;用哈希这种空间换时间的方法。 哈希函数与哈希碰撞 哈希函数是指将key映射到对应的哈希表上 哈希碰撞是指映射的过程中容易出现多对一的情况&#xff0c;用什么方法解决拉链法和…...

Qt 统计图编程

学习目标&#xff1a;Qt 折线图&#xff0c;柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…...