PyTorch生成式人工智能实战(3)——分类任务详解
PyTorch生成式人工智能实战(3)——分类任务详解
- 0. 前言
- 1. 使用 PyTorch 进行端到端的深度学习
- 1.1 PyTorch 深度神经网络训练流程
- 1.2 数据预处理
- 2. 二分类
- 2.1 创建数据批次
- 2.2 模型构建与训练
- 2.3 模型测试
- 3. 多类别分类
- 3.1 验证集和提前停止
- 3.2 模型构建与训练
- 小结
- 系列链接
0. 前言
在本节中,我们将介绍神经网络的基本概念,包括损失函数、激活函数、优化器和学习率,这些对于构建和训练深度神经网络至关重要,如果想要深入理解这些知识,推荐通过《PyTorch深度学习实战》了解所需的基本技能和概念,包括多种人工神经网络的架构和训练。
在本节中,将学习如何使用 PyTorch
创建深度神经网络来执行二分类和多类别分类任务,以便熟练掌握深度学习和分类任务。具体而言,我们将构建一个完整的端到端深度学习项目,使用 PyTorch
将灰度图像的服装物品分类为不同类别,包括外套、包、运动鞋、衬衫等。目的是创建能够执行二分类和多类别分类任务的深度神经网络,为后续学习奠定基础。
1. 使用 PyTorch 进行端到端的深度学习
在本节中,我们首先介绍深度学习模型训练流程,然后讨论如何获取训练数据以及如何进行数据预处理。
1.1 PyTorch 深度神经网络训练流程
在本节中,我们的任务是创建并训练一个深度神经网络,用于对服装物品的灰度图像进行分类,模型构建与训练步骤如下图所示。
首先,获取一组灰度服装图像数据集,这些图像是原始像素数据,将它们转换为 PyTorch
张量,并且数据类型为浮动数值,每张图像都有一个标签。
接着,使用 PyTorch
创建深度神经网络,对于这个简单的分类问题,我们仅使用全连接层 (dense layer
)。通常选择交叉熵损失 (cross-entropy loss
) 作为多类别分类任务的损失函数,交叉熵损失衡量的是预测的概率分布与标签的真实分布之间的差异。使用 Adam
优化器在训练过程中更新网络的权重,并将学习率设置为 0.001
,学习率控制的是在训练过程中模型的权重如何根据损失的梯度进行调整。
机器学习中的优化器是基于梯度信息更新模型参数,以最小化损失函数的算法。随机梯度下降 (Stochastic Gradient Descent, SGD
) 是最基本的优化器,基于损失梯度进行更新。Adam
是以其高效性和开箱即用的性能而流行,因为它结合了自适应梯度算法 (Adaptive Gradient Algorithm
, AdaGrad
) 和均方根传播 (Root Mean Square Propagation
, RMSProp
) 的优点。尽管不同优化器之间存在差异,但所有优化器的目标都是通过迭代调整参数以最小化损失函数,每种优化器都通过一条独特的优化路径以实现这一目标。
我们把训练数据分为训练集和验证集。在机器学习中,通常使用验证集获取对模型的无偏评估,并选择最佳超参数,例如学习率、训练的轮数 (epochs
) 等。验证集还可以用来避免模型过拟合的情况,即模型在训练集上表现良好,但在未见过的数据上表现不佳。一个训练轮次 (epoch
) 是指使用所有训练集上训练模型一次。
在训练过程中,迭代遍历训练数据。在前向传播过程中,将图像输入到网络中以获得预测结果,并通过将预测标签与实际标签进行比较来计算损失。然后,通过反向传播将梯度传递回网络,以更新权重,这就是模型的学习过程。
使用验证集来确定何时停止训练。计算验证集中的损失,如果模型在经过一定数量的训练 epoch
后不再改进,我们就认为模型已经训练完成。然后,在测试集上评估训练好的模型,以评估模型的性能表现。
1.2 数据预处理
在本节中,我们将使用 Fashion-MNIST
数据集,学习 Torchvision
库中的 datasets
和 transforms
包,以及 PyTorch
中的 Dataloader
包,使用这些工具进行数据预处理。Torchvision
库提供了图像处理工具,包括流行的数据集、模型架构和常见的图像变换,专为深度学习应用而设计。
(1) 首先,导入所需的库,并实例化 Compose()
类,用于将原始图像转换为 PyTorch
张量:
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as Ttransform=T.Compose([T.ToTensor(), T.Normalize([0.5],[0.5])])
Torchvision
中的 transforms
包可以创建一系列变换来预处理图像。ToTensor()
类将图像数据(无论是 PIL
图像格式,还是 NumPy
数组)转换为 PyTorch
张量。图像数据是从 0
到 255
的整数,而 ToTensor()
类将它们转换为浮动类型张量,值的范围从 0.0
到 1.0
。
Normalize()
类使用均值和标准差对张量图像进行归一化,适用于 n
个通道。Fashion MNIST
数据集是灰度图像,只包含一个颜色通道。在以上代码中,Normalize([0.5],[0.5])
表示将数据减去 0.5
,并将结果除以 0.5
,归一化后的图像数据的值范围是 -1
到 1
。将输入数据归一化到 [–1, 1]
的范围内可以使梯度下降更加高效,有助于在训练过程中更快地收敛。需要注意的是,以上代码仅定义了数据变换过程,并未执行实际的变换。
(2) 使用 Torchvision
中的 datasets
包下载数据集,并执行数据变换:
train_set=torchvision.datasets.FashionMNIST(root=".", # 数据集下载目录train=True, # 下载训练数据集或测试数据集download=True, # 是否将数据集下载到本地transform=transform)# 执行数据变换
test_set=torchvision.datasets.FashionMNIST(root=".",train=False,download=True,transform=transform)
(3) 打印出训练集中第一个样本:
print(train_set[0])
该图像样本由一个包含 784
个值的张量和标签 9
组成。784
个数值代表一张 28×28
的灰度图像 (28 × 28 = 784
),标签 9
表示它是一双踝靴。数据集中有 10
种不同类型的服装,数据集中的标签从 0
到 9
编号,可以在线搜索找到这 10
个类别的文本标签。
(4) 定义列表 text_labels
,包含与数字标签 0
到 9
对应的 10
个文本标签。例如,如果某个物品的数字标签是 0
,那么对应的文本标签是 t-shirt
:
text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat','sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
(5) 可视化数据集中的数据样本:
import matplotlib.pyplot as pltplt.figure(dpi=300,figsize=(8,4))
for i in range(24):ax=plt.subplot(3, 8, i + 1)img=train_set[i][0]img=img/2+0.5 # 将数值从 [–1, 1] 转换为 [0, 1]img=img.reshape(28, 28) # 将图像重塑为 28 x 28 形状plt.imshow(img,cmap="binary")plt.axis('off')plt.title(text_labels[train_set[i][1]], fontsize=8) # 添加文本标签
plt.show()
接下来,将学习如何使用 PyTorch
创建深度神经网络,解决二分类和多类别分类问题。
2. 二分类
在本节中,我们首先为训练创建数据批次。然后,使用 PyTorch
构建一个深度神经网络,并使用训练数据训练模型。最后,使用训练好的模型进行预测,并测试预测的准确性。
2.1 创建数据批次
创建一个训练集和一个测试集(在介绍多类别分类时,还将学习如何创建一个验证集,以确定何时停止训练),这两个数据集只包含两种类型的服装:T恤和踝靴:
binary_train_set = [x for x in train_set if x[1] in [0,9]]
binary_test_set = [x for x in test_set if x[1] in [0,9]]
只保留标签为 0
和 9
的样本,来创建一个具有平衡训练集的二分类问题。接下来,为训练深度神经网络创建数据批次:
batch_size=64
binary_train_loader=torch.utils.data.DataLoader(binary_train_set, # 为二分类训练集创建批次batch_size=batch_size, # 每个批次中的样本数量shuffle=True) # 在批处理时打乱数据
binary_test_loader=torch.utils.data.DataLoader(binary_test_set, # 为二分类测试集创建批次batch_size=batch_size,shuffle=True)
PyTorch utils
包中的 DataLoader
类以批次的形式创建数据迭代器,本节将批大小设置为 64
。在以上代码中,我们创建了两个数据加载器:一个用于训练集,另一个用于测试集,以进行二分类。当创建数据批次时,会打乱样本顺序,以避免原始数据集中存在的相关性,不同标签的数据在数据加载器中均匀分布,训练会更加稳定。
2.2 模型构建与训练
(1) 使用 PyTorch
通过 nn.Sequential
类创建神经网络:
# 自动检测是否有支持 CUDA 的 GPU 可用
device="cuda" if torch.cuda.is_available() else "cpu"binary_model=nn.Sequential( # 创建一个顺序神经网络nn.Linear(28*28, 256), # 线性层中的输入和输出神经元的数量nn.ReLU(), # 应用 ReLU 激活函数nn.Linear(256,128),nn.ReLU(),nn.Linear(128,32),nn.ReLU(),nn.Linear(32,1),nn.Dropout(p=0.25),nn.Sigmoid()).to(device)
PyTorch
中的 Linear()
类创建了对输入数据的线性变换,这实际上是在神经网络中创建了一个全连接层。输入的形状为 784
,因为我们稍后会将二维图像展平成一个包含 28 × 28 = 784
个值的一维向量。我们将二维图像展平为一维张量,因为全连接层只接受一维输入。在使用卷积层时,则不需要展平图像。网络中有三个隐藏层,分别包含 256
、128
和 32
个神经元。
在三个隐藏层上应用了 ReLU
激活函数。ReLU
激活函数根据加权和来决定一个神经元是否会激活。激活函数为神经元的输出引入了非线性,使得网络能够学习输入与输出之间的非线性关系。ReLU
是一个常用的激活函数,关于更多激活函数的介绍,参考《深度学习常用激活函数》。
模型最后一层的输出包含一个单一的值,使用 sigmoid
激活函数将该数值压缩到 [0, 1]
的范围内,可以解释为该物品是踝靴的概率,与之相对的概率则表示该物品是T恤衫的概率。
(2) 接下来,设置学习率,并定义优化器和损失函数:
lr=0.001
optimizer=torch.optim.Adam(binary_model.parameters(),lr=lr)
loss_fn=nn.BCELoss()
将学习率设置为 0.001
。学习率的设置是一个经验性问题,通常需要根据具体问题而定,也可以通过使用验证集进行超参数调优来确定。PyTorch
中大多数优化器的默认学习率是 0.001
。Adam
优化器是梯度下降算法的一种变体,用于确定每次训练步骤中模型参数的调整量。在传统的梯度下降算法中,只有当前迭代的梯度被考虑,而 Adam
优化器则考虑了前几次迭代的梯度。
使用损失函数 nn.BCELoss()
,即二元交叉熵损失函数。损失函数用于衡量机器学习模型的表现,训练模型的过程就是调整模型参数,以最小化损失函数。二元交叉熵损失函数在机器学习中广泛应用,尤其是在二分类问题中,它衡量的是输出值介于 0
和 1
之间概率值的分类模型的表现。当预测的概率与实际标签偏差增大时,交叉熵损失会增大。
(3) 训练神经网络:
for i in range(50): # 训练 50 个 epochtloss=0for n,(imgs,labels) in enumerate(binary_train_loader): # 遍历所有批数据imgs=imgs.reshape(-1,28*28) # 在将张量移动到 GPU 之前,先将图像展平imgs=imgs.to(device)labels=torch.FloatTensor([x if x==0 else 1 for x in labels]) # 转换标签为 0 和 1labels=labels.reshape(-1,1).to(device)preds=binary_model(imgs) loss=loss_fn(preds,labels) # 计算损失optimizer.zero_grad()loss.backward() # 反向传播optimizer.step()tloss+=losstloss=tloss/nprint(f"at epoch {i}, loss is {tloss}")
loss.backward()
计算损失函数相对于每个模型参数的梯度,从而实现反向传播;而 optimizer.step()
则根据这些计算出的梯度更新模型参数,以最小化损失。为了简化训练过程,将模型训练进行 50
个 epoch
(一个 epoch
是指使用整个训练数据训练模型一次)。在二分类问题中,由于我们只保留了T恤衫和踝靴,标签分别为 0
和 9
,因此我们需要将它们转换为 0
和 1
。
2.3 模型测试
经过训练的二元分类模型的预测值是介于 0
和 1
之间的值,使用 torch.where()
方法能够将预测结果转换为 0
和 1
,如果预测的概率小于 0.5
,则该预测标签为 0
;否则,预测标签为 1
。然后,将这些预测值与实际标签进行比较,计算预测的准确率。接下来,使用训练好的模型对测试数据集进行预测。
import numpy as npresults=[]
for imgs,labels in binary_test_loader: # 遍历测试集中的所有批次imgs=imgs.reshape(-1,28*28).to(device)labels=torch.FloatTensor([x if x==0 else 1 for x in labels])labels=(labels).reshape(-1,1).to(device)preds=binary_model(imgs) # 使用训练好的模型进行预测pred10=torch.where(preds>0.5,1,0)correct=(pred10==labels) # 将预测结果与标签进行比较results.append(correct.detach().cpu().numpy().mean())
accuracy=np.array(results).mean() # 计算测试集准确率
print(f"the accuracy of the predictions is {accuracy}")
3. 多类别分类
3.1 验证集和提前停止
在本节中,我们将使用 PyTorch
构建一个深度神经网络,将服装分类为 10
个类别之一。然后,使用 Fashion-MNIST
数据集训练该模型。最后,使用训练好的模型进行预测,并查看预测的准确率。首先,创建一个验证集,并定义一个提前停止类,以便我们可以决定何时停止训练。
当我们构建和训练一个深度神经网络时,可以选择多个超参数(例如学习率和训练的 epoch
数)。这些超参数会影响模型的性能,为了得到最佳的超参数,我们可以创建一个验证集,测试不同超参数下模型的性能。例如,在多类别分类中,创建一个验证集,以确定训练的最佳 epoch
数。
(1) 在本节中,将训练数据集的 60,000
个样本分为训练集( 50000
个样本)和验证集( 10000
个样本):
train_set,val_set=torch.utils.data.random_split(train_set, [50000, 10000])
(2) 使用 PyTorch
的 DataLoader
类将训练集、验证集和测试集转换为三个数据迭代器:
train_loader=torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True)
val_loader=torch.utils.data.DataLoader(val_set, batch_size=batch_size, shuffle=True)
test_loader=torch.utils.data.DataLoader(test_set, batch_size=batch_size, shuffle=True)
(2) 定义提前停止类 EarlyStop()
并创建该类的实例:
class EarlyStop:def __init__(self, patience=10):self.patience = patience # patience 值默认为 10self.steps = 0self.min_loss = float('inf')def stop(self, val_loss): # 定义 stop() 方法if val_loss < self.min_loss: # 如果达到新的最小损失,更新 min_loss 的值self.min_loss = val_lossself.steps = 0elif val_loss >= self.min_loss: # 计算自上次最小损失以来经过了多少个 epochself.steps += 1if self.steps >= self.patience:return Trueelse:return False
stopper=EarlyStop()
EarlyStop()
类用来判断在最近的 patience
个 epoch
中,模型在验证集上的损失是否停止改善。patience
的值表示自模型上次达到最小损失以来,希望训练的 epoch
数。stop()
方法记录最小损失值及自最小损失以来的训练 epoch
数,并将该数量与 patience
值进行比较,如果自最小损失以来的训练 epoch
数大于 patience
的值,则该方法返回 True
。
3.2 模型构建与训练
接下来,将学习如何使用 PyTorch
创建多类别分类神经网络并进行训练,并学习如何使用训练好的模型进行预测并评估预测的准确率。
(1) 创建一个多类别分类模型来对 Fashion MNIST
数据集中的服装进行分类:
model=nn.Sequential(nn.Linear(28*28,256),nn.ReLU(),nn.Linear(256,128),nn.ReLU(),nn.Linear(128,64),nn.ReLU(),nn.Linear(64,10) # 输出层中有 10 个神经元).to(device)
与二分类模型相比,多分类模型有所不同。首先,输出包含 10
个值,表示数据集中 10
种不同类型的服装。其次,将倒数第二层的神经元数量从 32
个改为 64
个。
(2) 使用 PyTorch
的 nn.CrossEntropyLoss()
类作为损失函数,nn.CrossEntropyLoss()
类将 nn.LogSoftmax()
和 nn.NLLLoss()
合并为一个类,计算输入的 logits
与目标值之间的交叉熵损失。如果在模型中使用 nn.LogSoftmax()
并使用 nn.NLLLoss()
作为损失函数,可以获得相同的结果。因此,nn.CrossEntropyLoss()
类会在输出上应用 softmax
激活函数,将输出压缩到 [0, 1]
的范围内,然后再进行对数运算。经过 softmax
激活后的 10
个数值的总和为 1
,可以将其解释为对应 10
种服装类型的概率。设置学习率为 0.001
,并使用 Adam
优化器:
lr=0.001
optimizer=torch.optim.Adam(model.parameters(),lr=lr)
loss_fn=nn.CrossEntropyLoss()
(3) 定义 train_epoch()
函数:
def train_epoch():tloss=0for n,(imgs,labels) in enumerate(train_loader): imgs=imgs.reshape(-1,28*28).to(device)labels=labels.reshape(-1,).to(device)preds=model(imgs) loss=loss_fn(preds,labels)optimizer.zero_grad()loss.backward() optimizer.step()tloss+=lossreturn tloss/n
(4) 定义 val_epoch()
函数,使用模型对验证集中的图像进行预测,并计算每批数据的平均损失:
def val_epoch():vloss=0for n,(imgs,labels) in enumerate(val_loader): imgs=imgs.reshape(-1,28*28).to(device)labels=labels.reshape(-1,).to(device)preds=model(imgs) loss=loss_fn(preds,labels) vloss+=lossreturn vloss/n
(5) 训练多类别分类器:
for i in range(1,101): tloss=train_epoch()vloss=val_epoch()print(f"at epoch {i}, tloss is {tloss}, vloss is {vloss}")if stopper.stop(vloss)==True:break
模型最多训练 100
个 epoch
。在每个 epoch
中,首先使用训练集训练模型。然后,计算验证集每个批次的平均损失,使用 EarlyStop()
类通过查看验证集中的损失来判断是否应该提前停止训练。如果在过去的 10
个 epoch
内损失没有改善,则训练就会停止。
(6) 模型的输出是一个包含 10
个数值的向量。使用 torch.argmax()
方法基于最大概率为每个数据样本分配一个标签。然后,将预测标签与实际标签进行比较:
plt.figure(dpi=300,figsize=(5,1))
# 绘制测试集中前五张图像及其标签
for i in range(5):ax=plt.subplot(1,5, i + 1) img=test_set[i][0] label=test_set[i][1]img=img/2+0.5 img=img.reshape(28, 28) plt.imshow(img, cmap="binary")plt.axis('off')plt.title(text_labels[label]+f"; {label}", fontsize=8)
plt.show()
for i in range(5):# 获取测试集中第 i 张图像及其标签img,label = test_set[i]img=img.reshape(-1,28*28).to(device)pred=model(img) # 使用训练好的模型进行预测index_pred=torch.argmax(pred,dim=1) # 使用 torch.argmax() 方法获取预测标签idx=index_pred.item()# 打印出实际标签和预测标签print(f"the label is {label}; the prediction is {idx}")
使用训练好的模型对每件服装进行预测,预测结果是一个包含 10
个值的张量。torch.argmax()
方法返回张量中最大概率的位置,将其作为预测标签。最后,打印出实际标签和预测标签进行比较,观察预测是否正确。
上图显示了测试集中前五件服装分别为:踝靴、套头衫、裤子、裤子和衬衫,标签分别是 9
、2
、1
、1
和 6
,可以看到模型在五件服装上的预测都是正确的。
(7) 接下来,计算整个测试数据集的预测准确率:
import numpy as np
results=[]# 遍历测试集中的所有批次
for imgs,labels in test_loader:imgs=imgs.reshape(-1,28*28).to(device)labels=(labels).reshape(-1,).to(device)preds=model(imgs) # 使用训练好的模型进行预测pred10=torch.argmax(preds,dim=1) # 将概率转换为预测标签correct=(pred10==labels) # 将预测标签与实际标签进行比较results.append(correct.detach().cpu().numpy().mean())accuracy=np.array(results).mean() # 计算测试集上的准确率print(f"the accuracy of the predictions is {accuracy}")
输出结果如下所示:
the accuracy of the predictions is 0.8941082802547771
遍历测试集中的所有服装,使用训练好的模型进行预测。然后,将预测结果与实际标签进行比较。经过测试,准确率约为 88%
,表明我们已经成功构建并训练了有效的深度学习模型。
小结
- 深度学习是一种使用深度人工神经网络来学习输入与输出数据之间关系的机器学习方法
ReLU
激活函数根据加权和决定一个神经元是否应该激活,为神经元的输出引入了非线性- 损失函数用于衡量机器学习模型的表现,模型的训练涉及就是调整参数以最小化损失函数
- 二分类是一个将样本数据分为两个类别之一的机器学习模型
- 多类别分类是一个将样本数据分为多种类别之一的机器学习模型
系列链接
PyTorch生成式人工智能实战:从零打造创意引擎
PyTorch生成式人工智能实战(1)——神经网络与模型训练过程详解
PyTorch生成式人工智能实战(2)——PyTorch基础
相关文章:
PyTorch生成式人工智能实战(3)——分类任务详解
PyTorch生成式人工智能实战(3)——分类任务详解 0. 前言1. 使用 PyTorch 进行端到端的深度学习1.1 PyTorch 深度神经网络训练流程1.2 数据预处理 2. 二分类2.1 创建数据批次2.2 模型构建与训练2.3 模型测试 3. 多类别分类3.1 验证集和提前停止3.2 模型构…...
单机无穷大系统暂态稳定性仿真Matlab模型
1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他低版本可联系代为转换) 电力系统是一个复杂的动态系统,系统一旦出现稳定性问题,可…...
12个HPC教程汇总!从入门到实战,覆盖分子模拟/材料计算/生物信息分析等多个领域
在科学研究、工程仿真、人工智能和大数据分析等领域,高性能计算 (High Performance Computing, HPC) 正扮演着越来越重要的角色。它通过并行处理、大规模计算资源的整合,极大提升了计算效率,使原本耗时数日的任务能够在数小时内完成。 随着计…...
零基础快速搭建AI绘画网站!用Gradio玩转Stable Diffusion
借助Gradio,简单几行Python代码即可快速搭建一个专属的AI绘画网站,轻松部署Stable Diffusion文生图应用,gradio自带的组件已经相当美化了,前端基础也省了! 好像大神的Stable Diffusion WebUI项目也是用的Gradio搭建的&…...
SpringCloud搭建Eureka注册中心
1、Eureka 的简介 Eureka 是 Netflix 开源的 服务注册与发现框架,后被 Spring Cloud 集成为核心组件,用于解决微服务架构中服务治理问题。其核心目标是通过动态管理服务实例信息,实现服务间的透明通信与负载均衡。Eureka 通过简洁的 Server-Client 模型,结合心跳、缓存…...
信息学奥赛一本通 1509:【例 1】Intervals | OpenJudge 百练 1201:Intervals
【题目链接】 ybt 1509:【例 1】Intervals OpenJudge 百练 1201:Intervals 【题目考点】 1. 贪心算法 树状数组 并查集 2. 差分约束算法 【解题思路】 解法1:贪心算法树状数组、并查集优化 该题属于区间选点问题,ybt 1324:…...
电子电子架构 --- 主机厂视角下ECU开发流程
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
⭐Unity_Demolition Media Hap (播放Hap格式视频 超16K大分辨率视频 流畅播放以及帧同步解决方案)
播放大分辨率视频以及实现局域网视频同步是许多开发者会遇到的需求,AVPro有一个 Ultra Edition版本,也能播放Hap格式视频,之外就是Demolition Media Hap插件啦,实测即使是 7208*3808 大分辨率的视频帧率还是能稳定在30帧,它能帮助我们轻松解决…...
【MySQL】MySQL索引与事务
目录 前言 1. 索引 (index) 1.1 概念 1.2 作用 1.3 使用场景 1.4 索引的相关操作 查看索引 创建索引 删除索引 2. 索引背后的数据结构 2.1 B树 2.2 B+树的特点 2.3 B+树的优势 3. 事务 3.1 为什么使用事务 3.2 事…...
Apache Spark 源码解析
Apache Spark 是一个开源的分布式计算系统,提供了高效的大规模数据处理能力。下面我将对 Spark 的核心源码结构进行解析。 核心架构 Spark 的主要代码模块包括: Core (核心模块) 包含 Spark 的基本功能,如任务调度、内存管理、错误恢复等 …...
MySQL的日志--Undo Log【学习笔记】
MySQL的日志--Undo Log 知识来源: 《MySQL是怎样运行的》--- 小孩子4919 为了保证事务的原子性,当事务中途遇到各种错误需要将数据回滚(rollback)到原来的样子。为此MySQL提出撤销日志(Undo Log,也称undo日…...
一洽 全力辅助商户平台在线咨询解决方案
在商业数字化转型加速的背景下,客户对高效服务的需求日益增强。商户平台需要通过优化在线咨询服务,提升客户沟通效率与服务质量。一套综合性的在线咨询解决方案,通过整合多维度功能与智能技术,能够有效满足商户与客户的双向需求&a…...
ctfshow-web-新春欢乐杯
这几天做了这个新春欢乐杯,对于我这个小萌新来说有难度,同时也是收获满满,以下是我解题流程和收获 热身 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-01-16 15:42:02 # Last Modified by: h1xa # Last Modified …...
信奥赛之c++基础(初识循环嵌套与ASCII密码本)
🎠 游乐园编程奇遇记——循环嵌套与ASCII密码本 🎡 第一章:摩天轮与旋转木马——循环嵌套 🎪 游乐场里的双重循环 for(int 排数=1; 排数<=3; 排数++){// 外层循环像摩天轮for(int 座位=1; 座位<=5; 座位++){// 内层循环像旋转木马cout << "🎪"…...
同一电脑下使用 python2 和 python3
我本地先安装的2,然后再安装3。在电脑的环境变量 - Path 内,发现3的路径没有被加上,所以在cmd内输入python调用的是python2目录下的python.exe文件。pip.exe则是在Python/Scripts目录下,也就是默认调用的pip也是2的。 解决方案&…...
第十二届蓝桥杯 2021 C/C++组 直线
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 两点确定一条直线: 思路详解: 代码: 第一种方式代码详解: 第二种方式代码详解: 题目:…...
向量数据库实践:存储和检索向量数据
向量数据库是一种专门设计用于存储和检索向量嵌入的数据库系统,能够支持语义搜索、推荐系统、图像识别等 AI 应用场景。 下面将详细介绍向量数据库中向量数据的存储和检索原理及实际应用,希望对各位读者有所帮助。 一. 向量数据的存储与检索流程 在向量…...
Pandas 数据导出:如何将 DataFrame 追加到 Excel 的不同工作表
在数据分析和数据处理过程中,将数据导出到 Excel 文件是一个常见的需求。Pandas 提供了强大的功能来实现这一需求,尤其是将数据追加到同一个 Excel 文件的不同工作表(Sheet)中。本文将详细介绍如何使用 Pandas 实现这一功能&#…...
区块链驱动的供应链金融创新:模型构建与商业化路径研究
区块链驱动的供应链金融创新:模型构建与商业化路径研究 1. 研究背景与意义 1.1 背景介绍 全球供应链金融市场规模预计2025年将达到3.6万亿美元,但传统模式面临四大核心问题:信息孤岛导致信任成本高昂(占交易成本15-20%…...
DAX Studio将PowerBI与EXCEL连接
DAX Studio将PowerBI与EXCEL连接 具体步骤如下: 第一步:先打开一个PowerBI的文件,在外部工具栏里打开DAXStudio,如图: 第二步:DAXStudio界面,点击Advanced选项卡-->Analyze in Excel&#…...
使用springboot+easyexcel实现导出excel并合并指定单元格
1:准备一个单元格合并策略类代码: import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.Writ…...
conformer编码器
abstract 最近,基于Transformer和卷积神经网络(CNN)的模型在自动语音识别(ASR)中显示出有希望的结果,优于递归神经网络(RNN)。Transformer模型擅长捕捉基于内容的全局交互,而CNN则有效地利用了局部特征。在这项工作中,我们通过研究如何将联合收割机卷积神经网络和tr…...
每日c/c++题 备战蓝桥杯(P1252洛谷 马拉松接力赛)
洛谷P1060 马拉松接力赛题解:贪心算法在资源分配中的巧妙应用 题目描述 P1060 马拉松接力赛是一道结合贪心策略与动态规划思想的资源分配问题。题目要求将25公里的马拉松接力赛合理分配给5名选手,使得总耗时最短。每位选手可跑1-10公里的整数距离&…...
操作指南:vLLM 部署开源大语言模型(LLM)
vLLM 是一个专为高效部署大语言模型(LLM)设计的开源推理框架,其核心优势在于显存优化、高吞吐量及云原生支持。 vLLM 部署开源大模型的详细步骤及优化策略: 一、环境准备与安装 安装 vLLM 基础安装:通过 pip 直接安装…...
目前市面上知名的数据采集器
程序员爱自己动手打造一切,但这样离钱就会比较远。 市面上知名的数据采集工具 数据采集工具(也称为网络爬虫或数据抓取工具)在市场上有很多选择,以下是目前比较知名和广泛使用的工具分类介绍: 一、开源免费工具 Scra…...
BitNet: 微软开源的 1-bit 大模型推理框架
GitHub:https://github.com/microsoft/BitNet 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 微软专为 CPU 本地推理和极致压缩(低比特)大模型设计的推理框架。它支持对 1-bit/1.58-bit 量化模型进行…...
前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南
文章目录 前言一、Hash 值为何重要?二、Hash 值基础知识2.1 什么是 Hash?2.2 Hash 在前端的应用场景2.3 常见的 Hash 算法(MD5、SHA 系列) 三、前端获取文件 Hash 的常用方式3.1 使用 SparkMD5 计算 MD5 值3.2 使用 Web Crypto AP…...
Java与Kotlin在Android开发中的全面对比分析
趋势很重要 语言发展背景与现状 Android操作系统自2008年正式发布以来,Java长期作为其主要的开发语言。这种选择源于Java语言的跨平台特性、成熟的生态系统以及广泛开发者基础。然而,随着移动开发需求的快速演变,Java在Android开发中逐渐暴…...
Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南
一、基础配置与概念 1. 什么是 appModule appModule 是 Koin 依赖注入框架中的核心配置模块,用于集中管理应用中的所有依赖项。它本质上是一个 Koin 模块(org.koin.core.module.Module),通过 DSL 方式声明各种组件的创建方式和依…...
Flink TaskManager详解
1. TaskManager 概述 Apache Flink 的 TaskManager 是作业执行的核心工作节点,负责实际的数据处理任务。它与 JobManager 协同工作,接受其调度指令,管理本地资源(如 CPU、内存、网络),并执行具体的算子&am…...
Docker安装(Ubuntu22版)
前言 你是否还在为Linux上配置Docker而感到烦恼? 你是否还在为docker search,docker pull连接不上,而感到沮丧? 本文将解决以上你的所有烦恼!快速安装好docker! Docker安装 首先,我们得先卸载…...
《深入浅出ProtoBuf:从环境搭建到高效数据序列化》
ProtoBuf详解 1、初识ProtoBuf2、安装ProtoBuf2.1、ProtoBuf在Windows下的安装2.2、ProtoBuf在Linux下的安装 3、快速上手——通讯录V1.03.1、步骤1:创建.proto文件3.2、步骤2:编译contacts.proto文件,生成C文件3.3、步骤3:序列化…...
【含文档+PPT+源码】基于微信小程序连锁药店商城
项目介绍 本课程演示的是一款基于微信小程序连锁药店商城,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…...
再见,物理删除!MyBatis-Plus @TableLogic 优雅实现逻辑删除
在开发应用程序时,我们经常会遇到需要删除数据的场景。但直接从数据库中物理删除(DELETE)数据有时并非最佳选择。为什么呢? 数据恢复: 一旦物理删除,数据通常难以恢复,误操作可能导致灾难性后果。审计追…...
uni-app中获取用户实时位置完整指南:解决权限报错问题
uni-app中获取用户实时位置完整指南:解决权限报错问题 在uni-app开发运行在微信小程序时,获取用户位置信息是一个常见的需求,无论是用于地图导航、附近推荐还是其他基于位置的服务。然而,许多开发者在调用位置相关API时会遇到各种…...
【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明
一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件,提供以下核心功能: 嵌入式提问:对选中的文本内容进行AI分析,通过侧边栏聊天界面与AI交互,实现多轮对话、问题解答或代码生成。对话式提问:独…...
UnityEditor - 调用编辑器菜单功能
例如: 调用Edit/Frame Selected In Scene EditorApplication.ExecuteMenuItem("Edit/Frame Selected in Scene"); EditorApplication.ExecuteMenuItem("Edit/Lock view to Selected");...
OpenHarmony - 小型系统内核(LiteOS-A)(十),魔法键使用方法,用户态异常信息说明
OpenHarmony - 小型系统内核(LiteOS-A)(十) 十四、魔法键使用方法 使用场景 在系统运行出现无响应等情况时,可以通过魔法键功能确定系统是否被锁中断(魔法键也无响应)或者查看系统任务运行状态…...
在 Vue3 中封装的 Axios 实例中,若需要为部分接口提供手动取消请求的功能
核心思路 封装接口时返回 Promise 和 abort 方法: 为需要支持取消的接口返回一个对象,包含 promise 和 abort 方法,用户可通过 abort 主动中断请求。使用 AbortController 或 CancelToken: 推荐 AbortController(浏览…...
QuecPython+audio:实现音频的录制与播放
概述 QuecPython 作为专为物联网设计的开发框架,通过高度封装的 Python 接口为嵌入式设备提供了完整的音频处理能力。本文主要介绍如何利用 QuecPython 快速实现音频功能的开发。 核心优势 极简开发:3行代码完成基础音频录制与播放。快速上手…...
Langchain入门介绍
[声明] 本文参考:Langchain官方文档 什么是LangChain? LangChain 是一个开源的、用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。它的核心目标是将强大的 LLM(如 GPT-4, Claude, Llama 等)与外部数据源、计算资源和工具连接起来,从…...
WebUI可视化:第4章:Streamlit数据可视化实战
学习目标 ✅ 掌握Streamlit的安装与基础配置 ✅ 能够创建数据驱动的交互式界面 ✅ 实现常见图表(折线图、柱状图等)的绘制 ✅ 开发完整的业务数据分析应用 4.1 Streamlit快速入门 4.1.1 环境安装 打开终端执行: bash pip install streamlit 验证安装: bash stream…...
3.4 Spring Boot异常处理
本实战项目通过Spring Boot实现了一个简单的用户信息查询功能,并展示了如何自定义异常处理机制。项目中创建了用户实体类User和用户控制器UserController,在控制器中通过isValidUserId方法校验用户ID是否有效,若无效则抛出自定义异常InvalidU…...
期货有哪些种类?什么是股指、利率和外汇期货?
期货主要可以分成两大类:商品期货和金融期货。商品期货,顾名思义,就是跟实物商品有关的期货,比如农产品、金属、能源这些。金融期货呢,就是跟金融产品有关的期货,比如外汇、利率、股票指数这些。 一、商品…...
Golang | 位运算
位运算比常规运算快,常用于搜索引擎的筛选功能。例如,数字除以二等价于向右移位,位移运算比除法快。...
[论文阅读]ReAct: Synergizing Reasoning and Acting in Language Models
ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning and Acting in Language Models ICLR 2023 这是一篇在2022年挂出来的论文,不要以现在更加强大且性能综合的LLM来对这篇文章进行批判。 思想来源于作者对…...
拥有600+门店的宠物连锁医院,实现核心业务系统上云
瑞派宠物医院管理股份有限公司(以下简称“瑞派宠物“)从2017年开始数字化转型之路。瑞派宠物在全国有600连锁门店,随着业务量增加,线下部署的财务系统存在设备老旧、机房环境差等问题,部分在公有云上的业务,…...
OceanBase 跻身 Forrester 三大领域代表厂商,全面支撑AI场景
在生成式AI迅猛发展的当下,智能化数据管理已成为企业提升数字化水平、优化运营效率和强化市场竞争优势的战略重点。Forrester 最新发布的《2025年中国数据管理生态系统趋势报告》中,OceanBase凭借原生分布式架构和一体化产品优势,入选 全局数…...
学生管理系统微服务方式实现
//不用这种方式实现也可以,用这种方式是为了房间我们理解微服务的实现方式 微服务的实现方式就是把一个单项目应用的不同功能封装成单独的项目,然后向外暴露一个接口以便调用。如果需要这个功能我们直接调用这个功能对应项目的接口就可以了 服务之间的…...
OpenAI最新的4o图像生成模型 gpt-image-1 深度解析:API KEY 获取、开发代码示例
1. 引言 近期,OpenAI 正式发布了其最新的图像生成 API,模型标识符为 gpt-image-1。这一重要发布,首次将先前在 ChatGPT 中通过 GPT-4o 模型驱动、备受用户欢迎的先进图像生成能力,以编程接口(API)的形式提…...