深度学习数据预处理:Dataset类的全面解析与实战指南
前言
在深度学习项目中,数据预处理是模型训练前至关重要的一环。一个高效、灵活的数据预处理流程不仅能提升模型性能,还能大大加快开发效率。本文将深入探讨PyTorch中的Dataset类,介绍数据预处理的常见技巧,并通过实战示例展示如何构建自己的数据预处理流程。
一、Dataset作用
在深度学习项目中,原始数据通常需要经过一系列处理才能输入模型。Dataset类的主要作用包括:
1. 数据统一接口:为不同类型的数据提供统一的访问接口
2. 内存高效利用:实现按需加载,避免一次性加载所有数据
3. 数据增强:方便集成各种数据增强技术
4. 代码可维护性:使数据处理逻辑模块化,便于维护和复用
二、Dataset基础
PyTorch提供了两个核心类来处理数据:
- torch.utils.data.Dataset:抽象类,所有自定义数据集应继承此类
- torch.utils.data.DataLoader:数据加载器,负责批量生成数据
基本Dataset实现:
from torch.utils.data import Datasetclass CustomDataset(Dataset):def __init__(self, data, labels, transform=None):self.data = dataself.labels = labelsself.transform = transformdef __len__(self):return len(self.data)def __getitem__(self, idx):sample = self.data[idx]label = self.labels[idx]if self.transform:sample = self.transform(sample)return sample, label
三、常见数据预处理技术
1. 图像数据预处理
from torchvision import transforms# 常见的图像预处理流程
image_transform = transforms.Compose([transforms.Resize(256), # 调整大小transforms.CenterCrop(224), # 中心裁剪transforms.ToTensor(), # 转为Tensortransforms.Normalize( # 标准化mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])
2. 文本数据预处理
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator# 分词器
tokenizer = get_tokenizer('basic_english')# 构建词汇表
def yield_tokens(data_iter):for text, _ in data_iter:yield tokenizer(text)vocab = build_vocab_from_iterator(yield_tokens(train_iter), specials=["<unk>", "<pad>"])
vocab.set_default_index(vocab["<unk>"])# 文本转tensor
def text_pipeline(text):return torch.tensor([vocab[token] for token in tokenizer(text)], dtype=torch.long)
3. 数值数据预处理
from sklearn.preprocessing import StandardScaler# 标准化数值特征
scaler = StandardScaler()
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data) # 使用相同的scaler
四、高级Dataset技巧
1. 懒加载大数据集
对于大型数据集(如图像数据集),我们通常不希望一次性加载所有数据:
class LazyImageDataset(Dataset):def __init__(self, file_paths, labels, transform=None):self.file_paths = file_pathsself.labels = labelsself.transform = transformdef __getitem__(self, idx):img_path = self.file_paths[idx]image = Image.open(img_path).convert('RGB') # 按需加载if self.transform:image = self.transform(image)return image, self.labels[idx]
2. 多模态数据集处理
处理同时包含图像和文本的数据:
class MultiModalDataset(Dataset):def __init__(self, image_paths, texts, labels, image_transform, text_transform):self.image_paths = image_pathsself.texts = textsself.labels = labelsself.image_transform = image_transformself.text_transform = text_transformdef __getitem__(self, idx):image = Image.open(self.image_paths[idx])text = self.texts[idx]label = self.labels[idx]if self.image_transform:image = self.image_transform(image)if self.text_transform:text = self.text_transform(text)return {"image": image, "text": text}, label
3. 数据增强技巧
# 训练和验证时使用不同的预处理
train_transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])val_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
五、实战:构建图像分类Dataset
让我们实现一个完整的图像分类数据集:
import osimport numpy as np
from PIL import Imagedef train_test_file(root,dir):file_txt=open(dir+'.txt','w')path=os.path.join(root,dir)for roots,directories,files in os.walk(path):if len(directories) !=0:dirs=directorieselse:now_dir=roots.split('\\')for file in files:path_1=os.path.join(roots,file)print(path_1)file_txt.write(path_1+' '+str(dirs.index(now_dir[-1]))+'\n')file_txt.close()
root=r'.\食物分类\food_dataset'
train_dir='train'
test_dir='test'
train_test_file(root,train_dir)
train_test_file(root,test_dir)import torch
from torch import nn #导入神经网络模块,
from torch.utils.data import DataLoader #数据包管理工具,打包数据,
from torchvision import transforms
from torch.utils.data import Datasetdata_transforms={
'train':
transforms.Compose([transforms.Resize([300, 300]),transforms.RandomRotation(45), # 随机旋转,-45到45度之间随机选transforms.CenterCrop(256), # 从中心开始裁剪[256,256]transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转 选择一个概率概率transforms.RandomVerticalFlip(p=0.5), # 随机垂直翻转transforms.ColorJitter(brightness=0.2, contrast=0.1, saturation=0.1, hue=0.1),transforms.RandomGrayscale(p=0.1), # 概率转换成灰度率,3通道就是R=G=Btransforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'valid':
transforms.Compose([transforms.Resize([256, 256]),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])}food_type={0:"八宝粥",1:"巴旦木",2:"白萝卜",3:"板栗",4:"菠萝",5:"草莓",6:"蛋",7:"蛋挞",8:"骨肉相连",9:"瓜子",10:"哈密瓜",11:"汉堡",12:"胡萝卜",13:"火龙果",14:"鸡翅",15:"青菜",16:"生肉",17:"圣女果",18:"薯条",19:"炸鸡"}class food_dataset(Dataset):def __init__(self,file_path,transform=None):self.file_path=file_pathself.imgs=[]self.labels=[]self.transform=transformwith open(self.file_path) as f:samples=[x.strip().split(' ') for x in f.readlines()]for img_path,label in samples:self.imgs.append(img_path)self.labels.append(label)def __len__(self):return len(self.imgs)def __getitem__(self, idx):image=Image.open(self.imgs[idx])if self.transform:image=self.transform(image)label = self.labels[idx]label = torch.from_numpy(np.array(label,dtype=np.int64))return image,labeltraining_data=food_dataset(file_path='train.txt', transform=data_transforms['train'])
test_data=food_dataset(file_path='test.txt', transform=data_transforms['valid'])train_dataloader=DataLoader(training_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)'''断当前设备是否支持GPU,其中mps是苹果m系列芯片的GPU。'''
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(f"Using {device} device") #字符串的格式化'''定义神经网络 类的继承'''
class CNN(nn.Module): # 通过调用类的形式来使用神经网络,神经网络的模型nn.moudledef __init__(self):super().__init__() # 继承父类的初始化self.conv1=nn.Sequential(nn.Conv2d(in_channels=3,out_channels=16,kernel_size=5,stride=1,padding=2,),nn.ReLU(), #(16,28,28)nn.MaxPool2d(kernel_size=2) #(16,14,14))self.conv2=nn.Sequential(nn.Conv2d(16,32,5,1,2), #32,14,14nn.ReLU(),)self.conv3=nn.Sequential(nn.Conv2d(32,64,5,1,2), #128,7,7nn.ReLU())self.out=nn.Linear(64*128*128,20)def forward(self, x): # 前向传播,指明数据的流向,使神经网络连接起来,函数名称不能修改x=self.conv1(x)x=self.conv2(x)x=self.conv3(x)x=x.view(x.size(0),-1)out=self.out(x)return outmodel = CNN().to(device)
print(model)def train(dataloader,model,loss_fn,optimizer):model.train() #告诉模型,我要开始训练,模型中w进行随机化操作,已经更新w。在训练过程中,w会被修改的
#pytorch提供2种方式来切换训练和测试的模式,分别是:model.train()和 model.eval()。
#一般用法是:在训练开始之前写上model.trian(),在测试时写上 model.eval()batch_size_num=1for X,y in dataloader: #其中batch为每一个数据的编号X,y=X.to(device),y.to(device) #把训练数据集和标签传入cpu或GPUpred=model.forward(X) #.forward可以被省略,父类中已经对次功能进行了设置。自动初始化loss=loss_fn(pred,y) #通过交叉熵损失函数计算损失值loss# Backpropagation 进来一个batch的数据,计算一次梯度,更新一次网络optimizer.zero_grad() #梯度值清零loss.backward() #反向传播计算得到每个参数的梯度值woptimizer.step() #根据梯度更新网络w参数loss_value=loss.item() #从tensor数据中提取数据出来,tensor获取损失值if batch_size_num %1 ==0:print(f'loss:{loss:>7f} [number:{batch_size_num}]')batch_size_num+=1def test(dataloader, model, loss_fn):size = len(dataloader.dataset)num_batches = len(dataloader)model.eval()test_loss, correct = 0, 0with torch.no_grad():for X, y in dataloader:X, y = X.to(device), y.to(device)pred = model.forward(X)test_loss += loss_fn(pred, y).item()correct += (pred.argmax(1) == y).type(torch.float).sum().item()a = (pred.argmax(1) == y)b = (pred.argmax(1) == y).type(torch.float)test_loss /= num_batchescorrect /= size# print(food_type)# print(pred.argmax(1).tolist())# print(y.tolist())result=zip(pred.argmax(1).tolist(),y.tolist())for i in result:print(f"当前测试的结果为:{food_type[i[0]]},当前真实的结果为:{food_type[i[1]]}")print(f"Test result:\n Accurracy:{(100 * correct)}%,AVG loss:{test_loss}")test_loss /=num_batchescorrect /=sizeprint(f'Test result: \n Accuracy: {(100*correct)}%, Avg loss: {test_loss}')loss_fn=nn.CrossEntropyLoss() #创建交叉熵损失函数对象,因为手写字识别中一共有10个数字,输出会有10个结果
optimizer=torch.optim.Adam(model.parameters(),lr=0.01) #创建一个优化器,SGD为随机梯度下降算法
# #params:要训练的参数,一般我们传入的都是model.parameters()#
# lr:learning_rate学习率,也就是步长#loss表示模型训练后的输出结果与,样本标签的差距。如果差距越小,就表示模型训练越好,越逼近干真实的模型。# train(train_dataloader,model,loss_fn,optimizer)
# test(test_dataloader,model,loss_fn)epoch=10
for i in range(epoch):print(i + 1)train(train_dataloader, model, loss_fn, optimizer)test(test_dataloader, model, loss_fn)
总结
数据预处理是深度学习项目成功的关键因素之一。通过合理设计Dataset类,我们可以:
1. 实现高效的数据加载和预处理
2. 方便地应用各种数据增强技术
3. 保持代码的整洁和可维护性
4. 轻松处理不同类型的数据(图像、文本、音频等)
相关文章:
深度学习数据预处理:Dataset类的全面解析与实战指南
前言 在深度学习项目中,数据预处理是模型训练前至关重要的一环。一个高效、灵活的数据预处理流程不仅能提升模型性能,还能大大加快开发效率。本文将深入探讨PyTorch中的Dataset类,介绍数据预处理的常见技巧,并通过实战示例展示如何…...
【机器学习-周总结】-第4周
以下是本周学习内容的整理总结,从技术学习、实战应用到科研辅助技能三个方面归纳: 文章目录 📘 一、技术学习模块:TCN 基础知识与结构理解🔹 博客1:【时序预测05】– TCN(Temporal Convolutiona…...
高可靠 ZIP 压缩方案兼容 Office、PDF、TXT 和图片的二阶段回退机制
一、引言 在企业级应用中,经常需要将多种类型的文件(如 Office 文档、PDF、纯文本、图片等)打包成 ZIP 并提供给用户下载。但由于文件路径过长、特殊字符或权限等问题,Go 标准库的 archive/zip 有时会出现“压缩成功却实际未写入…...
【HDFS入门】HDFS数据冗余与容错机制解析:如何保障大数据高可靠存储?
目录 1 HDFS冗余机制设计哲学 1.1 多副本存储策略的工程权衡 1.2 机架感知的智能拓扑算法 2 容错机制实现原理 2.1 故障检测的三重保障 2.2 数据恢复的智能调度 3 关键场景容错分析 3.1 数据中心级故障应对 3.2 数据损坏的校验机制 4 进阶优化方案 4.1 纠删码技术实…...
06-libVLC的视频播放器:推流RTMP
创建媒体对象 libvlc_media_t* m = libvlc_media_new_path(m_pInstance, inputPath.toStdString().c_str()); if (!m) return -1; // 创建失败返回错误 libvlc_media_new_path:根据文件路径创建媒体对象。注意:toStdString().c_str() 在Qt中可能存在临时字符串析构问题,建议…...
【DT】USB通讯失败记录
项目场景: DT小板 USB通讯失败 问题描述 V1.1 板子含有降压电路、电容充电电路、姿态传感电路,语音电路、电弧电路、TF卡电路 焊接完成:功能正常 V1.2 为方便数传模块拔插,把座子缩小并做在了背面,下载口反向方便狭…...
【笔记】网路安全管理-实操
一、系统安全防护-Windows 开始-》管理工具-》本地安全策略-》账户策略-》密码策略-》 1.密码必须符合复杂性要求。双击打开-》勾选已启用-》单击:应用-》单击:确定 2.密码长度最小值。双击打开-》设置密码长度最小值为:?个字符 3.密码最短使用期限。双击打开-》设置密码…...
FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)
本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…...
LDR、MOV和STR指令详解
文章目录 前言 一、LDR指令详解 1.基本语法 2.寻址方式 3.伪指令形式 二、MOV指令详解 1.基本语法 2.常见用法 3.特殊变体 三、STR指令详解 1.基本语法 2.寻址方式 四、三者区别与联系 1.基本语法 2.操作效率 3.大数值处理 总结 前言 ARM汇编中的LDR、MOV和STR是三个最基础也最…...
MATLAB 控制系统设计与仿真 - 41
鲁棒控制的其他函数 - 回路成型函数 loopsyn 灵敏度问题由鲁棒控制工具箱中的loopsyn就可以直接求解,该函数采用H无穷回路成型算法设计控制器,函数的调用格式为: [K,CL,gamma,info] loopsyn(G,Gd) % G为受控对象模型% Gd为期望的回路传递函…...
Scade 语言词法介绍
Scade 6 是一种具备形式化语法与形式化语义的领域特定语言(注1)。自2008年发布(注5)起,在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。 注1&#x…...
Replicate Python client
本文翻译整理自:https://github.com/replicate/replicate-python 文章目录 一、关于 Replicate Python 客户端相关链接资源关键功能特性 二、1.0.0 版本的重大变更三、安装与配置1、系统要求2、安装3、认证配置 四、核心功能1、运行模型2、异步IO支持3、流式输出模型…...
LLM做逻辑推理题 - 如何找出不标准的球?
题目: 有80个外观一致的小球,其中一个和其它的重量不同,(不知道更轻还是更重)。现在给你一个天平,允许你称四次,把重量不同的球找出来,怎么称? 1. 答案 第1次称量:天平…...
[密码学基础]国密算法深度解析:中国密码标准的自主化之路
国密算法深度解析:中国密码标准的自主化之路 国密算法(SM系列算法)是中国自主研发的密码技术标准体系,旨在打破国际密码技术垄断,保障国家信息安全。本文将从技术原理、应用场景和生态发展三个维度,全面解…...
【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景
COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件,专注于 Structure-from…...
基于Fabric.js的选座布局系统开发笔记
项目概述 最近开发了一个简单的选座布局系统,主要用于会议、活动或餐厅等场景的座位和桌子布局设计。系统基于HTML5 Canvas和Fabric.js库实现,支持添加座位、桌子,并能保存布局数据。 技术栈 • HTML5 Canvas:作为绘图的基础 •…...
PHP怎样连接MySQL数据库?
方法一:使用 mysqli 扩展 mysqli 是 MySQL 的改进版扩展,提供了面向对象和过程化的接口。 面向对象风格 <?php$servername "localhost"; $username "your_username"; $password "your_password"; $dbname &quo…...
将飞帆制作的网页作为 Vue 2 组件引入到自己网页中使用
飞帆平台有一个功能:不仅所有的网页都是通过控件搭建而成,而且生成的网页又是一个大控件,可以导入到你自己的网页使用。 这篇文章,我们要讲的就是如何将飞帆生成的网页作为控件(组件)导入到自己的网页中。…...
Python制作简易PDF查看工具PDFViewerV1.0显示优化
原文说明 为不破坏原文结构,因此功能优化不在原文中维护了。关于这款工具原文请通过下面链接访问。Python制作简易PDF查看工具PDFViewerV1.0 这款小工具基本功能已经可以作为一款文档浏览器使用,但还有一些美中不足的地方,本文将介绍对文本查找功能的优化调整。 优化效果 …...
YOLOv11改进有效涨点专栏:从理论到实战的深度优化指南
## YOLOv11的进化之路 在目标检测领域,YOLO系列算法始终保持着革命性的创新步伐。YOLOv11作为该系列的最新演进版本,在保持实时检测优势的同时,通过架构层面的深度优化实现了精度与速度的平衡。本文将从**七大核心模块**出发,系统性地解析针对YOLOv11的有效改进方案,涵盖从…...
【EDA软件】【设计约束和分析操作方法】
1. 设计约束 设计约束主要分为物理约束和时序约束。 物理约束主要包括I/O接口约束(如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束。 时序约束是FPGA内部的各种逻辑或走线的延时,反应系统的频率和速度的约束…...
JVM基础认知:JVM到底是什么?为什么它如此重要?
随着 Java 语言在企业级应用、互联网服务、嵌入式系统等领域的广泛采用,JVM(Java Virtual Machine,Java虚拟机)成为了支撑整个生态的核心基础。初学者往往会把注意力集中在 Java 代码本身,却忽视了背后那台“看不见的机…...
javassist
使用javassist获取参数名 1,添加依赖 需要在pom.xml文件中添加下面的依赖: <dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version> </depende…...
【C++算法】66.栈_比较含退格的字符串
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 844. 比较含退格的字符串 题目描述: 解法 用字符串来模拟栈。 C 算法代码: class Solution { public:bool backspaceCompare(string s, string t…...
游戏引擎学习第235天:在 Windows 上初始化 OpenGL
奇怪有问题 之前没注意到 这个问题是Count 0 GlobalConstants_Renderer_UsedDebugCamer 打开的话会有Bug Count是零的话就不让排序了 game.h: 查阅 TODO 列表 大家好,欢迎来到 game Hero,这是一档我们在直播中一起编写完整游戏的节目。不幸的是&a…...
FPGA系列之DDS信号发生器设计(DE2-115开发板)
一、IP核 IP(Intellectual Property)原指知识产权、著作权等,在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能(如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等)并且参数可修改的电路模块,…...
修改Theme SHELL美化panel
安装 使用 使用Tweaks进行设置 需要创建.themes文件夹,在当前目录下 mkdir ~/.themes从官网下载文件 https://www.gnome-look.org/p/1013030 将打包压缩文件移动到~/themes,并解压 tar -xvf 01-Flat-Remix-Light-20250413.tar.xz然后使用 按 Alt F2…...
Sentinel源码—5.FlowSlot借鉴Guava的限流算法二
大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLimiter的SmoothWarmingUp源码 3.继承RateLimiter的SmoothBursty源码 (1)SmoothBursty的初始化流程 (2)SmoothBursty的初始化完成后的变量…...
自由学习记录(56)
从贴图空间(texture space)将值还原到切线空间(tangent space)向量 tangentNormal.xy (packedNormal.xy * 2 - 1) * _BumpScale; 背后的知识点:法线贴图中的 RGB 是在 0~1 范围内编码的向量 所以贴图法线是怎么“压…...
计算机网络八股——HTTP协议与HTTPS协议
前言: 到时候我想要写一篇文章就是:在浏览器中输入URL并按下回车会发生什么? 然后将几篇文章全部串联到一起,现在几天的任务就是将这里的每个小部分进行一个详细的介绍 HTTP1.1简述与特性 Web 上的通信都是建⽴在 HTTP 协议上的…...
JAVAEE(网络原理—UDP报头结构)
我们本篇文章要讲的是UDP的报头结构以及注意事项。 下面呢,我先说一下UDP是什么? 1.UDP是什么? UDP是一种网络协议。网络协议是计算机网络中,为了使不同设备之间能够准确、高效地进行数据交换和通信,而预先制定的一…...
Redis-分布式锁
Redis-分布式锁 文章目录 Redis-分布式锁1.基本原理和不同方式实现方式对比2.Redis分布式锁的基本实现思路3.分布式锁误删问题一4.分布式锁误删问题二5.Redission1.功能介绍2.快速入门3.可重入锁原理4.锁重试和WatchDog机制1.锁重试2. WatchDog 机制(锁自动续期&…...
如何优雅地为 Axios 配置失败重试与最大尝试次数
在 Vue 3 中,除了使用自定义的 useRequest 钩子函数外,还可以通过 axios 的拦截器 或 axios-retry 插件实现接口请求失败后的重试逻辑。以下是两种具体方案的实现方式: 方案一:使用 axios 拦截器实现重试 实现步骤: 通…...
Windows使用SonarQube时启动脚本自动关闭
一、解决的问题 Windows使用SonarQube时启动脚本自动关闭,并发生报错: ERROR: Elasticsearch did not exit normally - check the logs at E:\Inori_Code\Year3\SE\sonarqube-25.2.0.102705\sonarqube-25.2.0.102705\logs\sonarqube.log ERROR: Elastic…...
MYSQL初阶(暂为自用草稿)
目录 基本操作 database操作 table操作 数据类型 INT类型 bit类型 FLOAT类型 CHAR类型 DATE类型 SEL类型 表的约束 列约束 NULL DEFAULT PRIMARY KEY UNIQUE KEY 表约束 PRIMARY KEY FOREIGN KEY 其他补充 AUTO_INCREMENT COMMENT ZEROFILL 表的CRUD …...
交换排序——快速排序
交换排序的基本思路:把序列中的两个元素进行比较,根据需求对两个元素进行交换。特点是较大的元素向序列的尾部移动,较小的元素向序列的前部移动。 hoare法 在序列中任取一个元素作为基准值,一趟排序完成之后,以基准值为…...
资源-又在网上淘到金了
前言: 本期再分享网上冲浪发现的特效/动画/视频资源网站。 一、基本介绍: mantissa.xyz,about作者介绍为:Midge “Mantissa” Sinnaeve (米奇辛纳夫)是一位屡获殊荣的艺术家和导演,提供动画、…...
CSS中的`transform-style`属性:3D变换的秘密武器
在CSS中,当我们尝试创建复杂的3D场景时,transform-style属性变得尤为重要。它决定了子元素是在3D空间中呈现还是被展平到2D平面中。本文将深入探讨transform-style的用法,并通过具体的代码示例来展示如何利用这个属性来增强你的网页设计。 什…...
Step文件无法编辑怎么办?
Step文件无法编辑怎么办? 这里介绍两种方法, 1、 直接导入 准备step文件,solidworks导入后是这样,不能在上面直接编辑 图 1 点击右键,选择解除特征(不同版本的可能不太一样,这里是solidworks2…...
从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香
视频讲解: 从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香 Label Studio 支持图像、文本、音频、视频、时间序列等多类型数据标注,覆盖计算机视觉(目标检测、语义分割)、自然语言处理&#x…...
纯FPGA实现驱动AD9361配置的思路和实现之一 概述
我们在做ZYNQ系统开发时候做的IP基本都是AXI_LITE_SLAVE,是SLAVE,从设备。就是提供了若干寄存器接口供MASTER进行读写。SLAVE里面的逻辑通过读写动作或者读写的数据进行响应的动作。这种方式的好处是硬件层面可以访问寄存器,软件层面是可以实…...
Nacos配置中心服务端源码解析
文章目录 概述一、配置持久化到数据库二、发布事件2.1、事件发布者端2.1.1、DefaultPublisher#publish2.1.2、DefaultPublisher#run2.1.3、DefaultPublisher#receiveEvent 2.2、事件订阅者端2.2.1、Subscriber#onEvent2.2.2、ConfigCacheService#dump 总结:Nacos 配…...
SAP系统工艺路线的分配物料出现旧版包材
问题:工艺路线的物料错了 这是3月份技术部发现的问题,10000209这个成品有两个版本的BOM, 在创建新版的工艺路线里,发现分配的物料仍然是旧版的物料. 原因排查: 1 BOM中物料错误? 2 选错了生产版本,选了版本1? 3 生产版本设置中的可选BOM错误? 解决:把可选的BOM…...
JVM虚拟机--JVM的组成
(一)JVM的组成 一、JVM介绍 (1)JVM的作用 我们知道,Java代码要想在计算机中正常运行,就需要经过编译为class二进制字节码文件,而JVM就提供了class二进制字节码的运行环境。 一次编写,到处运行 因为JVM是…...
科学研究:怎么做
科研(科学研究) 是指通过系统化的方法,探索自然、社会或人文领域的未知问题,以发现新知识、验证理论或解决实际问题的活动。它的核心是基于证据的探索与创新,旨在推动人类认知和技术的进步。 科研的核心要…...
PyTorch数据操作基础教程:从张量创建到高级运算
本文通过示例代码全面讲解PyTorch中张量的基本操作,包含创建、运算、广播机制、索引切片等核心功能,并提供完整的代码和输出结果。 1. 张量创建与基本属性 import torch# 创建连续数值张量 x torch.arange(12, dtypetorch.float32) print("原始张…...
微服务治理与可观测性
服务注册与发现 核心功能 服务实例动态变化:实例可能因扩缩容、故障或迁移导致IP变动。服务依赖解耦:调用方无需硬编码服务地址,降低耦合度。负载均衡:自动选择健康实例,提升系统可用性。 核心组件 服务注册中心&am…...
如何对docker镜像存在的gosu安全漏洞进行修复——筑梦之路
这里以mysql的官方镜像为例进行说明,主要流程为: 1. 分析镜像存在的安全漏洞具体是什么 2. 根据分析结果有针对性地进行修复处理 3. 基于当前镜像进行修复安全漏洞并复核验证 # 镜像地址mysql:8.0.42 安全漏洞现状分析 dockerhub网站上获取该镜像的…...
OpenCV 04.19 练习
1. 创建一个 PyQt 应用程序,该应用程序能够: 1.使用 OpenCV 加载一张图像。 2.在 PyQt 的窗口中显示这张图像。 3.提供四个按钮(QPushButton): - 一个用于将图像转换为灰度图 - 一个用于将图像恢复为原始彩色图 - 一个…...
uv:重新定义Python开发效率的下一代工具链
在Python生态系统中,包管理和项目工具链的复杂性一直是开发者面临的一大挑战。从依赖管理、虚拟环境创建到多版本Python切换,传统的工具链(如pip、virtualenv、poetry等)虽然功能强大,但操作繁琐、性能不足的问题长期存在。而uv的出现,以颠覆性的速度和功能集成,为Pytho…...