PyTorch 相关知识介绍

一、PyTorch和TensorFlow

1、PyTorch

PyTorch是由Facebook开发的开源深度学习框架,它在动态图和易用性方面表现出色。它以Python为基础,并提供了丰富的工具和接口,使得构建和训练神经网络变得简单快捷。

发展历史和背景

PyTorch 是由 Facebook 的 AI 研究团队开发的一个开源机器学习库,最初发布于 2016 年。它的前身是 Torch,这是一个使用 Lua 语言编写的科学计算框架。PyTorch 的出现标志着 Torch 的核心功能被转移到了 Python 这一更加流行和广泛使用的编程语言中,同时保留了原有的灵活性和强大的功能。

PyTorch 很快就因其易用性和强大的灵活性在学术界获得了广泛认可。它特别受到研究人员的青睐,因为它能够轻松地进行快速原型设计和实验。

主要特点和设计理念

动态计算图:PyTorch 的核心特点之一是其动态(也称为“即时”)计算图。这意味着图的结构在运行时是可变的,因此可以根据需要进行更改。这为研究人员提供了极大的灵活性,使他们能够使用普通的 Python 编程构造复杂的动态网络结构。

易用性:PyTorch 的另一个重要特点是其接口的直观性。它采用了 Python 的原生风格,使得代码更加容易理解和编写。同时,它提供了广泛的文档和教程,使得即使是初学者也能够相对容易地上手。

强大的社区支持:PyTorch 得益于其庞大的社区支持,社区成员不断地贡献新的库和扩展,使得 PyTorch 可以应用于计算机视觉、自然语言处理等各种领域。

与其他工具的集成:PyTorch 可以轻松地与其他流行的数据科学和机器学习工具集成,例如 NumPy、SciPy 和 Pandas。

2、TensorFlow

TensorFlow是由Google开发的深度学习框架,最初以静态图著称,但后来也引入了动态图机制。它支持多种编程语言,包括Python、C++和Java,并拥有强大的分布式计算能力。

发展历史和背景

TensorFlow 是由 Google 的 Google Brain 团队开发的,最初发布于 2015 年。它是 Theano 和 DistBelief 的直接后继者,后者是 Google 的早期分布式机器学习努力的一部分。TensorFlow 很快在工业界和学术界获得了广泛的应用,尤其是在需要大规模分布式训练和复杂模型部署的场景中。

Google 开发 TensorFlow 的主要目的是为了支持其广泛的产品和服务,包括搜索、Gmail、Google 照片等,这些服务需要处理大量的数据和复杂的模型。

主要特点和设计理念

静态计算图:TensorFlow 最初采用的是静态计算图。在这种方式中,首先定义一个图来表示计算,然后通过图来运行实际的计算。这种方法使得 TensorFlow 在优化和扩展方面非常有效,特别是在大规模的分布式系统中。

TensorFlow 2.x 的动态特性:随着 2019 年 TensorFlow 2.x 的发布,它引入了 Eager Execution,这是一种动态图机制,使得 TensorFlow 的使用更加直观和用户友好。Eager Execution 允许操作立即评估并返回它们的值,而不是构建一个待稍后执行的图。这使得 TensorFlow 对于新手更加友好,并且在某些方面与 PyTorch 更加相似。

广泛的应用范围:TensorFlow 被设计用于各种规模的项目,从小型个人项目到大型商业系统。它在移动和嵌入式设备上也有广泛的支持,尤其是通过 TensorFlow Lite 实现。

强大的工具和社区:TensorFlow 拥有强大的社区和工具生态系统,包括 TensorBoard(一种用于可视化训练过程的工具)和大量用于不同领域的预训练模型。

2024最详细的AI框架对比指南—PyTorch与TensorFlow到底选谁?-腾讯云开发者社区-腾讯云 (tencent.com)

TensorFlow vs PyTorch的优缺点与区别_tensorflow和pytorch哪个好-CSDN博客

二、DataLoader和Dataset

在使用Pytorch构建和训练模型的过程中,经常需要把原始数据(图片、文本等)转换为张量的格式。对于小数据集,我们可以手动导入,但是在深度学习中,数据集往往是比较大的,这时pytorch的数据导入功能便发挥了作用,Pytorch导入数据主要依靠 torch.utils.data.DataLoadertorch.utils.data.Dataset这两个类来完成。

Dataset和DataLoader的作用

torch.utils.data.Dataset:这是一个抽象类,所以我们需要对其进行派生,从而使用其派生类来创建数据集。最主要的两个函数实现为__Len__和__getitem__。

        __init__:可以在这里设置加载的data和label。

        __Len__:获取数据集大小

        __getitem__:根据索引获取一条训练的数据和标签。

torch.utils.data.DataLoader:接收torch.utils.data.Dataset作为输入,得到DataLoader,它是一个迭代器,方便我们去多线程地读取数据,并且可以实现batch以及shuffle的读取等。

 构建数据集-torch.utils.data.Dataset

torch.utils.data.Dataset可通过两种方式生成,一种是通过内置的下载功能,另一种便是自己实现。下载功能需要借助一些其他的包,比如torchvision,下载CIFAR10数据格式大致如下:

import torch
import torchvision
train_set = torchvision.datasets.CIFAR10(root='./dataset', train=True, transform=dataset_transform, download=True)

创建一个属于自己的数据集

任何自定义的数据集都要继承自torch.utils.data.Dataset,然后重写两个函数:__len__(self)__getitem__(self, idx)

下面是一个简单的自定义小型数据集,以期能够理解它的创建方式。注意下面的示例中并没有通过__init__传入data和label,而是在内部创建的。

import torch
from torch.utils.data import Datasetclass myDataset(Dataset):def __init__(self):#创建5*2的数据集self.data = torch.tensor([[1,2],[3,4],[2,1],[3,4],[4,5]])  #5个数据的标签self.label = torch.tensor([0,1,0,1,2])#根据索引获取data和labeldef __getitem__(self,index):return self.data[index], self.label[index] #以元组的形式返回#获取数据集的大小def __len__(self):return len(self.data)data = myDataset()
print(f'data size is : {len(data)}')print(data[1]) #获取索引为1的data和label

输出:

data size is : 5
(tensor([3, 4]), tensor(1))

数据载入-torch.utils.data.DataLoader

torch.utils.data.Dataset通过__getitem__获取单个数据,如果希望获取批量数据、shuffle或者其它的一些操作,那么就要由torch.utils.data.DataLoader来实现了,它的实现形式如下:

data.DataLoader(dataset,batch_size = 50,shuffle = False,sampler=None,batch_sampler = None,num_workers = 0,collate_fn = pin_memory = False,drop_last = False,timeout = 0,worker_init_fn = None,
)

dataset(必需)用于加载数据的数据集,通常是torch.utils.data.Dataset的子类实例。
batch_size (可选)每个batch有多少个样本,默认值为1。
shuffle (可选)代表数据会不会被随机打乱,在每个epoch开始的时候,对数据进行重新排序。默认为False。False不打乱
sampler(可选):自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False
batch_sampler(可选)sampler类似,但一次返回一个批次的索引。不能与batch_sizeshufflesampler同时使用。
num_workers (可选)是数据载入器使用的进程数目,默认为0,意味着数据将在主进程中加载。
collate_fn(可选)用于自定义sample 如何形成 batch sample 的函数。因为getitem只是得到一条数据,collate_fun组成一个batch数据
pin_memory:如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中。
drop_last(可选)如果设置为true,那么最后的batch的大小如果小于batch_size,那么则会丢弃。默认为False。
timeout(可选)如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。这个numeric应总是大于等于0。默认为0。
worker_init_fn(可选)它决定了每个数据载入的子进程开始时运行的函数

pytorch中的数据导入之DataLoader和Dataset的使用介绍_dataloader 能不能放到gpu上-CSDN博客

Dataloader重要参数与内部机制_dataloader参数-CSDN博客

三、TensorBoard可视化工具

TensorBoard是一个可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况等。特别是在训练网络的时候,我们可以设置不同的参数(比如:权重W、偏置B、卷积层数、全连接层数等),使用TensorBoader可以很直观的帮我们进行参数的选择。它通过运行一个本地服务器,来监听6006端口。在浏览器发出请求时,分析训练时记录的数据,绘制训练过程中的图像。

什么是 TensorBoard

TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中。TensorBoard 的主要功能包括:

1)可视化模型的网络架构

2)跟踪模型指标,如损失和准确性等

3)检查机器学习工作流程中权重、偏差和其他组件的直方图

4)显示非表格数据,包括图像、文本和音频

5)将高维嵌入投影到低维空间

TensorBoard算是包含在 TensorFlow中的一个子服务。 TensorFlow 库是一个专门为机器学习应用程序设计的开源库。 Google Brain 2011 年构建了较早的 DistBelief 系统。随着其用户群的快速增长,它被简化并重构为我们现在称为 Tensorflow 的库。 TensorFlow 随后于 2015 年向公众发布。TensorBoard刚出现时只能用于检查TensorFlow的指标和TensorFlow模型的可视化,但是后来经过多方的努力其他深度学习框架也可以使用TensorBoard的功能

调用 tensorboard --logdir=你创建的文件夹名字

        列如:tensorboard --logdir=logs --port=6007

tensorboard涉及的类:SummaryWriter

全称是:torch.utils.tensorboard.SummaryWriter

常用的方式就是:

from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter('logs')
writer.add_image('test', img_array,2, dataformats="HWC")writer.close() #一定要记得关闭

`SummaryWriter` 类提供了一个高级 API,用于在给定目录中创建事件文件,并向其中添加摘要和事件。 该类异步更新文件内容。 这允许训练程序调用方法以直接从训练循环将数据添加到文件中,而不会减慢训练速度

(傻瓜教程)TensorBoard可视化工具简单教程及讲解(TensorFlow与Pytorch)_tensorboard可视化梯度参数怎么看-CSDN博客Tensorboard的使用 ---- SummaryWriter类(pytorch版)-CSDN博客

四、Transformer

Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention mechanism),这是一个关键的创新,使其在处理序列数据时表现出色。

Transformer的一些重要组成部分和特点:

1、自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。

2、多头注意力(Multi-Head Attention)Transformer中的自注意力机制被扩展为多个注意力头,每个头可以学习不同的注意权重,以更好地捕捉不同类型的关系。多头注意力允许模型并行处理不同的信息子空间。

3、堆叠层(Stacked Layers):Transformer通常由多个相同的编码器和解码器层堆叠而成。这些堆叠的层有助于模型学习复杂的特征表示和语义。

4、位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。

残差连接和层归一化(Residual Connections and Layer Normalization):这些技术有助于减轻训练过程中的梯度消失和爆炸问题,使模型更容易训练。

5、编码器和解码器:Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。

【超详细】【原理篇&实战篇】一文读懂Transformer-CSDN博客

The Annotated Transformer的中文注释版(1) - 知乎 (zhihu.com)

torchvision

torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。torchvision.transforms主要是用于常见的一些图形变换。以下是torchvision的构成:

    torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
    torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
    torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
    torchvision.utils: 其他的一些有用的方法。

Transformer的使用

1、transforms.ToTensor()

torchvision.transforms 数据预处理:ToTensor()-CSDN博客

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter('logs')
img = Image.open('data/train/bees_image/17209602_fe5a5a746f.jpg')# ToTensor
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image('ToTensor', img_tensor)writer.close()

 2、数据归一化处理transforms.Normalize()

Normalize — Torchvision main documentation (pytorch.org)

数据归一化处理transforms.Normalize()-CSDN博客

torchvision中Transform的normalize参数含义, 自己计算mean和std,可视化后的情况,其他必要的数据增强方式_transforms.normalize(mean=[0.485, 0.456, 0.406], s-CSDN博客

功能:逐channel的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛
output = (input - mean) / std
mean:各通道的均值
std:各通道的标准差
inplace:是否原地操作

3、指定图像的大小torchvision.transforms.Resize() 

Resize — Torchvision main documentation (pytorch.org)

torchvision.transforms.Resize() 是 PyTorch 中 torchvision 库中的一个数据预处理类,用于将 PIL.Image 或者 ndarray 转换成指定大小的图像。

Pytorch transforms.Resize()的简单用法_torchvision.transforms.resize-CSDN博客

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter('logs')
img = Image.open('data/train/bees_image/17209602_fe5a5a746f.jpg')# Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
img_resize = trans_resize(img)
img_resize = trans_totensor(img_resize) #img_resize PIL->tensor
print(img_resize)
writer.add_image('Resize', img_resize,0)writer.close()

4、 数据变换组合torchvision.transforms.Compose()

Compose — Torchvision main documentation (pytorch.org)

transforms.Compose是PyTorch中的一个实用工具,用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理,例如图像数据的缩放、裁剪、旋转等。使用 transforms.Compose 可以将多个数据变换组合在一起,以便将它们应用于数据。

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter('logs')
img = Image.open('data/train/bees_image/17209602_fe5a5a746f.jpg')# compose()中的参数需要是一个列表
# 在compose中, 参数数据是 transforms类型
# compose - resize -2
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2,1)writer.close()

5、随机裁剪torchvision.transforms.RandomCrop

RandomCrop — Torchvision main documentation (pytorch.org)

transforms.RandomCrop()是PyTorch中的一个数据增强操作,用于随机裁剪图像。它可以在图像的任意位置随机裁剪出指定大小的图像,并返回裁剪后的图像。这个操作可以增加数据集的多样性,提高模型的泛化能力。

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter('logs')
img = Image.open('data/train/bees_image/17209602_fe5a5a746f.jpg')# RandomCrop
trans_totensor = transforms.ToTensor()
trans_random = transforms.RandomCrop(100)
#其中trans_compose_2将会对输入的图像进行随机裁剪为100 x 100大小的正方形,
#并将其转换为Tensor格式。
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])for i in range(10):img_crop = trans_compose_2(img)writer.add_image("RandomCrop",img_crop,i)writer.close()

6、其他参考

torchvision.transforms - PyTorch中文文档 (pytorch-cn.readthedocs.io)

torchvision.transforms 常用方法解析(含图例代码以及参数解释)_torchvision 斜切-CSDN博客

五、图像处理 PIL

Python Pillow PIL 库的用法介绍,Pillow库是一个Python的第三方库。

PIL库是一个具有强大图像处理能力的第三方库,不仅包含了丰富的像素、色彩操作功能,还可以用于图像归档和批量处理。

PIL库支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。

PIL主要可以实现图像归档和图像处理两方面动能需求:

1)图像归档:对图像进行批处理、生成图像预览、图像格式转换等。

2图像处理:图像基本处理、像素处理、颜色处理等。

1、安装

pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

2、PIL库 Image 类解析

ImagePIL最重要的类,它代表一张图片,引入这个类的方法如下:

from PIL import Image

PIL 中,任何一个图像文件都可以用 Image 对象表示。Image类的图像读取和创建方法如下(5个):

Python 图像处理 PIL 第三方库详细使用教程(更新中)-CSDN博客

六、OpenCV

什么是OpenCV,它有什么作用?

OpenCV(全称为Open Source Computer Vision Library)是一个开源的计算机视觉库,由英特尔公司发起并开发,支持多种编程语言(如C++PythonJava等),旨在为计算机视觉领域的研究、开发和应用提供一组通用的工具和算法。

OpenCV可以用于处理数字图像和视频数据,其功能包括图像和视频的读取、写入、显示、变换、滤波、特征提取、目标检测、人脸识别、物体跟踪、相机标定、三维重建、机器学习等。

OpenCV最初由Intel开发,现在已经成为了一个开源项目,其源代码可以免费获取和使用。

OpenCV提供了许多计算机视觉中常用的算法和工具,例如:

  • 读取和保存图像和视频数据

  • 图像和视频的显示、缩放、剪切和旋转等操作

  • 直方图均衡化、图像滤波和形态学操作等图像处理技术

  • 特征提取和描述符匹配算法,如SIFT和SURF等

  • 目标检测和跟踪算法,如Haar Cascade和MeanShift等

  • 人脸检测和识别算法,如LBPH和FisherFace等

  • 相机标定和三维重建算法,如SfM和PnP等

  • 机器学习算法,如SVM、KNN和随机森林等

除了以上的功能,OpenCV还有一个重要的特点就是跨平台性,可以在WindowsLinuxmacOS等操作系统上运行,并且支持多种编程语言,如C++PythonJava等。

 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。

OpenCV-Python使用了Numpy,这是一个高度优化的库,用于使用MATLAB风格的语法进行数值运算。所有OpenCV数组结构都可以转换为Numpy数组。这也使得它更容易与其他使用Numpy的库集成,如SciPyMatplotlib

OpenCV最详细入门(一)-python(代码全部可以直接运行)_opencv python-CSDN博客

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

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

相关文章

创建采购订单免费行项目,注意事项

1.我在使用bapi(BAPI_PO_CREATE1)创建采购订单免费行项目的时候,还是报错了请输入净价格。 解决方式:把这些数据都赋值好,那么你的采购订单行项目就是免费项目。 BAPIMEPOITEM-IR_IND 空 (发票收据标识&am…

文件传输新体验,这些中转站工具让你的职场生活更轻松

不知道大家有没有体验过华为手机的中转站功能,可以一键抓取图片或文件,暂时放在中转站中然后可以再拖到指定文件夹中。 华为手机的中转站功能,以其独特的跨应用文件传输能力,为用户带来了极大的便利。无论是图片、视频还是文档&am…

(2)空速传感器

文章目录 1 参数介绍 2 参数说明 1 参数介绍 Copter、Rover 和 Blimp 可以安装并启用一个空速传感器。然而,与用于导航和控制的 Plane 不同,这些飞行器只记录和报告读数,供地面控制站、OSD 和遥测中的显示器使用。在选择和安装空速传感器时…

git: 批量删除分支

环境: window11git version 2.42.0git-bash.exe window环境下: 1. 批量删除本地 git branch |grep xxx |xargs git branch -D比如: 想批量删除本地含有 release 关键字的分支: 2. 批量删除远程 git branch -r | grep xxxx | …

代码随想录算法训练营第五十一天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

121. 买卖股票的最佳时机 一只股票只能买卖一次 代码随想录 . - 力扣(LeetCode) 输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 1)的时候买入,在第 5 天(股票价…

(代码示例)for...in 循环会遍历数组的所有可枚举属性

for...in循环会遍历数组的所有可枚举属性,包括数组的索引和所有原型链上的属性。下面是一个例子: Array.prototype.myProperty Hello; // 添加一个属性到数组的原型链上let arr [1, 2, 3]; arr.myOwnProperty World; // 添加一个自有属性for (let pr…

腾讯云Edgeone为我的网站保驾护航

文章目录 前言边缘安全加速平台介绍模拟网站被攻击攻击脚本攻击脚本执行 网站快速接入 EdgeOne前提条件(注意事项)添加站点添加加速域名 EdgeOne 防护效果EdgeOne 体验感受总结 前言 众所周知,网站如果没有安全防护,极易遭受恶意…

github异常问题总结

问题1: gitgitlab.gz.cvte.cn: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解决方法: 这个错误表示 GitLab 服务器拒绝了你的 SSH…

「动态规划」如何求下降路径最小和?

931. 下降路径最小和https://leetcode.cn/problems/minimum-falling-path-sum/description/ 给你一个n x n的方形整数数组matrix,请你找出并返回通过matrix的下降路径的最小和。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一…

【Altium】AD-原理图中使用多通道问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决在原理图主图中,对子图使用多通道命令后,子图未形成多个通道的问题。 2、 问题场景 客户手中的工程文件,主图中对子图使用了多通道命令,子图图纸并未形成多通道…

【全开源】废品回收垃圾回收小程序APP公众号源码PHP版本

🌟废品回收小程序:绿色生活的新助手🌱 一、引言 随着环保意识的逐渐提高,废品回收成为了我们日常生活中的重要一环。但是,如何更方便、高效地进行废品回收呢?今天,我要向大家推荐一款超级实用…

flutter封装日历选择器(单日选择)

简单封装: 引入库:table_calendar import package:generated/l10n.dart; import package:jade/utils/JadeColors.dart; import package:jade/utils/Utils.dart; import package:util/easy_loading_util.dart; import package:flutter/material.dart; im…

搭建Java Spring Boot工程的步骤

搭建Java Spring Boot工程的步骤如下: 确保你已经安装了Java开发工具包(JDK)和Maven构建工具。如果没有安装,请先安装。(见文章:安装Maven构建工具步骤-CSDN博客) 打开命令行工具或终端窗口&am…

leetcode 2938.区分白球与黑球

leetcode 2938.区分白球与黑球(传送门) 思路:把1放右边,0放左边,只要把0全部放好那么1肯定也全部放好了。考虑将靠左的0放在靠左的位置,也就是第i个0要放到下标为i-1的位置,所以直接遍历并更新…

HTML跨年烟花

目录 写在前面 关于小编 HTML简介 程序设计 系列文章 写在后面 写在前面 学会了这个html烟花秀,跨年就不缺文案喽~ 关于小编 平易近人,慈眉善目,爱交朋友,舍己为人,和蔼可亲,能说会道,…

24上半年报考人数“不增反降”?备考下半年软考的难了......

近日,工信教考发布了一篇《2024年上半年计算机软件资格考试顺利举行》的文章,公布了2024年上半年软考报考人数共计52.77万人,其中,初级资格5.12万人、中级资格24.37万人、高级资格23.28万人。 软考高级占总报名人数的44%&#xf…

Linux网络编程:回顾网络通信

1.数据从应用层到数据链路层的本质 数据的封装: 用户在用户级缓冲区输入数据,经过应用层协议进行序列化成字节流数据,拷贝到传输层的缓冲区。而操作系统在传输层维护了sk_buff这一个结构体,然后data指针指向这段数据的开头&#x…

api网关kong对高频的慢接口进行熔断

一、背景 在生产环境,后端服务的接口响应非常慢,是因为数据库未创建索引导致。 如果QPS低的时候,因为后端服务有6个高配置的节点,虽然接口慢,还未影响到服务的正常运行。 但是,当QPS很高的时候&#xff0c…

基于STM32的毕业设计示例

**基于STM32的毕业设计示例** 一、引言 在当前的电子工程领域,STM32微控制器因其高性能、低功耗和丰富的外设接口而备受青睐。本次毕业设计旨在展示基于STM32微控制器的系统设计与实现能力,通过构建一个具有实际应用价值的系统,体现对嵌入式…

vue3 递归循环展示下级盒子

index.vue主文件 <template><div><RecursiveCard :data"rootTask" /></div> </template><script> import { reactive } from vue; import RecursiveCard from ./test.vue; // 递归组件的路径export default {components: {Recu…