pytorch深度学习框架基本介绍

目录

  • 1. PyTorch简介
    • 1.1 什么是PyTorch
    • 1.2 PyTorch的特点
  • 2. 安装与配置
    • 2.1 安装PyTorch
    • 2.2 配置CUDA环境
  • 3. 基础概念
    • 3.1 张量(Tensor)
      • 3.1.1 创建张量
      • 3.1.2 张量的类型转换
    • 3.2 自动微分(Autograd)
  • 4. 构建神经网络
    • 4.1 定义网络结构
    • 4.2 使用nn.Module
  • 5. 数据加载与处理
    • 5.1 使用DataLoader
    • 5.2 数据预处理
  • 6. 训练与评估
    • 6.1 训练模型
    • 6.2 评估模型
  • 7. 模型保存与加载
    • 7.1 保存模型参数
    • 7.2 加载模型参数

1. PyTorch简介

1.1 什么是PyTorch

PyTorch是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等应用。它由Facebook的人工智能研究团队开发,并且得到了许多研究机构和企业的支持。PyTorch的核心是一个强大的张量计算包,类似于NumPy,但是它能够利用GPU进行加速计算。

PyTorch的设计哲学是简洁和直观,它提供了动态计算图(Dynamic Computation Graph),也称为自动微分系统,这使得构建和修改复杂的神经网络变得更加容易。此外,PyTorch还具有以下特点:

  • 易用性:PyTorch的API设计简洁,易于上手。
  • 灵活性:动态图使得模型的构建和调试更加灵活。
  • 高效性:能够利用GPU加速计算,提高训练和推理的速度。
  • 社区支持:拥有活跃的社区,提供了大量的教程和预训练模型。

1.2 PyTorch的特点

  • 动态计算图
    PyTorch的动态计算图是其最显著的特点之一。它允许用户在运行时修改图形,并且可以按需进行计算。这与传统的静态图框架(如TensorFlow 1.x)相比,提供了更大的灵活性。

  • 自动微分
    PyTorch的自动微分系统是构建在动态计算图之上的。它允许用户轻松地计算梯度,这对于训练神经网络至关重要。PyTorch的autograd模块是实现这一功能的核心。

  • 丰富的API
    PyTorch提供了丰富的API,包括但不限于张量操作、神经网络层、优化器和损失函数。这些API使得用户可以轻松地构建复杂的模型。

  • 多语言支持
    虽然PyTorch最初是用Python编写的,但它也支持C++和CUDA,这使得它在性能和灵活性之间取得了平衡。

  • 社区和生态系统
    PyTorch拥有一个活跃的社区,提供了大量的教程、工具和预训练模型。此外,PyTorch与许多其他库(如NumPy、SciPy和MATLAB)兼容,这使得它在科学计算和数据分析中也非常有用。

2. 安装与配置

2.1 安装PyTorch

PyTorch是一个开源的机器学习库,广泛用于计算机视觉、自然语言处理等人工智能领域。它提供了强大的GPU加速的张量计算能力,以及构建深度学习模型的动态计算图。

安装PyTorch的步骤如下:

  1. 确定Python版本:PyTorch支持Python 3.6到3.9,确保你的Python环境符合要求。

  2. 选择安装包:根据你的系统(Windows、MacOS或Linux)和CUDA版本(如果有GPU),选择合适的安装包。

  3. 使用pip安装:打开终端或命令提示符,输入以下命令之一安装PyTorch:

    • 对于没有GPU或不使用CUDA的用户:

      pip install torch torchvision
      
    • 对于使用CUDA的用户,需要指定CUDA版本,例如CUDA 11.1:

      pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu111
      
  4. 验证安装:安装完成后,可以通过运行以下Python代码来验证PyTorch是否安装成功:

    import torch
    print(torch.__version__)
    

2.2 配置CUDA环境

为了充分利用PyTorch的GPU加速能力,需要正确配置CUDA环境。

配置CUDA的步骤如下:

  1. 检查GPU和CUDA:首先,确保你的计算机有NVIDIA GPU,并且安装了正确版本的CUDA Toolkit。
  2. 安装CUDA驱动:如果尚未安装,需要从NVIDIA官网下载并安装相应的驱动程序。
  3. 安装cuDNN:对于深度学习应用,cuDNN(CUDA Deep Neural Network library)是可选但推荐的加速库。从NVIDIA官网下载与CUDA版本相匹配的cuDNN,并按照官方指南进行安装。
  4. 设置环境变量:确保CUDA相关的路径被添加到系统的环境变量中,以便PyTorch能够找到CUDA库。
  5. 验证CUDA支持:在Python中运行以下代码来检查PyTorch是否能够使用CUDA:
    import torch
    print(torch.cuda.is_available())
    

如果torch.cuda.is_available()返回True,则表示PyTorch已经成功配置了CUDA支持。接下来,你可以开始使用PyTorch进行深度学习模型的训练和推理了。

3. 基础概念

3.1 张量(Tensor)

3.1.1 创建张量

张量是PyTorch中最基本的数据结构,用于表示多维的数据数组,可以运行在CPU或GPU上。张量的创建和操作是进行深度学习的基础。

  • torch.tensor 根据指定数据创建张量
  • torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量
  • torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量
  • torch.IntTensor()、torch.FloatTensor()、torch.DoubleTensor() 创建指定类型的张量
  • torch.random.initial_seed()查看随机种子
  • torch.random.manual_seed() 设置随机数种子
  • torch.randn() 创建随机张量
import torch# 创建一个5x3的张量,元素初始化为0
tensor = torch.zeros(5, 3)# 创建一个5x3的张量,元素初始化为1
ones_tensor = torch.ones(5, 3)# 创建一个5x3的张量,元素值为随机数
rand_tensor = torch.rand(5, 3)# 创建一个张量并指定数据类型
float_tensor = torch.tensor([[1.0, 2.0], [3.0, 4.0]], dtype=torch.float32)# 张量的基本操作
tensor_add = tensor + ones_tensor  # 张量相加
tensor_mul = tensor * 2           # 张量乘以标量#  创建随机张量
data = torch.randn(2, 3)  # 创建2行3列张量
print(data)
>>> tensor([[-0.5209, -0.2439, -1.1780],[ 0.8133,  1.1442,  0.6790]])# 查看随机数种子
print('随机数种子:', torch.random.initial_seed())
>>> 随机数种子: 4508475192273306739# 设置随机数种子 
torch.random.manual_seed(100)
data = torch.randn(2, 3)
print(data)
print('随机数种子:', torch.random.initial_seed())
>>> tensor([[ 0.3607, -0.2859, -0.3938],[ 0.2429, -1.3833, -2.3134]])随机数种子: 100

3.1.2 张量的类型转换

  • 张量转换为NUMPY数组
# 1. 将张量转换为 numpy 数组
data_tensor = torch.tensor([2, 3, 4])
# 使用张量对象中的 numpy 函数进行转换
data_numpy = data_tensor.numpy()
print(type(data_tensor))
>>> <class 'torch.Tensor'>print(type(data_numpy))
>>> <class 'numpy.ndarray'># 注意: data_tensor 和 data_numpy 共享内存
# 修改其中的一个,另外一个也会发生改变
# data_tensor[0] = 100
data_numpy[0] = 100
print(data_tensor)
>>> tensor([100,   3,   4])print(data_numpy)
>>> [100   3   4]# 2. 对象拷贝避免共享内存
data_tensor = torch.tensor([2, 3, 4])
# 使用张量对象中的 numpy 函数进行转换,通过copy方法拷贝对象
data_numpy = data_tensor.numpy().copy()
print(type(data_tensor))
>>> <class 'torch.Tensor'>print(type(data_numpy))
>>> <class 'numpy.ndarray'># 注意: data_tensor 和 data_numpy 此时不共享内存
# 修改其中的一个,另外一个不会发生改变
# data_tensor[0] = 100
data_numpy[0] = 100
print(data_tensor)
>>> tensor([2, 3, 4])print(data_numpy)
>>> [100   3   4]
  • NUMPY数组转换为张量
    使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享。
data_numpy = np.array([2, 3, 4])
# 将 numpy 数组转换为张量类型
# 1. from_numpy
# 2. torch.tensor(ndarray)
data_tensor = torch.from_numpy(data_numpy)
# nunpy 和 tensor 共享内存
# data_numpy[0] = 100
data_tensor[0] = 100
print(data_tensor)
>>> tensor([100,   3,   4], dtype=torch.int32)print(data_numpy)
>>> [100   3   4]
  • 使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。
data_numpy = np.array([2, 3, 4])
data_tensor = torch.tensor(data_numpy)
# nunpy 和 tensor 不共享内存
# data_numpy[0] = 100
data_tensor[0] = 100
print(data_tensor)
>>> tensor([100,   3,   4], dtype=torch.int32)print(data_numpy)
>>> [2 3 4]
  • 标量张量和数字转换
# 当张量只包含一个元素时, 可以通过 item() 函数提取出该值
data = torch.tensor([30,])
print(data.item())
>>> 30data = torch.tensor(30)
print(data.item())
>>> 30

3.2 自动微分(Autograd)

自动微分是PyTorch中用于自动计算导数的系统,它是构建神经网络和执行反向传播的关键。

# 创建一个需要梯度的张量
x = torch.tensor([3.0], requires_grad=True)# 进行一些操作
y = x ** 2# 计算导数
z = y.mean()
z.backward()# 输出梯度
print(x.grad)  # 梯度为6.0,因为y = 3^2 = 9,对x求导得到2*3=6

在自动微分中,每个Tensor对象都有一个grad属性,它保存了当前Tensor的梯度。当进行反向传播时,grad属性会被自动更新。

# 定义一个简单的函数
def f(x):return x ** 2 + 2 * x# 创建一个需要梯度的张量
x = torch.tensor([1.0, 2.0], requires_grad=True)# 计算函数值
y = f(x)# 反向传播计算梯度
y.backward()# 输出梯度
print(x.grad)  # 梯度为[2.0, 6.0],因为f(x) = x^2 + 2x,对x求导得到2*x+2

在实际应用中,自动微分系统允许我们通过定义前向传播过程,然后调用backward()方法来自动计算损失函数对模型参数的梯度,进而进行参数更新。这是训练神经网络的基础。

4. 构建神经网络

4.1 定义网络结构

在PyTorch中,构建神经网络通常涉及定义网络层、前向传播函数以及初始化网络参数。下面是一个简单的神经网络定义示例,包括卷积层、池化层和全连接层。

import torch
import torch.nn as nn
import torch.nn.functional as Fclass SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()# 定义卷积层self.conv1 = nn.Conv2d(1, 32, kernel_size=5, stride=1, padding=2)# 定义池化层self.pool = nn.MaxPool2d(kernel_size=2, stride=2)# 定义全连接层self.fc1 = nn.Linear(32 * 7 * 7, 1024)self.fc2 = nn.Linear(1024, 10)def forward(self, x):# 卷积操作后接激活函数x = self.pool(F.relu(self.conv1(x)))# 展平操作,准备进入全连接层x = x.view(-1, 32 * 7 * 7)# 全连接层后接激活函数x = F.relu(self.fc1(x))# 输出层x = self.fc2(x)return x# 实例化网络
net = SimpleCNN()
print(net)

4.2 使用nn.Module

nn.Module 是 PyTorch 中所有网络模块的基类,它提供了一些基础功能,比如参数注册、设备移动等。下面是一个使用 nn.Module 的示例:

class MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()# 定义网络层self.linear = nn.Linear(10, 5)def forward(self, x):# 前向传播return self.linear(x)# 实例化模块
module = MyModule()
print(module)# 使用模块
input = torch.randn(1, 10)  # 假设输入是一个1x10的张量
output = module(input)
print(output)

在这两个示例中,我们定义了两个简单的网络结构,并展示了如何使用 nn.Module 来构建和使用网络。第一个示例是一个具有卷积层和全连接层的卷积神经网络,用于图像分类任务。第二个示例则是一个简单的线性网络模块,展示了如何定义和使用自定义的网络层。

5. 数据加载与处理

5.1 使用DataLoader

在PyTorch中,DataLoader 是一个至关重要的组件,它提供了对数据加载和批处理的高级接口。使用 DataLoader 可以轻松实现多线程数据加载,从而提高数据加载效率。

from torch.utils.data import DataLoader, Datasetclass CustomDataset(Dataset):def __init__(self, data):self.data = datadef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx]# 假设我们有一些数据和标签
data = [...]
labels = [...]# 创建数据集实例
dataset = CustomDataset(list(zip(data, labels)))# 初始化DataLoader
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)for data, labels in dataloader:# 在这里使用你的数据和标签进行训练pass

5.2 数据预处理

数据预处理是机器学习中的一个重要步骤,它可以帮助模型更好地学习和泛化。在PyTorch中,我们通常使用 transforms 来实现数据的预处理。

from torchvision import transforms# 定义数据预处理步骤
transform = transforms.Compose([transforms.ToTensor(),  # 将数据转换为Tensortransforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),  # 标准化
])# 应用预处理到数据集
dataset = CustomDataset(data, transform=transform)

在实际使用中,我们经常需要对图像数据进行预处理,如调整大小、裁剪、旋转等。torchvision.transforms 提供了丰富的预处理方法,可以根据需要进行选择和组合。通过将预处理步骤集成到 DataLoader 中,可以确保数据在训练过程中以正确的格式和顺序被加载。

6. 训练与评估

6.1 训练模型

训练模型是深度学习中的核心环节,PyTorch 提供了强大的 API 来支持模型的训练过程。以下是训练模型的基本步骤:

  • 初始化模型和优化器:首先需要定义模型的架构并初始化一个优化器,例如 SGD 或 Adam。
import torch
import torch.nn as nn
import torch.optim as optim# 定义模型
model = MyModel()  # 假设 MyModel 是你定义的模型类# 定义损失函数
criterion = nn.CrossEntropyLoss()# 选择优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)
  • 准备数据:使用 DataLoader 来加载数据,并进行批处理和打乱。
from torch.utils.data import DataLoader
from torchvision import datasets# 加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor())
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
  • 训练循环:在每个 epoch 中迭代数据集,执行前向传播、计算损失、执行反向传播并更新模型权重。
# 设置训练的轮数
num_epochs = 10for epoch in range(num_epochs):for i, (inputs, labels) in enumerate(train_loader):# 前向传播outputs = model(inputs)loss = criterion(outputs, labels)# 清空梯度optimizer.zero_grad()# 反向传播loss.backward()# 更新权重optimizer.step()if (i+1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

6.2 评估模型

评估模型是为了验证模型在测试集上的表现,通常在训练过程中的每个 epoch 结束后进行。

  • 设置模型为评估模式:在评估之前,需要将模型设置为评估模式,以关闭 Dropout 等特定于训练的技术。
model.eval()  # 将模型设置为评估模式
  • 评估循环:与训练循环类似,但在评估过程中不执行反向传播。
correct = 0
total = 0with torch.no_grad():  # 不计算梯度,减少内存消耗for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy of the model on the test images: {100 * correct / total}%')

请注意,上述代码示例中的 MyModeltransformstest_loader 需要根据你的具体情况进行定义和初始化。此外,评估模型时通常使用验证集或测试集,而不是训练集。

7. 模型保存与加载

7.1 保存模型参数

在PyTorch中,模型的保存通常涉及到保存模型的参数(state_dict),这样我们就可以在以后重新加载模型并继续训练或进行预测,而无需重新训练整个模型。以下是保存模型参数的示例代码:

import torch
import torch.nn as nn# 假设我们有一个简单的神经网络模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 5)def forward(self, x):return self.linear(x)# 实例化模型并将其移动到GPU(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleModel().to(device)# 假设我们已经有了一些训练好的参数
# 这里我们随机初始化一些参数作为示例
model.linear.weight.data = torch.randn(5, 10)
model.linear.bias.data = torch.randn(5)# 保存模型的state_dict
torch.save(model.state_dict(), "model_parameters.pth")

7.2 加载模型参数

加载模型参数是将之前保存的参数重新加载到模型中。这可以在模型训练中断后继续训练,或者在不同的环境中使用训练好的模型。以下是加载模型参数的示例代码:

# 假设我们要加载之前保存的模型参数
# 首先,我们需要定义与保存参数时相同的模型结构
model = SimpleModel().to(device)# 加载保存的state_dict
model.load_state_dict(torch.load("model_parameters.pth"))# 将模型设置为评估模式
model.eval()# 现在可以使用加载的模型进行预测或继续训练
# 例如,进行预测
inputs = torch.randn(1, 10).to(device)
outputs = model(inputs)
print(outputs)

请注意,加载模型参数时,模型的结构定义必须与保存参数时的结构完全一致。如果结构不匹配,加载参数时会出现错误。此外,确保模型和保存的参数在同一设备上(CPU或GPU)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯技术创作特训营 -- SUPERWINNIE -- AI重塑社交内容

目录 1 什么是AI社交内容 2 案例拆解 3 用LLM做爆文选题 4 用LLM出爆文脚本提示词 1 什么是AI社交内容 任何一个因素被AI取代都是AI社交内容 2 案例拆解 数字人 资讯素材 录屏产品的素材&#xff08;小红书测试AI产品&#xff09; 脚本 素材 剪辑 3 用LLM做爆文选题 &…

帝国神话怎么样使用服务器开服(Myth Of Empires)

1、购买后登录服务器&#xff08;百度莱卡云&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、创建端口 一共需要用到三个端口&#xff08;游戏端口&#xff0c;查询端口&#x…

【刷题汇总 -- 压缩字符串(一)、chika和蜜柑、 01背包】

C日常刷题积累 今日刷题汇总 - day0181、压缩字符串(一)1.1、题目1.2、思路1.3、程序实现 2、chika和蜜柑2.1、题目2.2、思路2.3、程序实现 3、 01背包3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day018 1、压缩字符串(一) 1.1、题目 1.2、思路 读完…

vue3 vue页面根目录增加注释 keep-alive 不生效 需避开此位置

已参考官方文档如下&#xff0c;进行配置 Built-in Components | Vue.js 对应页面中配置 name defineOptions({name: "Users",inheritAttrs: false, }); 从Vue Devtools可以看到组件名字变成了Users&#xff0c;如下&#xff1a; 已配置一致后&#xff0c;仍不生…

JavaRegexImprove练习(1) (2024.7.22)

ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…

【Linux】进程信号 --- 信号保存

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【医学影像】RK3588+FPGA:满足远程诊疗系统8K音视频编解码及高效传输需求

医学影像 提供基于Intel平台、NXP平台、Rockchip平台的核心板、Mini-ITX主板、PICO-ITX主板以及工业整机等计算机硬件。产品板载内存&#xff0c;集成超高清编码/解码视频引擎&#xff0c;具有出色的数据处理能力和图形处理能力&#xff0c;功能高集成&#xff0c;可应用于超声…

【教学类-69-01】20240721铠甲勇士扑克牌涂色(男孩篇)

背景需求&#xff1a; 【教学类-68-01】20240720裙子涂色&#xff08;女孩篇&#xff09;-CSDN博客文章浏览阅读250次。【教学类-68-01】20240720裙子涂色&#xff08;女孩篇&#xff09;https://blog.csdn.net/reasonsummer/article/details/140578153 前期制作了女孩涂色延…

Linux-查看dd命令进度

查看dd命令进度 一、概述1. 在一个终端执行拷贝任务2. 在另一终端执行进度命令 一、概述 在使用 dd 命令做拷贝大量数据的时候&#xff0c;因为并没有输出&#xff0c;所以比较难判断当前进度&#xff0c;因此可以使用下面的命令作为进度查看 1. 在一个终端执行拷贝任务 例如…

直播带货|主播、运营怎么考核 怎么分钱

在直播公司中&#xff0c;有两个非常重要的岗位&#xff1a;直播运营和主播。那么&#xff0c;直播公司应该如何正确发放工资呢&#xff1f;许多公司为这两个岗位的工资发放采取的是销售额提成的方式。 销售额提成存在一个问题&#xff1a;直播公司很容易通过广告费来刺激销售额…

华为eNSP模拟器安装

文章目录 华为设备设备与VRP简介 华为设备设备与VRP简介 四大引擎 交换机 &#xff1a; 华为交换机: 目前分别为数据中心交换机&#xff0c;园区交换机&#xff0c;个人与中心企业交换机 主要用于满足不同企业规模的应用 大中小型网路对网路带宽&#xff0c;影响速度&#xf…

MT6825磁编码IC在智能食品包装设备的应用

艾毕胜马达控制平台专家 MT6825磁编码IC&#xff0c;作为一款先进的传感器解决方案&#xff0c;在智能食品包装设备中的应用正日益广泛 MT6825磁编码IC&#xff0c;作为一款先进的传感器解决方案&#xff0c;在智能食品包装设备中的应用正日益广泛。它凭借卓越的性能和可靠性…

Windows及Linux系统加固

君衍. 一、Windows加固1、配置简介2、账户配置3、本地配置4、安全设置 二、Linux加固1、配置简介2、网络配置3、日志和审计配置4、访问认证和授权配置5、系统运维配置 一、Windows加固 1、配置简介 通常在Windows安全配置中有两类对象 一类是Windows Server&#xff0c;如win …

功能测试与APPSCAN自动化测试结合的提高效率测试策略

背景 手工探索性测试&#xff08;Manual Exploratory Testing&#xff0c;简称MET&#xff09;是一种软件测试方法&#xff0c;它依赖于测试人员的直觉、经验和即兴发挥来探索应用程序或系统。与传统的脚本化测试相比&#xff0c;手工探索性测试不遵循固定的测试脚本&#xff0…

智能马桶的优点和缺点分别有哪些

智能马桶相比传统马桶&#xff0c;具有众多显著的优点&#xff0c;这些优点不仅提升了使用的舒适度&#xff0c;还增加了卫生性和便利性。以下是智能马桶的一些主要优点&#xff1a; 卫生性提升&#xff1a; 智能马桶通常配备有自动冲洗和座圈加热功能&#xff0c;避免了与冰冷…

npm下载包-更改默认缓存目录

npm&#xff08;Node Package Manager&#xff09;的缓存目录是npm用于存储已下载包的本地位置&#xff0c;以便在后续安装相同包时能够快速复用&#xff0c;从而节省时间和带宽。npm缓存目录的具体位置会根据操作系统的不同而有所差异。 Windows系统 在Windows系统中&#x…

敲详细的springboot中使用RabbitMQ的源码解析

这里介绍的源码主要是涉及springboot框架下的rabbitmq客户端代码&#xff08;具体在springframework.amqp.rabbit包下&#xff0c;区分一下不由springboot直接接管的spring-rabbit的内容&#xff09;&#xff0c;springboot基于RabbitMQ的Java客户端建立了简便易用的框架。 sp…

重生之我在学数据结构——队列

一.队列的概念 队列是一种先进先出(First In First Out &#xff0c;FIFO)的数据结构&#xff0c;可以简单理解为排队的概念。在队列中&#xff0c;数据项按照插入的顺序排列&#xff0c;并且只能在队列的一端插入&#xff08;称为队尾&#xff09;&#xff0c;在另一端删除&a…

品牌策划新手指南:如何让你的品牌脱颖而出?

品牌策划&#xff0c;简单来说&#xff0c;就是为品牌制定一套全方位的成长和发展计划&#xff0c;就像给品牌设计一条成长路线图&#xff0c;让它能够更好地吸引顾客、建立信任、提升知名度&#xff0c;最终实现销售和市场份额的增长。 品牌策划是什么&#xff1f; 想象一下…

【前端】JavaScript入门及实战51-55

文章目录 51 函数52 函数的参数53 返回值54 练习55 return 51 函数 <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <script type"text/javascript">/* 函数&#xff1a;1. 函数也是…