深度剖析 PyTorch框架:从基础概念到高级应用的深度学习之旅!
目录
一、引言
二、PyTorch 简介
(一)诞生背景与发展历程
(二)核心特点
三、PyTorch 基础概念
(一)张量(Tensor):数据的基石
(二)自动微分(Autograd):梯度计算的利器
(三)计算图(Computational Graph):模型计算的脉络
四、PyTorch 操作使用
(一)安装与配置:开启 PyTorch 之旅
(二)神经网络构建模块:搭建模型的基石
(三)优化算法:驱动模型训练的引擎
(四)数据加载与预处理:模型训练的保障
(五)模型训练、评估与推理:完整的模型生命周期
五、PyTorch 进阶应用
(一)模型保存与加载
(二)使用 GPU 加速
(三)自定义层和模块
(四)分布式训练
(五)量化
六、PyTorch 生态圈
(一)torchvision
(二)torchaudio
(三)torchtext
七、总结
一、引言
在深度学习领域,PyTorch 以其简洁易用、动态计算图等特性脱颖而出,深受开发者和研究人员的喜爱。本文将深入探讨 PyTorch 深度学习框架,从基础概念到实际操作,再到高级应用,结合丰富的实际案例,帮助读者全面掌握这一强大工具,无论是初学者还是有一定基础的读者,都能从中获得有价值的知识和实践经验。
二、PyTorch 简介
(一)诞生背景与发展历程
PyTorch 由 Facebook 人工智能研究实验室(FAIR)开发,于 2017 年开源。它基于 Torch 框架,借助 Python 语言的优势,迅速在深度学习社区中传播开来。随着不断的更新迭代,PyTorch 功能日益丰富,社区也越发活跃,成为了深度学习领域的重要框架之一。
(二)核心特点
- 动态计算图:与静态计算图不同,PyTorch 的动态计算图在运行时构建,这使得开发者能够像编写普通 Python 代码一样进行调试和修改,大大提高了开发效率。例如,在开发一个图像分类模型时,我们可以在运行过程中随时修改网络结构,实时观察模型的变化。
- 简洁易用的 API:PyTorch 的 API 设计简洁直观,符合 Python 的编程习惯。这使得初学者能够快速上手,而有经验的开发者也能高效地构建复杂模型。
- 强大的 GPU 支持:PyTorch 能够充分利用 GPU 的并行计算能力,显著加速模型的训练和推理过程。对于大规模数据集和复杂模型,GPU 加速尤为重要。
- 丰富的生态系统:PyTorch 拥有庞大的开源社区,开发者可以在社区中获取大量的代码示例、教程、预训练模型等资源。同时,torchvision、torchaudio、torchtext 等扩展库,为不同领域的应用提供了有力支持。
三、PyTorch 基础概念
(一)张量(Tensor):数据的基石
张量是 PyTorch 中处理数据的基本单元,是向量和矩阵在高维空间的泛化。在深度学习中,无论是输入数据、模型参数还是中间计算结果,都以张量的形式存在。
创建张量的方式多种多样,例如:
import torch# 从Python列表创建张量
tensor_from_list = torch.tensor([1, 2, 3])# 使用内置函数创建张量
zeros_tensor = torch.zeros(2, 3)
ones_tensor = torch.ones(2, 3)
rand_tensor = torch.rand(2, 3)# 从已有张量创建
new_tensor = torch.ones_like(rand_tensor)# 从NumPy数组创建
import numpy as np
numpy_array = np.array([1, 2, 3])
tensor_from_numpy = torch.from_numpy(numpy_array)
PyTorch 提供了丰富的张量操作函数,包括算术操作、形状操作、索引切片、数学函数和统计函数等。
# 算术操作
sum_tensor = torch.add(tensor_from_list, tensor_from_list)# 形状操作
reshaped_tensor = tensor_from_list.view(3, 1)# 索引、切片和连接
sliced_tensor = tensor_from_list[:2]# 数学函数
sqrt_tensor = torch.sqrt(tensor_from_list)# 统计函数
max_value = torch.max(tensor_from_list)
(二)自动微分(Autograd):梯度计算的利器
在深度学习模型训练中,计算损失函数相对于模型参数的梯度是关键步骤。PyTorch 的autograd
包提供了强大的自动微分功能,能够自动追踪张量的运算历史,实现高效的梯度计算。
# 创建一个需要计算梯度的张量
x = torch.ones(2, 2, requires_grad=True)# 进行张量操作
y = x + 2
z = y * y * 3
out = z.mean()# 反向传播计算梯度
out.backward()# 查看梯度
print(x.grad)
在某些情况下,我们可能需要停止梯度追踪,以节省计算资源或避免不必要的梯度计算。可以使用detach()
方法或with torch.no_grad():
代码块来实现。
# 使用detach()方法停止梯度追踪
x_detached = x.detach()# 使用with torch.no_grad()代码块停止梯度追踪
with torch.no_grad():y = x + 2
对于高级用户,还可以自定义梯度函数。例如,自定义 ReLU 函数的梯度:
import torchclass MyReLU(torch.autograd.Function):@staticmethoddef forward(ctx, input_tensor):ctx.save_for_backward(input_tensor)output_tensor = input_tensor.clamp(min=0)return output_tensor@staticmethoddef backward(ctx, grad_output):input_tensor, = ctx.saved_tensorsgrad_input = grad_output.clone()grad_input[input_tensor < 0] = 0return grad_input# 使用自定义的ReLU函数
relu = MyReLU.apply
x = torch.randn(5, 5, requires_grad=True)
y = relu(x)# 计算梯度
z = y.sum()
z.backward()# 查看梯度
print(x.grad)
(三)计算图(Computational Graph):模型计算的脉络
计算图是一种有向图,用于描述从输入数据和初始参数到输出结果的计算流程,在深度学习中对梯度计算和模型优化起着关键作用。
PyTorch 主要采用动态计算图,每一次前向传播都会构建一个新的计算图。这种动态特性使得模型构建更加灵活,但也可能会消耗更多的内存和计算资源。
四、PyTorch 操作使用
(一)安装与配置:开启 PyTorch 之旅
安装 PyTorch 可以根据自己的系统环境和需求选择不同的方式。推荐使用conda
或pip
进行安装。
# 使用pip安装CPU版本
pip install torch torchvision# 使用pip安装GPU版本(需先安装对应CUDA版本)
pip install torch torchvision torchaudio -f https://download.pytorch.org/whl/cu102/torch_stable.html# 使用conda安装CPU版本
conda install pytorch torchvision cpuonly -c pytorch# 使用conda安装GPU版本
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch
安装完成后,可以通过运行以下代码验证安装是否成功:
import torch
print(torch.__version__)
(二)神经网络构建模块:搭建模型的基石
1. 模块(nn.Module):模型的架构核心
在 PyTorch 中,nn.Module
是构建神经网络的基础类。自定义网络层或整个神经网络都需要继承该类,并实现__init__
和forward
方法。
例如,定义一个简单的线性回归模型:
import torch
import torch.nn as nnclass LinearRegressionModel(nn.Module):def __init__(self, input_dim, output_dim):super(LinearRegressionModel, self).__init__()self.linear = nn.Linear(input_dim, output_dim)def forward(self, x):out = self.linear(x)return out# 创建模型实例
model = LinearRegressionModel(1, 1)
nn.Module
能够自动跟踪可训练参数,我们可以使用parameters()
或named_parameters()
方法来获取模型中的所有参数。
# 打印模型的参数
for name, param in model.named_parameters():print(name, param.data)
nn.Module
支持嵌套结构,这为构建复杂网络架构提供了便利。例如,构建一个简单的多层神经网络:
2. 激活函数:引入非线性的桥梁
激活函数在神经网络中起着至关重要的作用,它为模型引入非线性特性,使神经网络能够逼近复杂的函数关系。
常见的激活函数有 ReLU、Sigmoid、Tanh、Leaky ReLU 和 Softmax 等。在 PyTorch 中,可以方便地使用这些激活函数。
import torch.nn as nn# 使用ReLU激活函数
relu = nn.ReLU()# 使用Sigmoid激活函数
sigmoid = nn.Sigmoid()# 使用Tanh激活函数
tanh = nn.Tanh()# 使用Leaky ReLU激活函数
leaky_relu = nn.LeakyReLU(0.01)# 使用Softmax激活函数
softmax = nn.Softmax(dim=1)
在实际应用中,通常在定义网络结构时将激活函数作为一个层添加到nn.Sequential
容器中,或者在forward
方法中直接调用。
3. nn.Sequential:快速搭建模型的便捷工具
nn.Sequential
是 PyTorch 提供的一个容器模块,用于快速堆叠不同的层,构建顺序执行的模型结构。
import torch
import torch.nn as nn# 使用nn.Sequential构建简单多层感知机
model = nn.Sequential(nn.Linear(64, 128),nn.ReLU(),nn.Linear(128, 10)
)# 随机生成一个输入张量
input_tensor = torch.randn(16, 64)# 使用模型进行前向传播
output_tensor = model(input_tensor)
nn.Sequential
支持嵌套使用,并且可以使用OrderedDict
为每一层命名。
4. 损失函数:衡量模型性能的标尺
损失函数用于量化模型预测结果与真实数据之间的差异,是模型训练的关键要素之一。
PyTorch 提供了多种内置的损失函数,如均方误差损失(MSE)、交叉熵损失等。
import torch
import torch.nn as nn# 均方误差损失(用于回归问题)
criterion_mse = nn.MSELoss()
prediction_mse = torch.randn(3, 5, requires_grad=True)
target_mse = torch.randn(3, 5)
loss_mse = criterion_mse(prediction_mse, target_mse)# 交叉熵损失(用于分类问题)
criterion_ce = nn.CrossEntropyLoss()
prediction_ce = torch.randn(3, 5, requires_grad=True)
target_ce = torch.empty(3, dtype=torch.long).random_(5)
loss_ce = criterion_ce(prediction_ce, target_ce)
我们还可以自定义损失函数,例如:
class MyCustomLoss(nn.Module):def __init__(self):super(MyCustomLoss, self).__init__()def forward(self, prediction, target):loss = (prediction - target).abs().mean()return loss# 使用自定义损失函数
criterion_custom = MyCustomLoss()
prediction_custom = torch.randn(3, 5, requires_grad=True)
target_custom = torch.randn(3, 5)
loss_custom = criterion_custom(prediction_custom, target_custom)
(三)优化算法:驱动模型训练的引擎
1. 梯度下降(Gradient Descent)及其变体
梯度下降是优化模型的基本算法,其核心原理是沿着目标函数梯度的反方向逐步更新参数,以寻找使函数值最小化的参数值。
在 PyTorch 中,梯度下降的变体如批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent,SGD)和小批量梯度下降(Mini - batch Gradient Descent)都有相应的实现。
例如,使用小批量梯度下降训练一个简单的线性模型:
2. 其他优化算法(如 Adam, RMSProp 等)
除了梯度下降及其变体,PyTorch 还支持多种其他优化算法。
例如,使用 Adam 优化器:
import torch.optim as optim# 创建模型(假设已定义好模型结构)
model = nn.Linear(2, 1)# 定义损失函数和Adam优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
使用 RMSProp 优化器:
import torch.optim as optim# 创建模型(假设已定义好模型结构)
model = nn.Linear(2, 1)# 定义损失函数和RMSProp优化器
criterion = nn.MSELoss()
optimizer = optim.RMSprop(model.parameters(), lr=0.01)
(四)数据加载与预处理:模型训练的保障
在深度学习中,数据加载和预处理是非常重要的环节。PyTorch 提供了torch.utils.data
模块来方便地处理数据加载和预处理。
1. 数据集(Dataset)
自定义数据集需要继承torch.utils.data.Dataset
类,并实现__len__
和__getitem__
方法。
例如,创建一个简单的自定义数据集:
2. 数据加载器(DataLoader)
DataLoader
用于将数据集按批次加载到模型中进行训练。
from torch.utils.data import DataLoader# 创建数据加载器,设置batch_size为2
data_loader = DataLoader(my_dataset, batch_size=2, shuffle=True)for batch_data, batch_labels in data_loader:print(batch_data)print(batch_labels)
3. 数据预处理
在实际应用中,通常需要对数据进行预处理。可以在__getitem__
方法内部实现预处理逻辑,或者使用torchvision.transforms
等工具。
例如,对图像数据进行预处理:
from torchvision import transforms# 定义图像预处理步骤
transform = transforms.Compose([transforms.ToPILImage(),transforms.Resize((128, 128)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
(五)模型训练、评估与推理:完整的模型生命周期
-
模型训练
以 MNIST 手写数字识别为例,展示完整的模型训练过程:
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim# 数据预处理
transform = transforms.Compose([transforms.ToTensor()])# 加载MNIST数据集
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)test_dataset = datasets.MNIST('./data', train=False, download=True, transform=transform)
test_loader = DataLoader
# 定义模型
class SimpleMLP(nn.Module):def __init__(self):super(SimpleMLP, self).__init__()self.fc1 = nn.Linear(28*28, 128)self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, 10)def forward(self, x):x = x.view(-1, 28*28)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return F.log_softmax(x, dim=1)model = SimpleMLP()
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()# 模型训练
for epoch in range(5):model.train()for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 == 0:print('Epoch: {} [{}/{}]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset), loss.item()))
-
模型评估
训练完成后,使用测试集对模型进行评估:
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():for data, target in test_loader:output = model(data)test_loss += criterion(output, target).item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)
print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))
-
模型推理
使用训练好的模型对新数据进行预测:
# 假设有新的数据
new_data = torch.randn(1, 28*28)
with torch.no_grad():output = model(new_data)_, predicted = torch.max(output.data, 1)print(f'Predicted label: {predicted.item()}')
五、PyTorch 进阶应用
(一)模型保存与加载
1. 保存模型
可以使用torch.save
方法保存模型的参数或整个模型。例如,保存模型参数:
torch.save(model.state_dict(),'model_params.pth')
保存整个模型:
torch.save(model,'model.pth')
2. 加载模型
加载模型参数:
loaded_model = SimpleMLP()
loaded_model.load_state_dict(torch.load('model_params.pth'))
加载整个模型:
loaded_full_model = torch.load('model.pth')
(二)使用 GPU 加速
1. 检查 GPU 是否可用
import torch
print(torch.cuda.is_available())
2. 指定设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
3. 将模型和数据移动到 GPU
model.to(device)
for data, target in train_loader:data, target = data.to(device), target.to(device)# 训练步骤optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()
4. 多 GPU 使用
如果有多个 GPU,可以使用nn.DataParallel
进行数据并行处理:
if torch.cuda.device_count() > 1:model = nn.DataParallel(model)
model.to(device)
(三)自定义层和模块
在实际应用中,可能需要自定义一些特殊的层或模块。例如,定义一个自定义的卷积层:
class MyConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):super(MyConv2d, self).__init__()self.weight = nn.Parameter(torch.randn(out_channels, in_channels, kernel_size, kernel_size))self.bias = nn.Parameter(torch.zeros(out_channels))self.stride = strideself.padding = paddingdef forward(self, x):return nn.functional.conv2d(x, self.weight, self.bias, stride=self.stride, padding=self.padding)
(四)分布式训练
分布式训练可以使用多个计算节点来加速深度学习模型的训练。在 PyTorch 中,分布式训练通常通过torch.distributed
API 来实现。
1. 初始化分布式环境
import torch.distributed as dist
dist.init_process_group(backend='nccl', init_method='tcp://localhost:23456', rank=0, world_size=1)
2.分布式数据并行
from torch.nn.parallel import DistributedDataParallel
model.to(device)
model = DistributedDataParallel(model)
3.示例代码
import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel# 初始化分布式环境
dist.init_process_group(backend='nccl')# 设备设置
device = torch.device("cuda")# 创建模型和数据
model = SimpleMLP()
model = model.to(device)
model = DistributedDataParallel(model)data_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 损失和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练循环
for epoch in range(5):for batch in data_loader:inputs, targets = batch[0].to(device), batch[1].to(device)# 前向传播outputs = model(inputs)# 计算损失loss = criterion(outputs, targets)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()
(五)量化
模型量化是一种减小模型大小和提高推理速度的技术,通常以牺牲一定量的模型准确性为代价。PyTorch 提供了一整套的量化工具,支持多种量化方法。
1. 静态量化示例
import torch
import torch.quantization# 准备模型和数据
model = torch.load('model.pth')
model.eval()# 指定量化配置并量化模型
quantized_model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8
)# 保存量化后的模型
torch.save(quantized_model.state_dict(), 'quantized_model.pth')
2. 动态量化示例
import torch
import torch.quantization# 准备模型和数据
model = torch.load('model.pth')
model.eval()# 量化模型
quantized_model = torch.quantization.quantize_dynamic(model)# 保存量化后的模型
torch.save(quantized_model.state_dict(), 'quantized_model.pth')
3. 量化感知训练示例
import torch
import torch.quantization# 准备模型
model = SimpleMLP()
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model, inplace=True)# 模型训练
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
for epoch in range(5):for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()# 转换为量化模型
torch.quantization.convert(model, inplace=True)
六、PyTorch 生态圈
(一)torchvision
torchvision 是一个与 PyTorch 配合使用的库,用于处理计算机视觉任务。
1. 预训练模型
torchvision 包含了许多预训练的模型,如 VGG、ResNet、MobileNet 等。这些模型可以用于迁移学习或直接用于推理。
import torchvision.models as modelsresnet18 = models.resnet18(pretrained=True)
2. 数据集
torchvision 包括常用的计算机视觉数据集,如 CIFAR-10、MNIST、ImageNet 等。
from torchvision.datasets import CIFAR10train_dataset = CIFAR10(root='./data', train=True, transform=None, download=True)
3. 数据转换
提供了多种用于图像处理和增强的转换方法。
from torchvision import transformstransform = transforms.Compose([transforms.RandomSizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
4. 示例
使用 torchvision 加载预训练模型并进行图像分类:
import torch
import torchvision.models as models
from torchvision import transforms
from PIL import Image# 加载预训练模型
model = models.resnet18(pretrained=True)
model.eval()# 图像预处理
input_image = Image.open("your_image.jpg")
preprocess = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0)# 推理
with torch.no_grad():output = model(input_batch)# 获取预测结果
_, predicted_idx = torch.max(output, 1)
print(predicted_idx)
(二)torchaudio
torchaudio 是一个专门用于处理音频数据和音频信号处理任务的库。
1. 主要功能
包括数据加载和保存、音频变换、预训练模型和数据集等。
import torchaudio# 读取音频文件
waveform, sample_rate = torchaudio.load('audio_file.wav')# 保存音频文件
torchaudio.save('output_audio_file.wav', waveform, sample_rate)import torchaudio.transforms as T# 创建声谱图
spectrogram = T.Spectrogram()(waveform)# 计算MFCC
mfcc = T.MFCC()(waveform)
2. 示例
使用 torchaudio 加载音频文件并计算其 MFCC:
import torchaudio
import torchaudio.transforms as T# 加载音频文件
waveform, sample_rate = torchaudio.load('audio_file.wav')# 计算MFCC
mfcc_transform = T.MFCC(sample_rate=sample_rate,n_mfcc=12,melkwargs={'n_fft': 400,'hop_length': 160,'center': False,'pad_mode':'reflect','power': 2.0,'norm':'slaney','onesided': True}
)
mfcc = mfcc_transform(waveform)print("MFCC Shape:", mfcc.shape)
(三)torchtext
torchtext 是一个用于文本处理的库,为自然语言处理(NLP)任务提供了一组工具。
1. 主要功能
涵盖数据加载、文本预处理、词汇表管理、批处理与数据迭代和预训练词向量等。
from torchtext.data import TabularDatasettrain_data, test_data = TabularDataset.splits(path='./data', train='train.csv', test='test.csv', format='csv',fields=[('text', TEXT), ('label', LABEL)]
)from torchtext.data import FieldTEXT = Field(tokenize=custom_tokenize, lower=True)TEXT.build_vocab(train_data, vectors="glove.6B.100d")from torchtext.data import Iterator, BucketIteratortrain_iter, test_iter = BucketIterator.splits((train_data, test_data), batch_size=32, sort_key=lambda x: len(x.text)
)
2. 示例
使用 torchtext 进行数据预处理:
from torchtext.data import Field, TabularDataset, BucketIterator# 定义字段
TEXT = Field(sequential=True, tokenize='spacy', lower=True)
LABEL = Field(sequential=False, use_vocab=False)# 创建数据集
fields = {'text': ('text', TEXT), 'label': ('label', LABEL)}
train_data, test_data = TabularDataset.splits(path='./data',train='train.json',test='test.json',format='json',fields=fields
)# 构建词汇表
TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d')# 创建数据迭代器
train_iterator, test_iterator = BucketIterator.splits((train_data, test_data),batch_size=32,device='cuda'
)
七、总结
本文全面介绍了 PyTorch 深度学习框架,从基础概念到实际操作,再到进阶应用和其丰富的生态圈。通过实际案例,读者可以更直观地理解和掌握 PyTorch 的使用方法。无论是深度学习的初学者还是有一定经验的开发者,都可以通过不断实践和学习,深入挖掘 PyTorch 的强大功能,为自己的深度学习项目提供有力支持。随着深度学习技术的不断发展,PyTorch 也将持续更新和完善,为开发者带来更多的便利和创新。
相关文章:
深度剖析 PyTorch框架:从基础概念到高级应用的深度学习之旅!
目录 一、引言 二、PyTorch 简介 (一)诞生背景与发展历程 (二)核心特点 三、PyTorch 基础概念 (一)张量(Tensor):数据的基石 (二)自动微分&…...

基于C++的DPU医疗领域编程初探
一、大型医院数据处理困境与 DPU 的崛起 在数字化浪潮的席卷下,医疗行业正经历着深刻变革,大型医院作为医疗服务的核心枢纽,积累了海量的数据,涵盖患者的基本信息、诊断记录、检验报告、影像资料等多个维度。这些数据不仅规模庞大,而且增长速度迅猛,传统的中央处理器(C…...
Linux 执行 fdisk -l 出现 GPT PMBR 大小不符 解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 问题所示 执行fdisk -l的时候出现如下提示: [root@VMS-Centos-test1 ~]# fdisk -l GPT PMBR 大小不符(419430399 != 4294967295),将用写入予以更正…...

图漾相机搭配VisionPro使用简易教程
1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0 /9.5/9.6版本经测试,可正常打开图漾相机,建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载:https://gitee.com/percipioxyz/camport…...

第一届“启航杯”网络安全挑战赛WP
misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…...
大模型训练策略与架构优化实践指南
标题:大模型训练策略与架构优化实践指南 文章信息摘要: 该分析全面探讨了大语言模型训练、架构选择、部署维护等关键环节的优化策略。在训练方面,强调了pre-training、mid-training和post-training的不同定位与目标;在架构选择上…...

新电脑安装系统找不到硬盘原因和解决方法来了
有不少网友反馈新电脑采用官方u盘方式装win10或win100出现找不到硬盘是怎么回事?后来研究半天发现是bios中开启了rst(vmd)模式。如果关闭rst模式肯定是可以安装的,但这会影响硬盘性能,有没有办法解决开启rst模式的情况安装win10或win11呢&…...

【Linux】21.基础IO(3)
文章目录 3. 动态库和静态库3.1 静态库与动态库3.2 静态库的制作和使用原理3.3 动态库的制作和使用原理3.3.1 动态库是怎么被加载的 3.4 关于地址 3. 动态库和静态库 3.1 静态库与动态库 静态库(.a):程序在编译链接的时候把库的代码链接到可…...
深度学习算法:从基础到实践
简介 深度学习作为人工智能领域的一个重要分支,近年来在多个领域取得了显著的成就。本文将从基础概念出发,探讨深度学习算法的核心原理,并介绍一些实际应用案例。 深度学习算法的核心概念 深度学习算法基于人工神经网络,通过构…...
27. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表服务
报表是每个记账应用所具备的功能,要实现报表功能就需要把账本的核心功能(记账)完成,因此报表服务作为本专栏第一部分单体应用开发中最后一个要实现的功能,这一篇文章很简单,我们一起来实现一个简单的报表服…...

coffee销售数据集分析:基于时间趋势分析的实操练习
**文章说明:**对coffee销售数据集的简单分析练习(时间趋势分析练习),主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。 **注:**这是我第一次使用md格式编辑博客文章,排版上还是不是很…...

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能
【1】原贴地址:eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下: 更新eclipse-24-09版本后之后,新的搜索功能(CT…...
Centos 修改历史读录( HISTSIZE)
history命令 -c #清空命令历史 -r #读历史文件附加到历史列表 -w #保存历史列表到指定的历史文件 命令历史相关环境变量 HISTSIZE #命令历史记录的条数 HISTFILE #指定历史文件,默认为~/.bash_history HISTFILESIZE #命令历史文件记录历史的条数 以上变量可以 exp…...

lwIP——4 网络接口
1.lwIP网络接口 网络接口(网卡):个人理解是处理网络层和数据传输关系的接口(tcp/ip协议栈中的网络接口层部分),直接与硬件平台打交道 lwIP协议栈支持多种不同的网络接口(网卡)&#…...
pytest自动化测试 - pytest夹具的基本概念
<< 返回目录 1 pytest自动化测试 - pytest夹具的基本概念 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件,夹具可以是函数、类或模块,使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围: …...

FreeRtos的使用教程
定义: RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点: 支持多任务管理, 处理多个事件, 实现更复杂的逻辑。 与计算…...

yolov11 解读简记
1 文章详细介绍了YOLOv11的架构设计,包括以下几个关键组件: C3k2块:这是YOLOv11引入的一种新型卷积块,替代了之前版本中的C2f块。C3k2块通过使用两个较小的卷积核代替一个大的卷积核,提高了计算效率,同时保…...

实验二 数据库的附加/分离、导入/导出与备份/还原
实验二 数据库的附加/分离、导入/导出与备份/还原 一、实验目的 1、理解备份的基本概念,掌握各种备份数据库的方法。 2、掌握如何从备份中还原数据库。 3、掌握数据库中各种数据的导入/导出。 4、掌握数据库的附加与分离,理解数据库的附加与分离的作用。…...
Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`
文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称(对于Producer重点检查 client.id)4…...
性能测试丨JVM 性能数据采集
什么是JVM性能数据采集? JVM性能数据采集是指通过一些工具和技术采集与Java虚拟机相关的性能数据。这些数据包括但不限于内存使用、CPU使用、垃圾回收(GC)行为、线程活动等。合理地分析这些数据,可以帮助我们找出系统的瓶颈&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...