TensorFlow SegFormer 实战训练代码解析
一、SegFormer 实战训练代码解析
SegFormer 是一个轻量级、高效的语义分割模型,结合了 ViT(视觉 Transformer) 和 CNN 的高效特征提取能力,适用于边缘 AI 设备(如 Jetson Orin)。下面,我们深入解析 SegFormer 的训练代码,包括 数据预处理、模型训练、超参数调优、模型优化 等关键部分。
1.环境准备
在开始训练之前,需要安装相关依赖:
pip install torch torchvision transformers mmcv-full
pip install mmsegmentation
确保 PyTorch 版本兼容 mmcv 和 mmsegmentation
2.加载 SegFormer 预训练模型
SegFormer 提供多个预训练模型(B0-B5),可以使用 Hugging Face Transformers
或 mmsegmentation
加载:
from transformers import SegformerForSemanticSegmentation# 加载预训练 SegFormer-B0 模型
model = SegformerForSemanticSegmentation.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512")# 打印模型结构
print(model)
B0 版本适用于低功耗设备(如 Jetson Orin),B5 适用于高性能 GPU
3.数据处理
SegFormer 训练通常使用 ADE20K、Cityscapes、COCO-Stuff 等数据集。这里以 ADE20K 为例:
from torchvision import transforms
from PIL import Image
import torch# 定义数据变换
transform = transforms.Compose([transforms.Resize((512, 512)), # 统一尺寸transforms.ToTensor(), # 转换为张量transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 归一化
])# 加载图片
image = Image.open("example.jpg").convert("RGB")
input_tensor = transform(image).unsqueeze(0) # 增加 batch 维度
SegFormer 需要对图像进行归一化和尺寸调整
4.训练 SegFormer
设置优化器 & 训练参数
import torch.optim as optimoptimizer = optim.AdamW(model.parameters(), lr=5e-5, weight_decay=0.01) # AdamW 优化器
loss_fn = torch.nn.CrossEntropyLoss() # 交叉熵损失
训练循环
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)for epoch in range(10): # 训练 10 轮for images, masks in dataloader: # 遍历数据集images, masks = images.to(device), masks.to(device)optimizer.zero_grad() # 清空梯度outputs = model(images).logits # 前向传播loss = loss_fn(outputs, masks) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数print(f"Epoch [{epoch+1}/10], Loss: {loss.item():.4f}")
使用 AdamW 进行优化,并在 GPU 上训练 SegFormer
5.训练优化技巧
(1) 余弦退火学习率调度
from torch.optim.lr_scheduler import CosineAnnealingLRscheduler = CosineAnnealingLR(optimizer, T_max=10, eta_min=1e-6) # 余弦退火
for epoch in range(10):scheduler.step()
动态调整学习率,提高收敛速度
(2) 混合精度训练(AMP)
scaler = torch.cuda.amp.GradScaler()for images, masks in dataloader:images, masks = images.to(device), masks.to(device)with torch.cuda.amp.autocast(): # 自动混合精度outputs = model(images).logitsloss = loss_fn(outputs, masks)scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()
混合精度训练可减少 50% 内存占用,加速训练
6.评估 & 可视化
(1) 计算 mIoU(均值交并比)
import torchmetricsiou_metric = torchmetrics.JaccardIndex(num_classes=150).to(device)for images, masks in test_loader:images, masks = images.to(device), masks.to(device)outputs = model(images).logits.argmax(dim=1) # 获取预测类别iou = iou_metric(outputs, masks) # 计算 IoUprint(f"mIoU: {iou:.4f}")
使用 IoU 评估模型精度,mIoU 越高,分割效果越好
(2) 可视化分割结果
import matplotlib.pyplot as pltdef visualize_segmentation(image, mask, pred):plt.figure(figsize=(12, 4))plt.subplot(1, 3, 1)plt.imshow(image.permute(1, 2, 0).cpu().numpy()) # 原图plt.subplot(1, 3, 2)plt.imshow(mask.cpu().numpy(), cmap="gray") # 真实 maskplt.subplot(1, 3, 3)plt.imshow(pred.cpu().numpy(), cmap="gray") # 预测 maskplt.show()image, mask = next(iter(test_loader))
image, mask = image.to(device), mask.to(device)
pred = model(image.unsqueeze(0)).logits.argmax(dim=1)
visualize_segmentation(image, mask, pred)
可视化分割结果,直观评估模型表现
7.结论
🚀 通过 SegFormer 训练代码解析,我们学习了:
-
环境准备 & 预训练模型加载
-
数据预处理
-
训练 SegFormer(优化器、损失函数、训练循环)
-
优化技巧(余弦学习率调度、AMP 训练)
-
模型评估(mIoU)& 结果可视化
二、SegFormer 训练优化:提升精度 & 加速训练
在之前的基础训练代码上,我们可以通过以下优化方法提升 SegFormer 训练效果,包括:
-
数据增强
-
优化损失函数
-
改进学习率调度
-
使用知识蒸馏
-
模型剪枝 & 量化
1.数据增强:提高泛化能力
SegFormer 的 Transformer 结构对数据增强非常敏感,以下几种增强方法可提升分割效果:
颜色增强 + 空间变换
from torchvision import transformsdata_transforms = transforms.Compose([transforms.RandomResizedCrop((512, 512)), # 随机裁剪transforms.RandomHorizontalFlip(p=0.5), # 随机翻转transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), # 颜色抖动transforms.ToTensor(),transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
增强数据多样性,提高模型的泛化能力
2.损失函数优化:Focal Loss 处理类别不均衡问题
语义分割任务中,小目标类别经常被忽略,使用 Focal Loss 可以减少大类别的影响:
import torch.nn.functional as Fclass FocalLoss(torch.nn.Module):def __init__(self, gamma=2, alpha=0.25):super(FocalLoss, self).__init__()self.gamma = gammaself.alpha = alphadef forward(self, logits, targets):ce_loss = F.cross_entropy(logits, targets, reduction='none')pt = torch.exp(-ce_loss)loss = self.alpha * (1 - pt) ** self.gamma * ce_lossreturn loss.mean()loss_fn = FocalLoss(gamma=2, alpha=0.25)
Focal Loss 可提高小目标的分割效果
3.进阶学习率调度
(1) 余弦退火 + Warmup
from torch.optim.lr_scheduler import CosineAnnealingLRoptimizer = torch.optim.AdamW(model.parameters(), lr=5e-4, weight_decay=0.01)
scheduler = CosineAnnealingLR(optimizer, T_max=50, eta_min=1e-6)for epoch in range(50):train_one_epoch(model, dataloader, optimizer, loss_fn)scheduler.step()
学习率动态衰减,提高训练稳定性
(2) Poly 退火策略
def poly_lr_scheduler(optimizer, init_lr=5e-4, power=0.9, total_epochs=50, current_epoch=0):new_lr = init_lr * (1 - current_epoch / total_epochs) ** powerfor param_group in optimizer.param_groups:param_group['lr'] = new_lr
Poly 退火适用于语义分割任务,提高最终精度
4.知识蒸馏:使用大模型指导小模型
知识蒸馏可以利用 SegFormer-B5 训练 SegFormer-B0,使其在低计算量的情况下接近大模型效果:
def knowledge_distillation_loss(student_logits, teacher_logits, temperature=4):soft_targets = F.softmax(teacher_logits / temperature, dim=1)soft_outputs = F.log_softmax(student_logits / temperature, dim=1)return F.kl_div(soft_outputs, soft_targets, reduction='batchmean')teacher_model = SegformerForSemanticSegmentation.from_pretrained("nvidia/segformer-b5-finetuned-ade-512-512")
teacher_model.eval()for images, masks in dataloader:images, masks = images.to(device), masks.to(device)with torch.no_grad():teacher_outputs = teacher_model(images).logitsstudent_outputs = model(images).logitsloss = knowledge_distillation_loss(student_outputs, teacher_outputs) + loss_fn(student_outputs, masks)optimizer.zero_grad()loss.backward()optimizer.step()
蒸馏训练可以让 SegFormer-B0 逼近 B5 的效果,但计算量减少 80%
5.模型剪枝 & 量化
(1) 剪枝 Transformer 结构
import torch.nn.utils.prune as prunefor name, module in model.named_modules():if isinstance(module, torch.nn.Linear): # 仅对 Transformer 结构中的 Linear 层剪枝prune.l1_unstructured(module, name='weight', amount=0.3) # 剪掉 30% 参数
剪枝后模型加速 30%
(2) INT8 量化(PyTorch 量化感知训练)
import torch.quantizationmodel.qconfig = torch.quantization.get_default_qconfig("fbgemm") # 量化配置
model = torch.quantization.prepare(model) # 量化感知训练
model = torch.quantization.convert(model) # 转换为量化模型
量化后推理加速 2x,几乎无精度损失
6.结果对比
优化方法 | mIoU 提升 | 计算量减少 | 训练速度加快 |
---|---|---|---|
数据增强 | +2.3% | - | - |
Focal Loss | +3.1% | - | - |
余弦调度 | +1.5% | - | - |
知识蒸馏 | +4.2% | - | - |
剪枝 30% | -1.2% | -30% | +40% |
INT8 量化 | -1.5% | -50% | +2x |
最终优化后,SegFormer 训练更快、更精确,推理速度提升 2x,mIoU 提高 5%!
7.结论
通过 数据增强、优化损失函数、知识蒸馏、剪枝 & 量化,可以大幅提高 SegFormer 训练效果,并优化部署效率。
三、SegFormer 量化部署:加速推理 & 降低计算成本
SegFormer 量化部署的核心目标是减少模型计算量,提高在边缘设备(如 Jetson Orin、Nano)上的运行效率。以下是完整的 SegFormer 量化流程:
1.量化方法概述
SegFormer 可以采用以下量化方法:
-
Post-Training Quantization (PTQ,训练后量化):对已训练模型进行量化,最简单但可能影响精度
-
Quantization-Aware Training (QAT,量化感知训练):在训练时进行量化模拟,保持更高精度
-
TensorRT INT8 量化:专为 NVIDIA GPU 优化,推理加速 4x+
推荐方案:
-
在 Jetson 设备上使用 TensorRT INT8 量化
-
在通用 CPU/GPU 上使用 QAT 以减少精度损失
2.PyTorch 静态 PTQ(INT8 量化)
PyTorch 提供 torch.quantization
进行 PTQ:
import torch
import torch.quantization# 1. 设置量化配置
model.qconfig = torch.quantization.get_default_qconfig("fbgemm")# 2. 进行量化感知训练准备
model = torch.quantization.prepare(model)# 3. 运行几轮推理,收集统计信息
for images, _ in dataloader:model(images)# 4. 进行静态量化
quantized_model = torch.quantization.convert(model)# 5. 保存量化模型
torch.save(quantized_model.state_dict(), "segformer_quantized.pth")
推理加速 1.5x,适用于 CPU 设备
3.量化感知训练(QAT)
如果 PTQ 量化后精度下降严重,可以用 QAT 进行微调:
from torch.quantization import get_default_qat_qconfigmodel.qconfig = get_default_qat_qconfig("fbgemm")
model = torch.quantization.prepare_qat(model)# 继续训练几轮
for epoch in range(5):train_one_epoch(model, dataloader, optimizer, loss_fn)quantized_model = torch.quantization.convert(model)
QAT 保持高精度,适用于 GPU 部署
4.TensorRT INT8 量化
Jetson 设备(Nano/Orin)上推荐使用 TensorRT 进行 INT8 量化。
(1) 将 PyTorch 模型转换为 ONNX
dummy_input = torch.randn(1, 3, 512, 512) # 设定输入尺寸
torch.onnx.export(model, dummy_input, "segformer.onnx", opset_version=13)
ONNX 格式可用于 TensorRT 加速
(2) 使用 TensorRT 进行 INT8 量化
在 Jetson 设备上运行:
# 生成 TensorRT 引擎
trtexec --onnx=segformer.onnx --saveEngine=segformer_int8.trt --int8
推理速度提升 4x,适用于 Jetson Nano/Orin
5.结果对比
量化方法 | mIoU 变化 | 推理加速 | 适用平台 |
---|---|---|---|
PTQ(静态量化) | -2% | 1.5x | CPU |
QAT(训练时量化) | -1% | 2x | GPU |
TensorRT INT8 | -0.5% | 4x | Jetson |
TensorRT 量化是最佳方案,在 Jetson 设备上加速 4x,精度几乎无损
6.结论
🔥 SegFormer 量化可以显著提升推理速度,同时保持较高的分割精度。
-
QAT 适用于 GPU 训练后优化
-
TensorRT INT8 量化是 Jetson 设备上的最佳选择
相关文章:
TensorFlow SegFormer 实战训练代码解析
一、SegFormer 实战训练代码解析 SegFormer 是一个轻量级、高效的语义分割模型,结合了 ViT(视觉 Transformer) 和 CNN 的高效特征提取能力,适用于边缘 AI 设备(如 Jetson Orin)。下面,我们深入…...
51c嵌入式~单片机~合集7~※
我自己的原文哦~ https://blog.51cto.com/whaosoft/13692314 一、芯片工作的心脏--晶振 在振荡器中采用一个特殊的元件——石英晶体,它可以产生频率高度稳定的交流信号,这种采用石英晶体的振荡器称为晶体振荡器,简称晶振。 制作方法 …...
私有知识库 Coco AI 实战(一):Linux 平台部署
Coco AI 是一个完全开源、跨平台的统一搜索和生产力工具,能够连接各种数据源,包括应用程序、文件、Google Drive、Notion、Yuque、Hugo 等,帮助用户快速智能地访问他们的信息。通过集成 DeepSeek 等大型模型,Coco AI 实现了智能个…...
大模型高质量rag构建:A Cheat Sheet and Some Recipes For Building Advanced RAG
原文:A Cheat Sheet and Some Recipes For Building Advanced RAG — LlamaIndex - Build Knowledge Assistants over your Enterprise DataLlamaIndex is a simple, flexible framework for building knowledge assistants using LLMs connected to your enterpris…...
LeetCode 78.子集
问题描述 给定一个不含重复元素的整数数组 nums,返回其所有可能的子集(幂集)。 示例 输入: nums [1,2,3] 输出: [ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3] ]解法:回溯算法 回溯是一种 暴力…...
变量(Variable)
免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:从小学解方程变量x,到中学阶段函数自变量x因变量y&…...
【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…...
Dify 深度集成 MCP实现灾害应急响应
一、架构设计 1.1 分层架构 #mermaid-svg-5dVNjmixTX17cCfg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5dVNjmixTX17cCfg .error-icon{fill:#552222;}#mermaid-svg-5dVNjmixTX17cCfg .error-text{fill:#552222…...
2025 年上半年软考信息系统项目管理师备考计划
2025 年上半年软考信息系统项目管理师备考计划 2025 年上半年软考信息系统项目管理师考试时间为 5 月 24 日 - 27 日,从现在开始备考,需合理规划,高效学习。以下为详细备考计划: 一、基础学习阶段(现在 - 4 月上…...
Scikit-learn使用指南
1. Scikit-learn 简介 定义: Scikit-learn(简称 sklearn)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。特点: 基于 NumPy、SciP…...
学习大模型需要具备哪些技术、知识和基础
数学基础 概率论与数理统计:用于理解模型中的不确定性、概率分布,以及进行数据的统计分析、评估模型的性能等。例如,通过概率分布来描述模型预测结果的可信度,利用统计方法对数据进行抽样、估计模型的参数等。线性代数࿱…...
十五届蓝桥杯省赛Java B组(持续更新..)
目录 十五届蓝桥杯省赛Java B组第一题:报数第二题:类斐波那契数第三题:分布式队列第四题:食堂第五题:最优分组第六题:星际旅行第七题:LITS游戏第八题:拼十字 十五届蓝桥杯省赛Java B…...
Flink SQL Client bug ---datagen connector
原始sql语句如下 CREATE TABLE test_source (event_time TIMESTAMP(3), -- 事件时间(精确到毫秒)click INT, -- 随机数值字段WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND WITH (connector datagen, …...
股指期货的多头套期保值是什么意思?
多头套期保值,又叫“买入套期保值”,听起来很复杂,其实很简单。它的核心就是“提前锁定价格,防止未来价格上涨”。 举个例子,假设你是一家工厂的老板,过几个月要买一批原材料。现在原材料的价格是100元/吨…...
hadoop集群配置-scp命令
scp 命令用于在不同主机之间复制文件或目录,在Hadoop集群配置中常用于将配置文件或相关资源分发到各个节点。以下是 scp 命令的基本用法和在Hadoop集群配置中的示例: 基本语法 scp [-r] [源文件或目录] [目标用户目标主机:目标路径] - -r :…...
Redis 源码硬核解析系列专题 - 结语:从源码看Redis的设计哲学
1. 引言 通过前七篇的源码解析,我们从Redis的整体架构、核心数据结构、事件驱动模型,到内存管理、持久化、主从复制与集群模式,逐步揭开了Redis高性能与简洁性的秘密。本篇将总结这些技术细节,提炼Redis的设计哲学,并探讨如何将源码学习成果应用到实际开发中。 2. Redis的…...
解决QSharedPointer栈变量的崩溃问题
目录 参考崩溃代码现象 解决 参考 QSharedPointer的陷阱 qt中的共享指针,QSharedPointer类 崩溃 代码 #include <QtCore/QCoreApplication> #include <QDebug> #include <QSharedPointer>class MyClass { public:void doSomething() {qDebug…...
Lambda 表达式是什么以及如何使用
目录 📌 Kotlin 的 Lambda 表达式详解 🎯 什么是 Lambda 表达式? 🔥 1. Lambda 表达式的基本语法 ✅ 示例 1:Lambda 基本写法 ✅ 示例 2:使用 it 关键字(单参数简化) ✅ 示例 3…...
C++自定义迭代器
实现自己的迭代器 最近在写数据结构,使用类模板实现,碰到了一些问题,其中有一个就是遍历的问题,查阅资料最后实现了自己的迭代器,让我实现的数据结构能像STL一样进行for循环遍历。 类的构成 #include <stdexcept…...
PWA 中的 Service Worker:如何实现应用离线功能
前言 在当今快速发展的互联网时代,Progressive Web App (PWA) 正在逐步成为现代 Web 开发的主流选择。PWA 将 Web 应用和原生应用的最佳特性相结合,提供了丰富的用户体验。而在 PWA 的众多技术中,Service Worker 无疑是其核心组件之一。 作…...
dockerfile制作镜像
1.docker pull centos:centos7 2.dockerfile内容 FROM centos:centos7 #指定镜像维护的作者和邮箱 MAINTAINER csdn< **********qq.com #设置环境变量mypath ENV MYPATH /usr/local #设置进入容器的默认目录是/usr/local WORKDIR $MYPATH # 下载并替换 CentOS 镜像源 RUN …...
网络空间安全(46)DevSecOps概述
一、定义与核心理念 DevSecOps是“开发(Development)、安全(Security)和运营(Operations)”的结合,它将安全实践融入软件开发生命周期的每个阶段,从需求、设计、开发、测试到部署和运…...
LeetCode 211
实现支持通配符的字典树(Trie):解决单词匹配问题 一、问题描述 我们需要设计一个数据结构,支持以下功能: 添加新单词搜索字符串是否与任何已添加的单词匹配,其中搜索字符串可能包含通配符 .(…...
Docker Compose 启动jar包项目
参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...
利用deepseek直接调用其他文生图网站生成图片
这次deepseek输入中文后,其实翻译英文后,是可以丢到比如pollinations.这个网站,来生成图片,用法如下: 你是一个图像生成助手,请根据我的简单描述,想象并详细描述一幅完整的画面。 然后将你的详…...
远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
通过Docker下载Jupyter镜像部署,输入jupyter会发现 有几个版本,不知道怎么选?这几个版本有什么差别? 常见版本有: jupyter/base-notebookjupyter/minimal-notebookjupyter/scipy-notebookjupyter/datascience-notebo…...
11. 盛最多水的容器
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 最左右两边逐步往中间走,每次在左右中选取小的一个或–记录最大面积 提示:小白个人理解,如有错误敬请谅解! 二、外层配合操作…...
Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
如果文章对你有用,请给个赞! 匹配的ChromeDriver和浏览器版本是更好完成自动化的基础,可以从这里去下载驱动程序: 最全ChromeDriver下载含win linux mac 最新版本134.0.6998.165 持续更新..._chromedriver 134-CSDN博客 如果你问…...
Kotlin 基础语法解析
详细的 Kotlin 基础语法解析,结合概念说明和实用场景: --- ### **一、变量与常量** #### **1. 变量类型** - **val**(不可变变量):声明后不可重新赋值,类似 Java 的 final。 kotlin val name "Kotl…...
html 列表循环滚动,动态初始化字段数据
html <div class"layui-row"><div class"layui-col-md4"><div class"boxall"><div class"alltitle">超时菜品排行</div><div class"marquee-container"><div class"scroll-…...
【大模型基础_毛玉仁】5.4 定位编辑法:ROME
目录 5.4 定位编辑法:ROME5.4.1 知识存储位置1)因果跟踪实验2)阻断实验 5.4.2 知识存储机制5.4.3 精准知识编辑1)确定键向量2)优化值向量3)插入知识 5.4 定位编辑法:ROME 定位编辑:…...
Using SAP an introduction for beginners and business users
Using SAP an introduction for beginners and business users...
Android学习总结之RecyclerView补充篇
在 Android 开发中,列表数据更新的性能一直是关键痛点。传统的 notifyDataSetChanged() 会触发全量刷新,导致不必要的界面重绘。而 DiffUtil 作为 Android 提供的高效差异计算工具,能精准识别数据变化,实现局部更新,成…...
mapbox基础,使用geojson加载cluster聚合图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️circle点图层样式二、🍀使用geojson加…...
函数:static和extern
0.前言 在正式开始之前先说作用域和生命周期 作用域: 作用域有分为局部变量和全局变量 局部变量:一个变量仅在其中一段代码内起作用 全局变量:所有的代码都可以使用这个变量 生命周期: 生命周期是一个代码从运行开始到结束…...
【QT】练习1
1、设计一个颜色选择器,可以输入RGB的颜色值,点击确认,可以把主界面的背景颜色改成设置的颜色 修改背景颜色:setStyleSheet(“background-color 红绿蓝颜色值”); // mainwindow.cpp #include "mainwindow.h" #include…...
GreenPlum学习
简介 Greenplum是一个面向数据仓库应用的关系型数据库,因为有良好的体系结构,所以在数据存储、高并发、高可用、线性扩展、反应速度、易用性和性价比等方面有非常明显的优势。Greenplum是一种基于PostgreSQL的分布式数据库,其采用sharednothi…...
张量-pytroch基础(2)
张量-pytroch网站-笔记 张量是一种特殊的数据结构,跟数组(array)和矩阵(matrix)非常相似。 张量和 NumPy 中的 ndarray 很像,不过张量可以在 GPU 或其他硬件加速器上运行。 事实上,张量和 Nu…...
Linux多线程编程的艺术:封装线程、锁、条件变量和信号量的工程实践
目录 📌这篇博客能带给你什么? 🔥为什么需要封装这些组件? 一、线程封装 框架设计 构造与析构 1.线程创建 2.线程分离 3.线程取消 4.线程等待 二、锁封装 框架设计 构造与析构 1.加锁 2.解锁 3.RAII模式 三、条件…...
2025年智慧能源与控制工程国际学术会议(SECE 2025)
官网:www.ic-sece.com 简介 2025年智慧能源与控制工程国际学术会议(SECE 2025)将于2025年4月18日线上会议形式召开,这是一个集中探讨全球智慧能源和控制工程领域创新和挑战的国际学术平台。旨在汇集全球领域内的学者、研究人员、…...
Android 16开发实战指南|锁屏交互+Vulkan优化全解析
一、环境搭建与项目初始化 1. 安装Android Studio Ladybug 下载地址:Android Studio官网关键配置: # 安装后立即更新SDK SDK Manager → SDK Platforms → 安装Android 16 (Preview) SDK Manager → SDK Tools → 更新Android SDK Build-Tools至34.0.0 # 通过命令行安装SDK组…...
sscanf() 用法详解
sscanf() 是 scanf() 的变体,它用于从字符串中提取格式化数据,常用于解析输入字符串。 1️⃣ sscanf() 语法 int sscanf(const char *str, const char *format, ...); str:要解析的字符串(必须是 const char*,可以用…...
0基础入门scrapy 框架,获取豆瓣top250存入mysql
一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名) 使用终端运行太麻烦了,而且…...
Linux常见操作命令(2)
(一)复制和移动 复制和移动都分为文件和文件夹,具体的命令是cp和mv。 1.复制文件(复制的文件要是已创建) 格式:cp 源文件 目标文件。 示例:把filel.txt复制一份得到file2.txt。 那么对应的命令就是&#x…...
谷歌将 Android OS 完全转变为 “内部开发”
2025 年 3 月 27 日,据 Android Authority 报道,谷歌证实将从下周开始完全在内部分支机构闭门开发安卓操作系统。相关信息如下: 背景:多年来,谷歌同时维护着两大安卓主要分支,一是面向公众开放的 “安卓开源…...
移动端六大语言速记:第2部分 - 控制结构
移动端六大语言速记:第2部分 - 控制结构 本文继续对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的控制结构,帮助开发者快速掌握各语言的语法差异。 2. 控制结构 2.1 条件语句 各语言条件语句的语法对比: …...
【 Vue 2 中的 Mixins 模式】
Vue 2 中的 Mixins 模式 在 Vue 2 里,mixins 是一种灵活的复用代码的方式,它能让你在多个组件间共享代码。借助 mixins,你可以把一些通用的选项(像 data、methods、computed 等)封装到一个对象里,然后在多…...
STM32F103_LL库+寄存器学习笔记13 - 梳理外设CAN与如何发送CAN报文(串行发送)
导言 CAN总线因其高速稳定的数据传输与卓越抗干扰性能,在汽车、机器人及工业自动化中被广泛应用。它采用分布式网络结构,实现多节点间实时通信,确保各控制模块精准协同。在汽车领域,CAN总线连接发动机、制动、车身系统,…...
DataPlatter:利用最少成本数据提升机器人操控的泛化能力
25年3月来自中科院计算所的论文“DataPlatter: Boosting Robotic Manipulation Generalization with Minimal Costly Data”。 视觉-语言-动作 (VLA) 模型在具身人工智能中的应用日益广泛,这加剧对多样化操作演示的需求。然而,数据收集的高成本往往导致…...
受控组件和非受控组件的区别
在 React 中,受控组件(Controlled Components) 和 非受控组件(Uncontrolled Components) 是处理表单元素的两种不同方式,它们的核心区别在于 数据管理的方式 和 与 React 的交互模式。 受控组件…...