PyTorch学习之:高级神经网络模型和技术

CNN的构建和应用

构建和应用卷积神经网络(CNN)进行图像分类是深度学习中的一个核心任务。这个过程涉及到定义网络架构、数据准备、模型训练、评估和应用等多个步骤。下面,我将详细解释这些步骤:

1. 定义CNN架构

CNN通常包含以下几种类型的层:

  • 卷积层(Convolutional Layers):负责提取图像中的局部特征。每个卷积层通过一系列的卷积核(或滤波器)对输入图像进行处理,生成特征图(feature maps)。
  • 激活层(Activation Layers):通常在每个卷积层之后添加,用ReLU(Rectified Linear Unit)是最常用的激活函数,目的是增加网络的非线性,帮助网络学习复杂的模式。
  • 池化层(Pooling Layers):用于降低特征图的维度,减少计算量,同时保留重要信息。最常用的是最大池化(Max Pooling)。
  • 全连接层(Fully Connected Layers):在CNN的末端,将卷积层和池化层提取的特征图转换成最终的分类预测。在此之前,通常会有一个或多个全连接层来整合学习到的特征。

2. 数据准备和预处理

  • 数据集收集:确保你有一个标记好的数据集,例如MNIST或CIFAR-10,用于图像分类任务。
  • 数据预处理:包括归一化(将像素值缩放到0到1之间)、中心化(减去平均值),以及可能的数据增强技术,如旋转、缩放、裁剪等,以增加模型的泛化能力。

3. 模型训练

  • 损失函数:对于分类任务,通常使用交叉熵损失函数(Cross-Entropy Loss)。
  • 优化器:选择一个优化算法来更新网络的权重,常用的有SGD(随机梯度下降)、Adam等。
  • 超参数设置:包括学习率、批处理大小(batch size)、训练的轮数(epochs)等。
  • 训练过程:在每个epoch中,网络会对训练集中的所有样本进行一次前向传播和后向传播,根据损失函数计算梯度,并更新网络的权重。

4. 评估和调优

  • 使用验证集评估模型性能,观察模型在未见过的数据上的表现。
  • 根据评估结果调整模型架构、优化器设置或其他超参数,以提高模型的准确率。

5. 应用

  • 模型测试:使用测试集对模型进行最终测试,以评估其泛化能力。
  • 模型部署:将训练好的模型部署到实际应用中,如移动应用、网页等。

示例代码(使用PyTorch)

这是一个使用PyTorch框架的简单CNN模型示例,用于MNIST手写数字分类:

 
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义CNN架构
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)self.fc1 = nn.Linear(64 * 7 * 7, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = torch.relu(self.conv1(x))x = self.pool(x)x = torch.relu(self.conv2(x))x = self.pool(x)x = x.view(-1, 64 * 7 * 7) # Flattenx = torch.relu(self.fc1(x))x = self.fc2(x)return x# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])# 加载数据
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)# 实例化模型、定义损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
for epoch in range(10): # 训练10个epochfor images, labels in train_loader:outputs = model(images)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item()}')

这个例子提供了一个基本的CNN模型构建、训练和评估流程。在实际应用中,可能需要根据具体任务调整网络架构、数据预处理方式、训练策略等。

RNN及其变体(LSTM、GRU)的理解和使用

循环神经网络(RNN)及其变体,如长短期记忆网络(LSTM)和门控循环单元(GRU),是处理序列数据的强大工具。这些网络能够处理和预测序列中的元素,因此广泛应用于语言模型、文本生成、时间序列分析等领域。以下是对RNN、LSTM和GRU的基本理解以及它们在序列生成任务中的应用。

RNN (Recurrent Neural Network)

RNN是一类用于处理序列数据的神经网络。它通过在序列的每个时间步上应用相同的权重集合,并保持一个隐藏状态来传递先前时间步的信息,从而能够捕获时间序列中的动态特性。然而,RNN在实践中面临着梯度消失或梯度爆炸的问题,这限制了它处理长序列的能力。

LSTM (Long Short-Term Memory)

LSTM是RNN的一个变体,旨在解决RNN处理长序列时遇到的梯度消失问题。它通过引入三个门(遗忘门、输入门和输出门)和一个单元状态来维护长期依赖关系。这些门的结构允许LSTM有选择地保留或丢弃信息,使得它在长序列数据上的性能优于传统的RNN。

GRU (Gated Recurrent Unit)

GRU是另一种RNN变体,被认为是LSTM的简化版本。它合并了LSTM中的遗忘门和输入门为一个单一的更新门,并且合并了单元状态和隐藏状态,从而减少了模型的复杂度。尽管GRU结构更简单,但在许多任务上它的表现与LSTM相当。

序列生成任务

序列生成是指给定一个序列(如文本、时间序列数据),模型能够预测序列的下一个或未来几个元素。在文本生成的场景中,给定一段文本序列,模型需要预测下一个单词或字符。

如何使用RNN/LSTM/GRU进行序列生成:
  1. 数据预处理:将序列数据转换为模型可以处理的格式,通常包括编码(将字符或单词转换为数值ID)和分批(创建一批序列样本)。

  2. 模型构建:设计RNN、LSTM或GRU网络。对于简单的序列生成任务,一个单层的LSTM或GRU通常就足够。模型通常以序列的当前元素为输入,并预测序列的下一个元素。

  3. 训练模型:使用适当的损失函数(如交叉熵损失)来训练模型,优化目标是最小化实际序列元素和模型预测之间的差异。

  4. 生成序列:在推理阶段,模型可以通过接收一个或多个起始元素,然后迭代地预测下一个元素来生成新的序列。生成的元素被反馈到模型中,作为下一步预测的一部分。

示例:简单的文本生成

假设使用LSTM进行文本生成,模型的训练过程包括:

  • 将文本分割成字符序列。
  • 使用LSTM网络学习字符序列的模式。
  • 给定一个起始字符,模型预测序列的下一个字符,然后将预测的字符作为输入反馈给模型,重复这个过程来生成文本。

总结

RNN及其变体LSTM和GRU在序列数据处理方面极为强大,尤其是在序列生成任务上。它们通过维护隐藏状态来捕捉序列中的时间依赖性,使得它们能够生成连贯且有意义的序列。选择哪一种模型通常取决于特定任务的需求和性能考量。

模型的保存、加载和微调

在深度学习项目中,模型的保存、加载和微调是非常重要的步骤,它们使得训练过程变得更加灵活和高效。这些技术不仅可以帮助我们在中断的训练过程中恢复工作,还能在新的数据上进一步提高模型的性能。以下是对这些步骤的详细解释:

模型的保存和加载

保存模型意味着将训练好的模型的参数(权重和偏置)存储在文件中,以便将来进行推理或继续训练。模型保存有助于模型的部署和分享。

  • 保存模型的常见格式:包括但不限于二进制格式、JSON、XML等。在PyTorch中,推荐使用.pt.pth后缀的文件保存模型。

加载模型是指从文件中读取模型的参数并将其应用到具有相同架构的模型实例中。这允许我们在不重新训练模型的情况下进行预测或在新的数据集上继续训练。

  • 加载步骤:通常包括初始化一个与保存时相同架构的模型,然后加载参数。
微调

微调是一种迁移学习技术,它从一个预训练模型开始,对其进行小幅调整以适应新的任务。这通常涉及以下几个步骤:

  1. 选择预训练模型:从类似的任务中选择一个已经训练好的模型。这个模型已经学习到了一些通用的特征表示,可以作为新任务的起点。

  2. 调整模型结构:根据新任务的需求,可能需要替换模型的一些层。例如,在图像分类任务中,通常替换最后的全连接层以匹配新任务的类别数。

  3. 冻结部分层:为了保留预训练模型在原任务上学习到的知识,通常会冻结模型的一部分(即使这些层在训练过程中保持不变)。通常,只有模型的最后几层会被重新训练。

  4. 重新训练:在新的数据集上重新训练模型的未冻结部分。由于大部分模型参数已经预训练过,微调通常需要的迭代次数较少。

示例:使用PyTorch进行模型的保存、加载和微调

保存模型
torch.save(model.state_dict(), 'model.pth')
加载模型
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load('model.pth'))
model.eval()  # 设置为评估模式

微调
# 加载预训练模型
model = torchvision.models.resnet18(pretrained=True)# 冻结除最后一层外的所有层
for param in model.parameters():param.requires_grad = False# 替换最后一层
model.fc = nn.Linear(model.fc.in_features, num_classes)# 重新训练最后一层
optimizer = optim.SGD(model.fc.parameters(), lr=0.001, momentum=0.9)

在实际应用中,选择何时保存模型、如何设计微调策略需要根据具体任务和模型表现来决定。正确使用这些技术可以大大加速模型开发和部署过程。

使用TensorBoard进行模型训练过程的可视化

TensorBoard 是 TensorFlow 提供的一个强大的可视化工具,它使得深度学习模型的训练过程可视化变得简单。尽管最初是为 TensorFlow 设计的,但它也可以与 PyTorch 等其他框架一起使用。使用 TensorBoard,你可以跟踪和可视化多种训练指标,如损失和准确率,查看模型架构,分析模型参数的分布和变化等。

主要功能

  • 跟踪和可视化指标:如训练和验证损失、准确率等,随着时间的推移进行动态跟踪。
  • 查看模型结构:可视化模型的计算图,帮助理解模型架构。
  • 分析参数和激活:查看参数(权重和偏置)和激活的分布,帮助诊断模型训练问题。
  • 查看梯度直方图:帮助分析训练过程中的梯度消失或爆炸问题。
  • 嵌入可视化:特别适用于查看高维数据的低维表示,例如用 t-SNE 进行的降维。

使用 TensorBoard 的步骤

以下是在 PyTorch 中使用 TensorBoard 进行模型训练过程可视化的基本步骤:

1. 安装和启动 TensorBoard

首先确保安装了 TensorBoard。如果已经安装了 TensorFlow,那么 TensorBoard 应该已经可用。你也可以单独安装 TensorBoard:

pip install tensorboard
2. 在 PyTorch 中集成 TensorBoard

PyTorch 提供了 torch.utils.tensorboard 模块来支持 TensorBoard 的使用。

初始化 SummaryWriter:
from torch.utils.tensorboard import SummaryWriter# 创建一个 SummaryWriter 实例
writer = SummaryWriter('runs/your_experiment_name')
记录信息:

在模型的训练循环中,使用 writer.add_scalar 方法记录想要跟踪的指标。

for epoch in range(num_epochs):# 训练模型...running_loss = ...running_accuracy = ...# 将损失和准确率记录到 TensorBoardwriter.add_scalar('training loss', running_loss, epoch)writer.add_scalar('accuracy', running_accuracy, epoch)
查看模型图:

你还可以将模型架构添加到 TensorBoard 中:

images, labels = next(iter(dataloader))
writer.add_graph(model, images)
3. 启动 TensorBoard

训练模型时,TensorBoard 会将日志数据写入指定的目录(在上面的代码中是 runs/your_experiment_name)。要查看这些日志,你需要启动 TensorBoard 并指向相同的日志目录:

tensorboard --logdir=runs

然后在浏览器中打开 TensorBoard 提供的网址(通常是 localhost:6006),就可以看到训练过程的可视化了。

总结

TensorBoard 是一个非常强大的工具,它可以帮助你深入理解和分析模型的训练过程。通过可视化训练指标和模型结构,你可以更容易地诊断模型中的问题,并优化模型的性能。

项目实践

实现一个更复杂的图像分类任务(如CIFAR-10)

实现一个更复杂的图像分类任务,比如对 CIFAR-10 数据集进行分类,是深度学习入门的一个经典例子。CIFAR-10 是一个常用的图像识别数据集,包含 10 个类别的 60000 张 32x32 彩色图像,每个类别有 6000 张图像。这个任务的目标是构建一个模型,使其能够准确地将图像分类到这 10 个类别之一。

步骤 1: 准备数据集

使用 PyTorch,你可以很方便地下载并加载 CIFAR-10 数据集:

import torch
import torchvision
import torchvision.transforms as transforms# 数据预处理:转换 PIL 图像到 Tensor,并进行归一化
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 归一化
])# 下载/加载 CIFAR-10 训练集和测试集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False)classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

步骤 2: 构建模型

接下来,你需要定义模型。这里是一个简单的 CNN 模型的例子,适用于 CIFAR-10 图像分类任务:

import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)  # 输入通道3,输出通道6,卷积核大小5self.pool = nn.MaxPool2d(2, 2)  # 池化层,窗口大小2,步长2self.conv2 = nn.Conv2d(6, 16, 5)  # 输入通道6,输出通道16self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 全连接层self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)  # 10个输出类别def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)  # 展平x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xnet = Net()

步骤 3: 定义损失函数和优化器

接下来,选择损失函数和优化器。对于分类问题,通常使用交叉熵损失和 SGD 或 Adam 优化器。

import torch.optim as optimcriterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

步骤 4: 训练模型

现在,开始训练模型:

for epoch in range(10):  # 多次循环遍历数据集running_loss = 0.0for i, data in enumerate(trainloader, 0):# 获取输入;数据是 [inputs, labels] 的列表inputs, labels = data# 清零参数梯度optimizer.zero_grad()# 前向 + 后向 + 优化outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 打印统计信息running_loss += loss.item()if i % 2000 == 1999:    # 每2000个小批量打印一次print('[%d, %5d] loss: %.3f' %(epoch + 1, i + 1, running_loss / 2000))running_loss = 0.0print('Finished Training')

步骤 5: 测试模型

最后,使用测试数据评估模型性能:

correct = 0
total = 0
with torch.no_grad():for data in testloader:images, labels = dataoutputs = net(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))

这个简单的 CNN 模型和训练循环是一个起点。在实际项目中,你可能需要调整模型架构、数据预处理步骤、训练参数等,以提高模型的准确率和性能。

序列数据处理,如时间序列预测或文本生成

处理序列数据是深度学习中的一个重要方向,涵盖了时间序列预测、文本生成等应用。序列数据的特点是数据点之间存在时间或逻辑上的顺序关系,这要求模型能够捕捉到这种顺序依赖性。下面分别介绍时间序列预测和文本生成的基本概念和方法。

时间序列预测

时间序列预测的目标是基于过去的观察来预测未来的值。这在金融市场分析、气象预测、资源需求预测等领域都有广泛的应用。

关键概念
  • 时间序列:按时间顺序排列的一系列数据点。
  • 预测窗口:预测未来值的时间范围。
  • 特征窗口:用于进行预测的过去观察值的时间范围。
方法
  • 循环神经网络(RNN):能够处理序列数据的神经网络,特别适用于短期依赖的序列。
  • 长短期记忆网络(LSTM):RNN的一种,能够捕捉长期依赖关系,适用于长序列数据。
  • 门控循环单元(GRU):LSTM的变种,结构更简单,计算效率更高,在很多任务上与LSTM表现相似。
步骤
  1. 数据预处理:标准化或归一化时间序列,将序列转换成模型可用的格式。
  2. 模型构建:选择合适的模型架构,如LSTM。
  3. 训练:使用历史数据训练模型。
  4. 预测:利用模型对未来进行预测。

文本生成

文本生成的目标是基于一定的上下文自动产生文本内容,例如诗歌、故事或新闻文章。

关键概念
  • 语言模型:预测序列中下一个词出现的概率的模型。
  • 上下文:决定文本生成内容的先前文本或条件。
方法
  • 循环神经网络(RNN):可以生成基于之前词的条件概率分布的模型。
  • 长短期记忆网络(LSTM):处理长序列文本生成任务的常用方法。
  • Transformer 和 GPT:基于注意力机制的模型,特别适用于长距离依赖和大规模文本生成。
步骤
  1. 数据准备:准备并预处理文本数据,包括词汇映射和序列化。
  2. 模型构建:设计适用于文本生成的模型架构。
  3. 训练:在大规模文本数据上训练模型。
  4. 生成文本:使用训练好的模型生成新文本。通常包括选择起始词或短语,然后迭代生成下一个词,直到达到所需的文本长度或生成结束标记为止。

实践建议

  • 注意过拟合:尤其是在数据量较少的情况下,要采取适当的正则化措施。
  • 使用预训练模型:对于文本生成,使用如GPT这样的预训练模型进行微调,可以显著提高生成文本的质量。
  • 多样性与连贯性的平衡:文本生成中需要平衡创新性(多样性)与文本的流畅性和连贯性,这可以通过调整生成策略来实现,如温度调节、束搜索(beam search)等。

时间序列预测和文本生成虽然应用场景不同,但都需要模型能够理解和生成具有时间或逻辑顺序的数据。掌握这些基本概念和方法,可以让你在处理各种序列数据时更加得心应手。

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

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

相关文章

[Java基础揉碎]Arrays类

目录 Arrays常见方法 1) toString返回数组的字符串形式 Arrays.toString(arr) 2) sort 排序(自然排序和定制排序) Integer arr[] {1,-1,7,0,89}; 定制排序 查看源码 冒泡排序 3) binarySearch 通过二分搜索法进行查找下标,要求必须排好序 int index Arra…

【MATLAB源码-第29期】基于matlab的MIMO,MISO,SIMO,SISO瑞利rayleigh信道容量对比。

操作环境: MATLAB 2022a 1、算法描述 1. SISO(单输入单输出): - SISO 是指在通信系统中,只有一个天线用于传输信号,也只有一个天线用于接收信号的情况。这是最简单的通信方式。 2. SIMO(单…

2024年河北省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:775454947 网络系统管理群:223627079 网络建设与运维群:870959784 极安云科专注于技能提升,赋能 2024年广东省高校的技能提升,受赋能的客户院校均…

网络基础三——其他周边问题

3.1ARP原理 ​ ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议; ​ 以广播的形式(主机号填成全1)构建Mac帧,发送ARP请求包,告诉所有在局域网的主机我的IP地址和Mac帧,与目的IP相同的主…

08 Php学习:iff语句、Switch语句

PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中,提供了下列条件语句: if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码,…

【Shell 脚本下载个图片】

先讲思路: 首先,我们要有一个上下文,然后用 grep 去获取其中所有的http开头的图片的链接,使用 curl -O 命令,直接将图片拉下来,拉东西,还要注意尊重他人知识版权, 看脚本&#xf…

langchain-chatchat加载Azure Open AI

1.找到knowledge_base_chat.py文件中的get_ChatOpenAI函数 2.按crtl进入get_ChatOpenAI函数位置 3.注释原先的get_ChatOpenAI函数,修改成以下内容: def get_ChatOpenAI(model_name: str,temperature: float,streaming: bool True,callbacks: List[Ca…

意得辑意得辑

你是否也曾遇到过在发表论文时英语写作水平不尽如人意的困境?审稿意见总是指出语言表达不够好,需要找英语母语者修改?不用担心,我和你一样,也曾历经这样的挑战。但是,我找到了一家值得信赖的专业润色机构—…

SPI外设简介

SPI外设简介 简介部分 可配置8/16位数据帧、高位先行/低位先行 SPI和I2C都是高位先行,串口是低位先行 PCLK是外设时钟,APB2是72MHz、APB1是36MHz SPI1的时钟频率比SPI2的大一倍 如果需要快速大量传输数据,可以使用DMA数据转运&#xff0…

洛谷 P1048 [NOIP2005 普及组] 采药

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同…

数据持久化 1 - PlayerPrefs

数据持久化 文章目录 数据持久化PlayerPrefs 基本方法存储读取删除 Type补充父子关系通过反射获得泛型类型 PlayerPrefs 基本方法 PlayerPrefs Unity用于存储读取玩家数据的公共类 存储 PlayerPrefs的数据存储类似于键值对存储 提供了3种方法 int float string PlayerPref…

浏览器插件——从开发到部署全流程详解

开发浏览器插件是一个很好的方式来扩展浏览器的功能。不过,需要注意的是,浏览器插件通常是使用JavaScript、HTML和CSS开发的,而不是Python。尽管如此,你可以使用一些工具将Python代码转换为JavaScript,但这通常不是开发…

安装VMware ESXi虚拟机系统

简介:ESXi是VMware公司开发的一款服务器虚拟化操作系统。它能够在一台物理服务器上运行多个虚拟机,每个虚拟机都可以独立运行操作系统和应用程序,而且对硬件配置要求低,系统运行稳定。 准备工具: 1.8G或者8G以上容…

【PDF-XSS攻击】Java项目-上传文件-解决PDF文件XSS攻击

文章目录 背景解决pdfbox依赖控制器代码PdfUtils工具类 验证最后源码参考 背景 上传xss-pdf造成存储型xss因为在浏览器直接预览的PDF,而不是预览,所以安全部门认为会有XSS漏洞 解决 安全部门修复建议 1、根据白名单的标签和属性对数据进行过滤&#…

JAVA之MDC的使用教程

文章目录 MDC简介MDC原理作用整体流程添加MDC依赖配置MDC 基本使用过程 MDC简介 MDC(Mapped Diagnostic Context)是用于分布式系统中跟踪和诊断日志的重要概念。是一个在Java项目中用于日志跟踪的工具,它允许你在多线程环境下关联和传递特定的上下文信息。 MDC是一…

金三银四面试题(十七):MySQL面试都问什么(2)

今天我们继续盘点那些高频的MySQL面试题。 说说InnoDB与MyISAM的区别 InnoDB 支持事务,MyISAM 不支持,对于InnoDB 每一条SQL 语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL 语言放在begin 和comm…

Java 二叉数(1)

一、认识树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊的…

react-router-dom+history路由跳转白屏需手动刷新才显示

搭建一个新项目&#xff0c;路由照常配好了&#xff0c;但是很奇怪&#xff0c;跳转的时候第一次白屏&#xff0c;<root></root>里面只有一个,号&#xff0c;页面是空白的&#xff0c;再手动刷新才显示内容&#xff0c;检查了路由很多遍&#xff0c;也看了地址栏都…

javascript密码验证规则,数字、字母、特殊符号两种以上

在验证密码复杂的正则表达试中&#xff0c;几位码友有发布过从两种字符里选两种的&#xff0c;从三种字符里选有三种的。 今天我提一个从三种里选两种的。有喜欢的朋友拿去用。 密码须包含数字、字母、特殊符号两种以上&#xff0c;且不少于8位&#xff0c;不多于32位。 pass…

IDEA中的Debug功能介绍

说明&#xff1a;本文介绍IDEA中的Debug功能&#xff0c;基于2023.2&#xff08;Ultimate Edition&#xff09;版本 简单介绍 首先&#xff0c;在程序需要停止的所在行号上&#xff0c;鼠标左键&#xff0c;可设置一个断点&#xff0c;是一个红色圆点标志&#xff0c;表示程序…