PyTorch深度学习实践:从动态图机制到训练避坑与性能进阶
我用 PyTorch 差不多六七年了从它还在内部测试期一路用到现在看着它从一个“研究圈子里的玩具”慢慢变成深度学习方向的事实标准。说实话中途不是没换过别的框架但每次都被动态图的调试体验和生态的完整度拉回来了。这篇文章不打算写教学贴而是想以从业者的视角聊聊为什么 PyTorch 能成为现在的主流选择、核心概念到底该怎么理解、真正训练模型时有哪些坑是文档里不会告诉你的以及从“能用”到“好用”你还差哪些东西。无论你是刚准备入门深度学习的初学者还是需要拿它做项目落地的开发者这篇应该都能给你一些参考价值。1. 为什么是 PyTorch动态图带来的开发自由度1.1 动态计算图让调试像写普通 Python 一样自然很多人第一次接触 PyTorch听到最多的词就是“动态图”。动态图到底是什么意思我举个例子你就懂了。想象你在做一道数学题用笔在纸上一步步推导每一步的中间结果都可以随时拿起来检查、修改。这就是 PyTorch 的运行方式——你写一行代码它就真的执行这一行计算图是即时构建的。而静态图框架的思路完全相反它要求你先描述完整张计算流程然后交给编译器去“优化并执行”中间过程就像黑盒一样想打印个中间变量都得额外操作。用过静态图框架的朋友应该都体会过那种调试时抓耳挠腮的感觉你明明只想看一眼某个张量的 shape却得改写整个模型的结构。PyTorch 这种动态机制带来最直接的收益是调试效率。你可以随意在模型里加print语句加断点甚至用纯 Python 的if判断去改变计算分支。模型定义和模型运行没有割裂排查问题的时间和心智负担都会低很多。1.2 不只是框架它背后的生态闭环PyTorch 能赢光靠动态图还不够真正拉开差距的是生态。从数据处理、模型训练、模型压缩到最终部署PyTorch 背后已经形成了完整闭环。我在实际项目中感受最深的是三点。第一是模型来源广。大量研究机构、开源社区发布的预训练模型和论文源码首发的就是 PyTorch 版本这意味着你做迁移学习时永远有最新的现成权重可以拿不需要花费精力去做框架转换。第二是工具链统一。混合精度训练、分布式训练、模型量化导出这些高级功能在 PyTorch 里都是官方原生支持不需要额外拼装第三方库版本兼容的问题少很多。第三是生产环境成熟。在服务端部署时有 TorchServe在移动端和边缘设备有针对 ARM 平台的优化方案在 Web 端也有对应的运行时。研究阶段写的模型能相对平滑地走到线上推理这对做落地项目的团队来说至关重要。1.3 横向对比它凭什么比其他框架更顺手如果拿 PyTorch 和其他主流框架横向比最直观的差异就是对 Python 语法的尊重。别的框架经常搞出一套“自己的 DSL”要求你用特定方式定义网络结构写多了总有种“被框架绑架”的感觉。PyTorch 则把网络定义做成纯粹的 Python 类继承和函数调用你不需要学习额外的声明式语法。性能和资源占用方面PyTorch 在很多常见模型上的表现并不逊色配合torch.compile后面会详细讲还能进一步追平甚至领先。更重要的是团队的人才匹配优势——市面上熟练 PyTorch 的工程师明显更多招人、协作、交接的成本都更低。对绝大多数团队来说“主流”本身就是一个巨大的价值。2. 核心概念拆解把框架的底裤看穿2.1 张量Tensor比 NumPy 多了一颗“GPU 的心脏”如果你用过 NumPy那理解 PyTorch 的张量几乎零成本。张量就是一个支持多维数组操作的通用容器最基本的使用方式跟 NumPy 数组一模一样import torch # 创建张量 x torch.randn(2, 3) # 2x3 的随机张量 y torch.ones(2, 3) z x y # 逐元素加法广播机制和 NumPy 一致 # 和 NumPy 互转 import numpy as np a np.zeros((2, 2)) tensor_a torch.from_numpy(a) # NumPy - 张量 back_to_numpy tensor_a.numpy() # 张量 - NumPy但张量比 NumPy 数组多了一个关键能力在 GPU 上运行。只需要调.to(cuda)或者把设备信息传进去数据就会被搬进显存后续的矩阵运算全部走 GPU 并行加速。深度学习要求海量计算这一条就足够构成鸿沟了。张量还有几个属性需要特别注意dtype数据类型、device所在设备、requires_grad是否需要梯度。这三个属性混合在一起的时候是初学者最容易翻车的地方。比如默认的浮点类型是float32但如果你想做低精度推理可能需要手动转成float16再比如 CPU 上的模型权重不能直接和 GPU 上的数据做运算必须先统一设备。这些问题下面避坑章节会详细展开。2.2 autograd梯度是怎么“免费”算出来的PyTorch 最核心的“发动机”是自动微分引擎。它的原理可以这样理解当你进行任何张量运算时框架在背后记录了一张数据流图每个节点是一个张量每条边是一个运算。当你调用loss.backward()时引擎沿着这张图从输出反向“扫”一遍用链式法则计算出每个叶子节点的梯度。x torch.tensor(3.0, requires_gradTrue) y x ** 2 z 2 * y 1 z.backward() # 反向后x.grad dz/dx 4*x 12 print(x.grad) # tensor(12.)这个机制极大解放了研究者。你想自定义一个复杂的损失函数直接写纯粹的张量运算就行只要所有算子都由 PyTorch 提供梯度就能自动算出来不用手推公式也不用手写反向传播函数。有一点我要提醒梯度是累积的。每次backward()之后张量的.grad属性不会自动清零下次计算新梯度会累加。所以标准训练循环里每步更新参数前都要调optimizer.zero_grad()否则梯度越积越大loss 会莫名其妙地飞掉。2.3 nn.Module、Dataset 与 DataLoader组装深度学习流水线nn.Module是定义模型结构的基类。你写一个网络本质上就是定义一个继承自nn.Module的类在__init__里声明各层在forward里定义前向传播逻辑。import torch.nn as nn class SimpleMLP(nn.Module): def __init__(self, in_dim, hidden_dim, out_dim): super().__init__() self.fc1 nn.Linear(in_dim, hidden_dim) self.relu nn.ReLU() self.fc2 nn.Linear(hidden_dim, out_dim) def forward(self, x): x self.fc1(x) x self.relu(x) x self.fc2(x) return xnn.Module背后做了很多隐式工作。当你调用.to(cuda)时它会递归地把所有子模块的参数移动过去当你调用.train()或.eval()时它会切换所有层的运行状态比如 Dropout 开关、BatchNorm 的统计方式当你访问.parameters()时它会自动收集所有子孙模块里的可学习参数。这些机制让你不用自己手动维护参数列表。Dataset和DataLoader则负责数据供给。Dataset定义如何按索引拿一条样本DataLoader负责做批量组装、乱序、多进程预加载。正确的搭配大概是这样的from torch.utils.data import Dataset, DataLoader class MyDataset(Dataset): def __init__(self, data, labels): self.data data self.labels labels def __len__(self): return len(self.data) def __getitem__(self, idx): return self.data[idx], self.labels[idx] dataset MyDataset(all_data, all_labels) loader DataLoader(dataset, batch_size32, shuffleTrue, num_workers4)num_workers直接决定数据加载的并行程度。在训练时如果 GPU 常常“饿着等数据”优先把它调大往往能立竿见影地提速度。3. 实操全流程从零训练一个图像分类模型3.1 数据准备别小看数据管线的设计很多新手上来就写模型但实际项目里数据处理才是大头。标准流程是先把原始图片数据整理成“索引 预处理函数”的形式让每个样本能独立、快速地取出来再交给DataLoader做批量化和打乱。图像数据一般会做 normalize比如 ImageNet 的标准均值方差[0.485, 0.456, 0.406]和[0.229, 0.224, 0.225]。用这些数值把像素标准化到以 0 为中心的单位方差附近有利于模型收敛。但如果你换了一个数据集最好重新统计自己数据集的均值和方差直接套用预训练的统计量不总是好事我之前在这个问题上吃过亏换了数据集后性能一直上不去最后重新统计才解决。预处理阶段还要做数据增强。常用的是随机水平翻转、随机裁剪、颜色抖动。增强的本质是正则化防止模型对具体像素分布过拟合。但增强不是越多越好过度增强可能让模型的训练难度暴增收敛变慢。要按任务和数据量去调节强度。3.2 一个完整的训练循环从 forward 到 update训练循环本身并不复杂核心骨架几乎固定。device torch.device(cuda if torch.cuda.is_available() else cpu) model SimpleMLP(128, 256, 10).to(device) optimizer torch.optim.Adam(model.parameters(), lr1e-3) loss_fn nn.CrossEntropyLoss() for epoch in range(50): model.train() total_loss 0 for inputs, labels in loader: inputs, labels inputs.to(device), labels.to(device) optimizer.zero_grad() outputs model(inputs) loss loss_fn(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() print(fepoch {epoch}, loss: {total_loss / len(loader):.4f})有几个细节必须养成习惯。一个是切换训练/评估状态。如果你的模型含有 Dropout 或 BatchNorm评估时一定要写model.eval()并在torch.no_grad()上下文中做前向计算这能关掉梯度追踪减少内存占用也避免 BatchNorm 统计被污染。另一个细节是设备统一。每次 batch 取出来后要把输入和标签都.to(device)。如果数据或者模型还留在 CPU 上PyTorch 会直接报设备不匹配的错。养成写device变量的习惯而不是把cuda写死在代码里这样换机器跑的时候不用改代码。3.3 保存与恢复不只是 checkpoint 那几行代码训练到一半断电、显存溢出、服务器被运维重启这是每个训练工程师都经历过的噩梦。所以保存 checkpoint 是必修课。# 保存 torch.save({ model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), epoch: epoch, best_acc: best_acc, }, checkpoint.pth) # 恢复 ckpt torch.load(checkpoint.pth) model.load_state_dict(ckpt[model_state_dict]) optimizer.load_state_dict(ckpt[optimizer_state_dict]) start_epoch ckpt[epoch]为什么不直接torch.save(model, ...)因为直接保存整个模型对象会把模型结构定义和权重绑定在一起代码一改动旧文件很可能就没法加载了。保存state_dict只保存参数灵活性和兼容性都强得多。还有一个容易忽略的要定期更新并保留“最好的”那份权重同时清理旧的 checkpoint。我在实际项目里会同时保留best.pt和last.pt——一个保证性能回退一个保证训练能继续。3.4 损失函数与优化器的选择逻辑优化器的选择上大部分场景 Adam 是安全牌自适应学习率、开箱即用、不太需要手调。但追求极限收敛性能时带 momentum 的 SGD 配合学习率衰减在很多视觉任务上效果反而更稳。学习率的选择我一般从1e-3Adam或1e-2SGD起步观察前几个 epoch 的 loss 变化如果直接发散就除以 10如果收敛太慢就翻倍一点这个“试错法”在实际工作中远比空谈理论香。损失函数则要跟任务严格对齐。分类任务用交叉熵回归任务用MSELoss或L1Loss多标签分类用带 sigmoid 的BCEWithLogitsLoss。别把CrossEntropyLoss塞进回归任务模型的预测输出结构都不一样效果自然是灾难。4. 避坑指南训练时那些让人头疼的问题4.1 显存管理Out of Memory 到底怎么破显存溢出是几乎每个人都会撞上的墙。最直观的方案是调小 batch size但要意识到显存占用不只是 batch size 单一决定还有三个隐藏因素输入分辨率、模型参数量、中间特征图大小。所以有时候调小 batch size 依然爆显存就该看看是不是输入图片太大或者中间层通道数太多。梯度累积可以绕开硬件限制。思路是先用小 batch 算梯度反向传播但不更新参数累积好几步后再统一optimizer.step()。accumulation_steps 4 optimizer.zero_grad() for i, (inputs, labels) in enumerate(loader): outputs model(inputs) loss loss_fn(outputs, labels) / accumulation_steps # 平均一下 loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()注意一个细节既然梯度会累积等价于一个大 batch 的效果所以学习率在梯度累积时一般可以适当调大一点。这个方案用来“模拟”大 batch 很有用。另一个思路是开启混合精度训练。现在主流 PyTorch 训练栈会推荐torch.amp它把大部分计算放在float16上显存占用几乎减半运算速度也更快精度上配合损失缩放基本不受影响。这也是我处理大模型时首选的方案。4.2 设备迁移CPU、GPU 混用引发的诡异报错最常见报错就是Expected all tensors to be on the same device。这类问题基本是模型参数或数据没统一设备。排查思路很简单在训练循环头尾各打印一次model.device和inputs.device看看谁掉队了。我自己的习惯是写一个通用工具函数def to_device(data, device): if isinstance(data, (list, tuple)): return [to_device(x, device) for x in data] elif isinstance(data, dict): return {k: to_device(v, device) for k, v in data.items()} else: return data.to(device)把输入数据、标签、甚至模型输出的中间结构都统一搬移到device上一劳永逸。分布式训练时还会遇到CUDA_VISIBLE_DEVICES环境变量和device不一致的问题我的经验是尽量在入口脚本就固定好变量不要靠代码去猜。4.3 可复现性为什么随机种子要死死钉住深度学习里的随机性来自很多地方数据加载顺序、参数初始化、Dropout 采样、数据增强的随机操作。不同机器、甚至同一台机器两次运行结果都可能不一样。需要做实验对比时这个不确定性会让人抓狂。要尽量可复现需要在训练脚本开头设置好随机种子import random import numpy as np import torch def set_seed(seed): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic True torch.backends.cudnn.benchmark Falsecudnn.deterministic会强制底层算法走确定性路径但这也意味着某些操作变慢。benchmarkFalse则不让 cuDNN 自动搜索最优算法。所以这个设置是用性能换确定性日常对比实验开没问题大规模正式训练可以关掉。4.4 常见训练异常速查表现象可能原因解决方向Loss 变成 NaN学习率过大、梯度爆炸、数据里含 NaN降低学习率检查输入数据加入梯度裁剪clip_grad_norm_Loss 不下降学习率太小/太大、数据没归一化、模型结构有问题打印梯度范数判断是否消失调学习率并尝试 warmup验证集准确率忽高忽低BatchNorm 使用不当、评估时忘了model.eval()评估循环加eval()和no_grad()GPU 利用率很低数据加载太慢、预处理瓶颈调大num_workers用pin_memoryTrue训练集 loss 很小但验证集很差过拟合加数据增强、加正则化、降低模型容量、加早停加载模型后效果变差state_dict 与模型结构不匹配、忘了model.eval()检查加载键是否完全一致评估前调eval()这里我想多说一句梯度裁剪。clip_grad_norm_不是所有任务都用得上但对 RNN、Transformer 这类容易梯度爆炸的结构基本是标配。在loss.backward()之后、optimizer.step()之前加一行torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)它会限制梯度的总体范数不超过设定值防止突兀的梯度把参数一步推飞。5. 从能用到好用必须进阶的能力5.1 torch.compile一行代码白捡提速PyTorch 2.x 时代最重要的特性之一就是torch.compile。它通过把 Python 层的操作融合到底层 Kernel 里减少中间张量的创建和内核启动开销。使用方法极其简单model torch.compile(model)就这么一行很多视觉模型在 GPU 上能稳定提速 20%~40%有些甚至更高。但有几个前提你需要新版 PyTorch 和较新版本的 CUDA 环境。第一次调用时它需要做编译和后端选择会有几分钟的“预热”时间这是正常的不是卡死。如果遇到模型结构特别复杂或者用到很多自定义算子编译可能失败或者收益不明显这时候可以退回原版跑。5.2 分布式训练从单卡到多卡绕不开 DDP当单卡显存或算力不够时第一选择是DistributedDataParallel。它比老的DataParallel更高效做法是把模型复制到多张卡上每个进程独立处理一部分数据梯度通过通信机制在各卡之间同步。import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP dist.init_process_group(nccl) # 假设你用的是 GPU rank dist.get_rank() device torch.device(fcuda:{rank}) model SimpleMLP(128, 256, 10).to(device) model DDP(model, device_ids[rank])启动方式一般通过torchruntorchrun --nproc_per_node4 train.py这里最容易被坑的是数据加载的分片逻辑。DDP 要求每个进程拿到不同的数据分片所以每个 rank 上要单独构造了一个DistributedSampler并且每个 epoch 要调用sampler.set_epoch(epoch)来重新打乱并分片。忘了这一步等于每张卡都在喂完全一样的数据训练结果会严重失真。5.3 部署与导出模型训练完还不够要能跑起来训练完的模型面向实际业务时往往需要导出成特定格式或跑在特定运行时上。最通用的中间格式是 ONNX。dummy_input torch.randn(1, 3, 224, 224).to(device) model.eval() torch.onnx.export( model, dummy_input, model.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size}, output: {0: batch_size}} )dynamic_axes允许 batch size 动态变化这是线上服务非常常见的需求否则只能用固定的 batch size 推理。导出后建议先用 ONNX Runtime 做一次精度对比校准避免某些算子兼容性偏差导致精度下降。如果目标平台是浏览器或 Node.js 环境也可以转成对应的 web 格式如果是移动端或边缘设备则考虑量化到int8以换取更低延迟和更小体积。总之模型的生命周期不止停在.pth文件部署一环需要提前规划想好“将来要跑在哪”会决定你导出时要做哪些策略选择。我个人在实际操作中的体会是PyTorch 学习曲线其实很平缓真正拦住你的往往不是模型代码而是数据管线和训练细节。那些看起来不起眼的规范——统一设备、切换模式、管理随机种子、控制梯度累积——才是决定模型能不能训练成功的分水岭。如果你正好在入门阶段建议不要贪多先把“数据加载、模型定义、训练循环、评估、保存恢复”这条主链路跑通再逐步加混合精度、分布式这些高级特性。这条路我走过靠谱。

相关新闻

Clang交叉编译实战:iOS逆向中的arm64工具链配置与签名技巧

Clang交叉编译实战:iOS逆向中的arm64工具链配置与签名技巧

做iOS逆向的人,多半都遇到过这种尴尬:工具链装好了、设备连上了,结果发现自己在电脑上编译出来的文件根本跑不到手机上。x86_64的Mach-O塞进arm64设备,系统理都不理。于是到处搜“iOS交叉编译”,折腾半天,发…

2026/10/17 19:00:25 阅读更多 →
QT5.13 TCP聊天程序:解决粘包乱码并发崩溃的实战方案

QT5.13 TCP聊天程序:解决粘包乱码并发崩溃的实战方案

简介:本资源是一套基于QT5.13.0实现的完整TCP通信实战项目,面向C与Qt初学者及网络编程入门者,聚焦服务端与客户端双向通信、多客户端并发处理、回车即时发送等核心功能,适用于聊天系统开发、物联网设备通信模拟等典型场景。压缩包…

2026/10/17 19:00:40 阅读更多 →
VR移动端光照优化:从Shadowmask到Subtractive的材质分级实战

VR移动端光照优化:从Shadowmask到Subtractive的材质分级实战

1. 项目缘起与整体优化思路拆解1.1 为什么要动光照模式这块硬骨头做VR项目的人都有一个共识:帧率就是命。普通PC游戏掉到45帧玩家可能忍一忍就过去了,但VR头显里一旦掉到72帧以下,眩晕感立刻上来,用户摘头显的速度比你优化代码的速…

2026/10/17 19:09:50 阅读更多 →

最新新闻

LayoutLM v3深度解析:多模态文档智能模型微调实战

LayoutLM v3深度解析:多模态文档智能模型微调实战

每次看到开源社区放出的文档智能模型有实质更新,我都要停下来仔细研究一番,LayoutLM系列就是这中间绕不开的名字。这个系列从最初把文本、布局、图像三种模态塞进同一个预训练框架开始,一步步变成了表格解析、票据识别、合同信息抽取这些场景…

2026/10/18 0:46:29 阅读更多 →
Event2Mind:让机器从事件文本中推理意图与反应

Event2Mind:让机器从事件文本中推理意图与反应

每次读到关于事件理解的研究,我都会习惯性地先想一个问题:机器读一句话,真的“读懂了”吗?拿“这个人被公司开除了”来说,字面上是一个解雇事件,但稍微有点常识的人都会接着想:他慌不慌&#xf…

2026/10/18 0:46:29 阅读更多 →
向量与矩阵范数详解:从L1/L2到谱范数的机器学习应用指南

向量与矩阵范数详解:从L1/L2到谱范数的机器学习应用指南

1. 为什么我们要关心“范数”这个数学工具第一次接触“范数”这个词,很多人会觉得它离实际开发很远,像是数学系课本里才会出现的抽象概念。但如果你做过机器学习、数值计算、信号处理,甚至只是用过正则化去调一个过拟合的模型,那你…

2026/10/18 0:46:29 阅读更多 →
多层网络关键节点识别:超邻接矩阵与GNN实战指南

多层网络关键节点识别:超邻接矩阵与GNN实战指南

简介:这份文档面向人工智能、大模型与复杂网络分析方向的学习者和研究者,系统梳理多层网络建模与关键节点智能识别技术。内容从多层网络的定义、模型分类与应用领域切入,逐步展开关键节点的定义、重要性及常见识别方法,并深入讲解…

2026/10/18 0:46:29 阅读更多 →
集团企业指标体系落地指南:从指标字典到数据治理的完整路径

集团企业指标体系落地指南:从指标字典到数据治理的完整路径

简介:《大型集团企业指标体系建设方案》PPT面向集团企业管理者、战略规划与运营管理岗位,是一套可直接套用的指标体系构建模板。内容从建设背景与意义切入,提出SMART指标原则,重点讲解战略目标、业务板块、运营管理、支持保障四个…

2026/10/18 0:46:29 阅读更多 →
NPDP BOK第二版:七大知识领域解析与产品开发实战应用

NPDP BOK第二版:七大知识领域解析与产品开发实战应用

简介:这是PDMA(产品发展与管理协会)官方编译的NPDP知识体系指南第二版,面向计划参加NPDP认证考试的产品经理与产品开发专业人士,是系统了解产品创新与管理核心内容的权威参考书。全书围绕七大领域展开:策略…

2026/10/18 0:45:28 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →