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

【动手学深度学习】使用块的网络(VGG)的研究详情

目录

🌊1. 研究目的

🌊2. 研究准备

🌊3. 研究内容

🌍3.1 多层感知机模型选择、欠拟合和过拟合

🌍3.2 练习

🌊4. 研究体会


🌊1. 研究目的

  • 理解块的网络结构;
  • 比较块的网络与传统浅层网络的性能差异;
  • 探究块的网络深度与性能之间的关系;
  • 研究块的网络在不同任务上的适用性。

🌊2. 研究准备

  • 根据GPU安装pytorch版本实现GPU运行研究代码;
  • 配置环境用来运行 Python、Jupyter Notebook和相关库等相关库。

🌊3. 研究内容

启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:


🌍3.1 使用块的网络(VGG)

(1)使用jupyter notebook新增的pytorch环境新建ipynb文件,完成基本数据操作的研究代码与练习结果如下:

VGG块

import torch
from torch import nn
from d2l import torch as d2ldef vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels,kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)

VGG网络

conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))def vgg(conv_arch):conv_blks = []in_channels = 1# 卷积层部分for (num_convs, out_channels) in conv_arch:conv_blks.append(vgg_block(num_convs, in_channels, out_channels))in_channels = out_channelsreturn nn.Sequential(*conv_blks, nn.Flatten(),# 全连接层部分nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 10))net = vgg(conv_arch)X = torch.randn(size=(1, 1, 224, 224))
for blk in net:X = blk(X)print(blk.__class__.__name__,'output shape:\t',X.shape)

训练模型

ratio = 4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())


🌍3.2 练习

1.打印层的尺寸时,我们只看到8个结果,而不是11个结果。剩余的3层信息去哪了?

在VGG网络中,最后三个全连接层(nn.Linear)的输出尺寸没有被打印出来。这是因为在for循环中,只遍历了卷积层部分的模块,而没有遍历全连接层部分的模块。

为了打印出全连接层的输出尺寸,可以将全连接层的模块添加到一个列表中,然后在遍历网络的时候也打印出这些模块的输出尺寸。以下是修改后的代码:

import torch
import torch.nn as nn# 定义 VGG 模型
def vgg(conv_arch):layers = []in_channels = 1for c, num_convs in conv_arch:layers.append(nn.Sequential(nn.Conv2d(in_channels, c, kernel_size=3, padding=1),nn.ReLU()))in_channels = cfor _ in range(num_convs - 1):layers.append(nn.Sequential(nn.Conv2d(c, c, kernel_size=3, padding=1),nn.ReLU()))layers.append(nn.MaxPool2d(kernel_size=2, stride=2))return nn.Sequential(*layers)conv_arch = ((1, 1), (2, 2), (4, 2), (8, 2), (16, 2))net = vgg(conv_arch)X = torch.randn(size=(1, 1, 224, 224))
for blk in net:X = blk(X)print(blk.__class__.__name__, 'output shape:\t', X.shape)# 获取卷积层的输出尺寸
_, channels, height, width = X.shape# 添加全连接层模块到列表中
fc_layers = [nn.Flatten(),nn.Linear(channels * height * width, 4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096, 10)
]net = nn.Sequential(*net, *fc_layers)# 打印全连接层的输出尺寸
for blk in fc_layers:X = blk(X)print(blk.__class__.__name__, 'output shape:\t', X.shape)

2.与AlexNet相比,VGG的计算要慢得多,而且它还需要更多的显存。分析出现这种情况的原因。
VGG相对于AlexNet而言,计算速度更慢、显存需求更高的主要原因如下:

  • 更深的网络结构: VGG网络相比AlexNet更深,它使用了更多的卷积层和全连接层。VGG的网络结构包含了多个连续的卷积层,导致了参数的数量增加和计算量的增加。相对于AlexNet的8层网络,VGG网络有16或19层,这导致了更多的计算和内存消耗。
  • 小尺寸的卷积核: VGG网络使用了较小的卷积核(3x3大小),而AlexNet则使用了更大的卷积核(11x11和5x5大小)。较小的卷积核意味着每个卷积层需要进行更多次的卷积运算来覆盖相同的感受野,从而增加了计算量。
  • 更多的参数: VGG网络具有更多的参数量。由于每个卷积层都使用了较小的卷积核,导致了更多的卷积核参数。此外,由于网络更深,全连接层的参数数量也更多。更多的参数需要更多的内存来存储,并且在计算过程中需要更多的计算量。
  • 更高的内存需求: VGG网络的深度和参数量的增加导致了更高的内存需求。在训练过程中,需要存储每一层的输出、梯度和参数,这会消耗大量的显存。较大的显存需求可能导致无法一次性加载更多的数据和模型,从而导致更多的显存读写操作和内存碎片化,进而影响计算速度。

3.尝试将Fashion-MNIST数据集图像的高度和宽度从224改为96。这对实验有什么影响?
将Fashion-MNIST数据集图像的高度和宽度从224改为96会对实验产生以下影响:

  • 模型性能下降: 缩小图像尺寸会导致图像的信息丢失和细节损失。VGG网络在设计时使用了较大的输入尺寸,以便更好地捕捉图像的细节和纹理。通过将图像尺寸缩小为96x96,模型可能无法有效地捕捉到原始图像中的细微特征,从而导致性能下降。
  • 空间分辨率减小: 图像尺寸从224x224缩小到96x96会导致空间分辨率的减小。较小的图像尺寸意味着每个像素代表的区域更大,图像中的细节信息被压缩。这可能会导致模型在进行物体边界检测、纹理识别等任务时表现不佳。
  • 减少计算和内存需求: 缩小图像尺寸可以减少模型的计算和内存需求。较小的输入图像尺寸意味着每个卷积层的特征图大小也会减小,从而减少了参数数量和计算量。此外,由于特征图大小减小,模型所需的内存也会相应减少。
  • 训练速度加快: 缩小图像尺寸可以加快训练速度。较小的输入图像尺寸意味着每个批次的数据量减少,从而减少了每个训练步骤的计算量和内存消耗。这可能导致更快的训练速度和更高的训练效率。
import torch
from torch import nn
from torchvision.transforms import ToTensor
from torchvision.datasets import FashionMNIST
from torch.utils.data import DataLoader# 定义VGG块
def vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2, stride=2))return nn.Sequential(*layers)# 定义VGG网络
class VGG(nn.Module):def __init__(self, conv_arch):super(VGG, self).__init__()self.conv_blocks = nn.Sequential()in_channels = 1for i, (num_convs, out_channels) in enumerate(conv_arch):self.conv_blocks.add_module(f'vgg_block{i+1}', vgg_block(num_convs, in_channels, out_channels))in_channels = out_channelsself.fc_layers = nn.Sequential(nn.Linear(out_channels * 3 * 3, 4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096, 10))def forward(self, x):x = self.conv_blocks(x)x = torch.flatten(x, start_dim=1)x = self.fc_layers(x)return x# 将Fashion-MNIST图像尺寸缩小为96x96
transform = ToTensor()
train_dataset = FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = FashionMNIST(root='./data', train=False, download=True, transform=transform)# 创建数据加载器
batch_size = 128
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 定义VGG网络结构
conv_arch = [(1, 64), (1, 128), (2, 256), (2, 512), (2, 512)]
model = VGG(conv_arch)# 训练和测试
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
criterion = nn.CrossEntropyLoss()def train(model, train_loader, optimizer, criterion, device):model.train()train_loss = 0.0train_acc = 0.0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)train_acc += torch.sum(preds == labels.data).item()train_loss /= len(train_loader.dataset)train_acc /= len(train_loader.dataset)return train_loss, train_accdef test(model, test_loader, criterion, device):model.eval()test_loss = 0.0test_acc = 0.0with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)loss = criterion(outputs, labels)test_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)test_acc += torch.sum(preds == labels.data).item()test_loss /= len(test_loader.dataset)test_acc /= len(test_loader.dataset)return test_loss, test_acc# 训练模型
num_epochs = 10
for epoch in range(num_epochs):train_loss, train_acc = train(model, train_loader, optimizer, criterion, device)test_loss, test_acc = test(model, test_loader, criterion, device)print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train Accuracy: {train_acc:.4f}, 'f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')# 输出样例
print("Sample outputs:")
model.eval()
with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, preds = torch.max(outputs, 1)for i in range(images.size(0)):print(f"Predicted: {preds[i].item()}, Ground Truth: {labels[i].item()}")break  # 只输出一个批次的样例结果

在上面的代码中,定义了VGG网络结构,并在Fashion-MNIST数据集上进行了训练和测试。通过将图像尺寸从224缩小为96,可以看到模型的训练和推理速度可能会加快,但模型的性能可能会下降,因为图像的细节被压缩。这里使用了SGD优化器和交叉熵损失函数来训练模型,并输出了训练和测试的损失和准确率。最后输出了一个样例的预测结果,以查看模型的输出效果。请注意,实际训练过程可能需要更多的迭代次数和调整超参数以获得更好的性能。

4.请参考VGG论文 (Simonyan and Zisserman, 2014)中的表1构建其他常见模型,如VGG-16或VGG-19。
VGG-16:

import torch
from torch import nn
from torchvision.transforms import ToTensor
from torchvision.datasets import FashionMNIST
from torch.utils.data import DataLoader# 定义VGG块
def vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2, stride=2))return nn.Sequential(*layers)# 定义VGG-16网络
class VGG16(nn.Module):def __init__(self):super(VGG16, self).__init__()self.conv_blocks = nn.Sequential(vgg_block(2, 3, 64),vgg_block(2, 64, 128),vgg_block(3, 128, 256),vgg_block(3, 256, 512),vgg_block(3, 512, 512))self.fc_layers = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 10))def forward(self, x):x = self.conv_blocks(x)x = torch.flatten(x, start_dim=1)x = self.fc_layers(x)return x# 将Fashion-MNIST图像转换为Tensor,并进行数据加载
transform = ToTensor()
train_dataset = FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = FashionMNIST(root='./data', train=False, download=True, transform=transform)# 创建数据加载器
batch_size = 128
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 创建VGG-16模型实例
model = VGG16()# 定义优化器和损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
criterion = nn.CrossEntropyLoss()# 将模型移动到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):model.train()train_loss = 0.0train_acc = 0.0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)train_acc += torch.sum(preds == labels.data).item()train_loss /= len(train_loader.dataset)train_acc /= len(train_loader.dataset)# 在测试集上评估模型model.eval()test_loss = 0.0test_acc = 0.0with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)loss = criterion(outputs, labels)test_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)test_acc += torch.sum(preds == labels.data).item()test_loss /= len(test_loader.dataset)test_acc /= len(test_loader.dataset)print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train Accuracy: {train_acc:.4f}, 'f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')# 输出样例
print("Sample outputs:")
model.eval()
with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, preds = torch.max(outputs, 1)for i in range(images.size(0)):print(f"Predicted: {preds[i].item()}, Ground Truth: {labels[i].item()}")break  # 只输出一个批次的样例结果

以上代码展示了包含数据加载和训练的完整代码,使用VGG-16模型对Fashion-MNIST数据集进行了训练和测试。训练过程中,模型在每个epoch中进行了训练和验证,并输出了训练和验证集上的损失和准确率。最后,展示了一个样例输出,显示了模型在测试集上的预测结果。

VGG-19:

import torch
from torch import nn
from torchvision.transforms import ToTensor
from torchvision.datasets import FashionMNIST
from torch.utils.data import DataLoader# 定义VGG块
def vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2, stride=2))return nn.Sequential(*layers)# 定义VGG-19网络
class VGG19(nn.Module):def __init__(self):super(VGG19, self).__init__()self.conv_blocks = nn.Sequential(vgg_block(2, 3, 64),vgg_block(2, 64, 128),vgg_block(4, 128, 256),vgg_block(4, 256, 512),vgg_block(4, 512, 512))self.fc_layers = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 10))def forward(self, x):x = self.conv_blocks(x)x = torch.flatten(x, start_dim=1)x = self.fc_layers(x)return x# 将Fashion-MNIST图像转换为Tensor,并进行数据加载
transform = ToTensor()
train_dataset = FashionMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = FashionMNIST(root='./data', train=False, download=True, transform=transform)# 创建数据加载器
batch_size = 128
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 创建VGG-19模型实例
model = VGG19()# 定义优化器和损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
criterion = nn.CrossEntropyLoss()# 将模型移动到GPU(如果可用)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):model.train()train_loss = 0.0train_acc = 0.0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()train_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)train_acc += torch.sum(preds == labels.data).item()train_loss /= len(train_loader.dataset)train_acc /= len(train_loader.dataset)# 在测试集上评估模型model.eval()test_loss = 0.0test_acc = 0.0with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)loss = criterion(outputs, labels)test_loss += loss.item() * images.size(0)_, preds = torch.max(outputs, 1)test_acc += torch.sum(preds == labels.data).item()test_loss /= len(test_loader.dataset)test_acc /= len(test_loader.dataset)print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Train Accuracy: {train_acc:.4f}, 'f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')# 输出样例
print("Sample outputs:")
model.eval()
with torch.no_grad():for images, labels in test_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, preds = torch.max(outputs, 1)for i in range(images.size(0)):print(f"Predicted: {preds[i].item()}, Ground Truth: {labels[i].item()}")break  # 只输出一个批次的样例结果


🌊4. 研究体会

在本次实验中,我采用了块的网络结构,具体来说是VGG(Visual Geometry Group)网络,进行了深入的研究和分析。通过实验,我对使用块的网络的性能和优势有了更深刻的理解,并在不同任务上的适用性方面进行了探索。

首先,块的网络结构给予了深度神经网络更强大的特征提取能力。通过将多个卷积层和池化层堆叠在一起形成块的方式,块的网络能够逐层地提取出越来越抽象的特征信息。这种层次化的特征提取过程有助于网络更好地理解和表示输入数据,提高模型的分类准确率。在实验中的结果表明,相比传统的浅层网络,块的网络在处理复杂的视觉任务时表现出更好的性能。

其次,通过实验发现,块的网络的深度与性能之间存在一定的关系。逐渐增加块的数量可以增加网络的深度,但并不意味着性能一定会线性提升。实验中,我逐步增加了VGG网络的块数,并观察了模型的性能变化。结果显示,在增加块的数量初期,性能得到了显著提升,但随着深度继续增加,性能的改善趋于平缓,甚至有时会出现性能下降的情况。这表明网络深度的增加并不是无限制地提高性能的唯一因素,适当的模型复杂度和正则化方法也需要考虑。对块的网络在不同任务上的适用性进行了研究。通过在不同的数据集上进行训练和测试,我发现块的网络在图像分类、目标检测和语义分割等多个视觉任务中都表现出很好的性能。这表明块的网络具有较强的泛化能力和适应性,能够应用于多个领域和应用场景。这对于深度学习的研究和应用具有重要的启示意义,也为实际应用中的图像分析和理解提供了有力支持。

实验发现块的网络结构具有良好的模块化和复用性,使得网络的设计和调整变得更加灵活和高效。通过将相同的卷积层和池化层堆叠在一起形成块,我可以轻松地调整网络的深度和宽度,而不需要对每一层都进行单独设计和调整。这种模块化的结构使得网络的搭建和调试更加高效,节省了大量的时间和资源。

相关文章:

【动手学深度学习】使用块的网络(VGG)的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 多层感知机模型选择、欠拟合和过拟合 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 理解块的网络结构;比较块的网络与传统…...

JFinal学习07 控制器——接收数据之getBean()和getModel()

JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…...

二百三十九、Hive——Hive函数全篇

--创建测试数据库test show databases ; create database if not exists test; use test;一、关系运算 1、等值比较&#xff1a; select 1 where 1 1; --1 select 1 where 0 1; --NULL 2、不等值比较&#xff1a;<> select 1 where 1 <> 2; --1 sele…...

视频去水印电脑版,视频去水印软件

视频去水印怎么去&#xff0c;一直是视频编辑者们的热门话题。那么&#xff0c;如何去除频水印呢&#xff1f;接下来&#xff0c;我们将为您详细介绍视频去水印方法。 第一种方法&#xff1a; 首先通过浏览器打开 “ 51视频处理官网” 的网站。打开网站后&#xff0c;我们上传…...

北邮21硕后端开发笔记

blog 整理北邮21渣硕Java后端开发知识网络&#xff0c;阅读笔记以及技术博客&#xff0c;持续更新&#xff01;欢迎Star&#xff01; GitHub: https://github.com/WeiXiao-Hyy/blog Java 基础篇 一文带你搞懂final关键字 Java并发编程 fucking-java-concurrency解读你真…...

【Linux】系统优化:一键切换软件源与安装Docker

引言 在Linux系统安装完成后&#xff0c;进行一些必要的初始化设置是提升系统性能和用户体验的关键。本文将重点介绍两个实用的一键脚本&#xff1a;LinuxMirrors提供的软件源切换脚本和Docker安装脚本。这两个脚本将帮助我们简化配置安装过程。 一键切换软件源脚本 在Linux…...

【集装箱调度】基于粒子群算法实现考虑重量限制和时间约束的集装箱码头满载AGV自动化调度附matlab代码

% 交叉定位 - 最小二乘法定位算法模拟 % 参数设置 numIterations 1000; % 模拟迭代次数 maxDistance 1000; % 最远定位距离&#xff08;设定范围&#xff09; speedOfSound 343; % 声速&#xff08;单位&#xff1a;m/s&#xff09; % 预警机坐标 source [0, 0]; % 初始…...

使用 ESP32 和 PlatformIO (arduino框架)实现 Over-the-Air(OTA)固件更新

使用 ESP32 和 PlatformIO 实现 Over-the-Air&#xff08;OTA&#xff09;固件更新 摘要&#xff1a; 本文将介绍如何在 ESP32 上使用 PlatformIO 环境实现 OTA&#xff08;Over-the-Air&#xff09;固件更新。OTA 更新使得在设备部署在远程位置时&#xff0c;无需物理接触设…...

学习笔记——路由网络基础——汇总静态路由

4、汇总静态路由 (1)定义 静态路由汇总&#xff1a;多条静态路由都使用相同的送出接口或下一跳 IP 地址。(将多条路由汇总成一条路由表示) (2)目的 1.减少路由条目数量&#xff0c;减小路由表&#xff0c;加快查表速度 2.增加网络稳定性 (3)路由黑洞以及路由环路的产生…...

这10个python库,下载都超过5亿

python的库数不胜数。哪些库使用得最多呢。今天分享10个下载都超过5亿的python库。从高到低排序 第一名&#xff1a;Urllib3 下载次数&#xff1a;8.93亿次 介绍&#xff1a;Urllib3是一个功能强大且用户友好的HTTP客户端库&#xff0c;提供了许多Python标准库中没有的特性&…...

Vue3【十一】08使用toRefs和toRef

08使用toRefs和toRef toRefs()函数将person对象中的name和age属性转换为响应式引用&#xff0c;并返回一个对象&#xff0c;对象中的name和age属性都是响应式引用&#xff0c;具有响应式功能。 toRef()函数将person对象中的name属性转换为响应式引用&#xff0c;并返回一个响应…...

离散数学---树

目录 1.基本概念及其相关运用 2.生成树 3.有向树 4.最优树 5.前缀码 1.基本概念及其相关运用 &#xff08;1&#xff09;无向树&#xff1a;连通而且没有回路的无向图就是无向树&#xff1b; 森林就是有多个连通分支&#xff0c;每个连通分支都是树的无连通的无向图&…...

【栈】1106. 解析布尔表达式

本文涉及知识点 栈 LeetCode 1106. 解析布尔表达式 布尔表达式 是计算结果不是 true 就是 false 的表达式。有效的表达式需遵循以下约定&#xff1a; ‘t’&#xff0c;运算结果为 true ‘f’&#xff0c;运算结果为 false ‘!(subExpr)’&#xff0c;运算过程为对内部表达式…...

u盘内容无故消失了是什么原因?u盘部分内容无故消失了怎么恢复

在数字化时代&#xff0c;U盘作为便携存储设备&#xff0c;承载着许多重要的数据。然而&#xff0c;有时我们可能会遭遇U盘部分内容无故消失的情况&#xff0c;这无疑给我们的工作和生活带来了不小的困扰。本文将为您解析U盘内容消失的可能原因&#xff0c;并分享几招实用的数据…...

glm-4v-9b 部署

glm-4v-9b 模型文件地址 GLM-4 仓库文件地址 官方测试 硬件配置和系统要求 官方测试硬件信息: OS: Ubuntu 22.04Memory: 512G…...

Ansible——unarchive模块

目录 参数总结 基础语法 常见的命令行示例 示例1&#xff1a;解压缩文件到指定目录 示例2&#xff1a;解压缩文件并设置权限 示例3&#xff1a;远程URL解压缩 示例4&#xff1a;强制覆盖现有文件 具体步骤和示例 示例5&#xff1a;只要文件解压后&#xff0c;如果存在…...

Ansible——get_url模块

目录 主要用途 参数总结 基本语法示例 使用示例 示例1&#xff1a;下载文件 示例2&#xff1a;使用校验和验证文件 示例3&#xff1a;使用 HTTP 基本认证 示例4&#xff1a;通过代理服务器下载文件 示例5&#xff1a;设置文件权限、所有者和组 示例6&#xff1a;强制…...

macbook本地部署 pyhive环境连接 hive用例

前言 公司的测试和生产环境中尚未提供基于Hive的客户端。若希望尝试操作Hive表&#xff0c;目前一个可行的方案是使用Python语言&#xff0c;通过借助pyhive库&#xff0c;您可以对Hive表进行各种操作。以下是一些示例记录供您参考。 一、pyhive是什么&#xff1f; PyHive是一…...

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分&#xff0c;它通过保护实体设施、设备和介质等&#xff0c;防止未授权访问、破坏、盗窃等行为&#xff0c;从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护&#xff0c;可以从以下几个方面着手&#xff1…...

【JAVASE】日期与时间类(上)

一&#xff1a;概述 从JAVA SE 8开始提供了java.time包&#xff0c;该包中有专门处理日期和时间的类。 LocalDate LocalDateTime 和LocalTime 类的对象封装和日期、时间有关的数据&#xff0c;这三个类都是final类&#xff0c;而且不提供修改数据的方法&#xff0c;即这…...

如果需要精确的答案,请避免使用float和double

float和double主要为了科学计算和工程计算而设计&#xff0c;执行二进制浮点运算&#xff0c;这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而&#xff0c;它们没有提供完全精确的结果&#xff0c;所以不适合用于需要精确结果的场合&#xff0c;尤其是…...

大模型,也在卷价格

“百模大战”已从算力战、规模战蔓延到了价格战。 5月15日&#xff0c;字节跳动宣布豆包主力模型&#xff08;小于等于32K&#xff09;在企业市场的定价只有0.0008元/千Tokens&#xff0c;0.8厘就能处理1500多个汉字&#xff0c;比行业便宜99.3%&#xff1b;5月21日&#xff0…...

开关电源中电感设计

开关电源设计中电感 只有充分理解电感在DC/DC电路中发挥的作用,才能更优的设计DC/DC电路。本文还包括对同步DC/DC及异步DC/DC概念的解释。 在开关电源的设计中电感的设计为工程师带来的许多的挑战。工程师不仅要选择电感值,还要考虑电感可承受的电流,绕线电阻,机械尺寸等…...

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1&#xff09;强化特征&#xff0c;弱化背景 2&#xff09;光源打得好&#xff0c;图好了&#xff0c;后期算法更简化 3&#xff09;图好了&#xff0c;测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光&#xff1a;通常用…...

宝塔 php7.4 安装SQLserver扩展

一、加入微软源 curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlrelease.repo二、安装odbc驱动程序 yum install msodbcsql mssql-tools unixODBC-devel 三、安装php7.4对应的pdo_sqlsrv扩展包 # 下载 wget http://pecl.php.net/…...

C++中的常见I/O方式

目录 摘要 1. 标准输入输出(Standard I/O) 2. 文件输入输出(File I/O) 3. 字符串流(String Stream) 4. 低级文件I/O(Low-level File I/O) 5. 内存映射文件(Memory-Mapped File I/O) 6. 网络I/O(Network I/O) 服务器端 客户端 摘要 C++中的输入输出操作(…...

Java Web学习笔记23——Vue项目简介

Vue项目简介&#xff1a; Vue项目-创建&#xff1a; 命令行&#xff1a;vue create vue-project01 图形化界面&#xff1a;vue ui 在命令行中切换到项目文件夹中&#xff0c;然后执行vue ui命令。 只需要路由功能。这个路由功能&#xff0c;开始不是很理解。 创建项目部保存…...

[UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明

本插件可以在打包后运行时动态加载FBX模型。 新建一个Actor 并添加一个 DT Runtime Fbx Component。 然后直接调用组件的函数 LoadFile 加载显示模型&#xff08;注&#xff1a;不支持模型动画&#xff09; FilePath : 加载模型的绝对路径。 Create Collision : 是否创建碰撞…...

mysql log_bin

MySQL 开启配置binlog以及通过binlog恢复数据 https://blog.csdn.net/weixin_44606481/article/details/133344235 CentoS7 安装篇十二&#xff1a;mysql主从搭建&#xff08;xtrackbackup不停机搭建&#xff09; https://blog.csdn.net/chengxuyuanjava123/article/details/1…...

数据整理操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...

日本配色的网站推荐/网络服务商在哪咨询

如何将idea项目转到 Linux中&#xff1a; 1.在idea中将项目打包成war包&#xff1a; 点击右侧maven&#xff0c;点击clean&#xff0c;清除缓存&#xff1b; 点击package&#xff0c;开始打包成war包。 2.在target目录中找到打包好的war包。 3.通过传输软件将war包文件传到L…...

做古玩生意哪些网站好/中央常委成员名单

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;每天 14:00 更新文章&#xff0c;每天掉亿点点头发...源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框…...

做网站都需要什么资料/怎么找平台推广自己的产品

1 http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 2 http://www.cnblogs.com/vir56k/archive/2012/10/24/2737119.html 3 http://blog.30c.org/2798.html...

wordpress页面生成/苏州旺道seo

大家好&#xff0c;我是你们的码农大哥——栈长。 6 月初的时候给大家介绍了 Spring 团队的最新杀手锏项目&#xff1a;Spring Native&#xff0c;它的存在就是干掉 JVM&#xff0c;另起一个 JVM 之外的生态&#xff0c;上篇也简单实战了一下&#xff0c;相信大家都有了一个全…...

手机网站代理/长沙百度搜索排名优化

以下是我收集的Java编程里各种区别&#xff0c;供Java学习爱好者参考&#xff0c;这些区别都是每次Java面试中常考的&#xff0c;大家好好掌握&#xff0c;如有失误请留言指出。想要获取Java详细全套学习资料请到上海尚学堂官网获取。 1、HashMap和Hashtable的区别。 HashMap是…...

蚌埠北京网站建设/关键词密度

欢迎关注”生信修炼手册”!字典是使用最为广泛的数据结构了&#xff0c;从结构来看&#xff0c;其内容就是键值对&#xff0c;键称为key, 值称为value, 类似词典中通过前面的索引来快速查找后面的页面&#xff0c;通过key可以快速定位对应的值。字典&#xff0c;是python中对这…...