Libtorch C++推理实战:从环境搭建到性能调优
1. 从Python舒适区跨到C推理为什么值得折腾这一趟如果你平时用PyTorch训练模型习惯了import torch之后一切顺风顺水那么第一次听说Libtorch的时候大概率会有两种反应要么觉得“不就是C版的PyTorch嘛能有多难”要么觉得“C部署听起来就很重还是继续用Python吧”。我当初也是这两种心态来回切换直到有一次在一个对延迟极其敏感的场景里Python端的推理框架怎么调都差那么几毫秒才真正下决心把Libtorch啃了一遍。Libtorch是PyTorch官方提供的C前端库它把PyTorch的核心能力——张量运算、自动求导、神经网络模块、模型加载与推理——全部暴露给了C开发者。你训练好的模型通过TorchScript导出成.pt文件之后就可以在纯C环境里加载并执行完全不需要Python解释器参与。这件事的意义在于部署环境可以极度精简运行时开销可以压到很低而且能和已有的C工程无缝集成。适合读这篇内容的人大概有三类。第一类是做模型部署的工程师手里有训练好的模型需要在服务端或者边缘设备上用C跑起来。第二类是有C背景但没怎么接触过深度学习的开发者想找一个切入点了解模型推理是怎么回事。第三类是用Python做研究但项目最终要交付C代码的人需要一座从训练到部署的桥。不管你属于哪一类这篇内容都会从最基础的环境搭建开始一步步走到能跑通一个完整的推理流程。需要提前说明的是Libtorch的版本和PyTorch的版本是绑定的你训练模型用的PyTorch是什么版本最好就选对应版本的Libtorch。版本不匹配是新手最容易踩的坑之一后面会详细讲。另外Libtorch分CPU版和GPU版下载的时候要选对选错了要么跑不了GPU要么链接的时候一堆报错。2. 环境搭建下载、链接与第一个能编译通过的空工程2.1 选对Libtorch包CPU还是GPURelease还是DebugLibtorch的官方分发渠道提供几种不同的包主要区分维度有两个是否带CUDA支持以及是Release还是Debug构建。CPU版体积小、依赖少适合快速验证和纯CPU推理场景。GPU版体积大很多需要本机有对应的CUDA环境但能利用显卡做加速推理。我个人的建议是第一次上手先用CPU版。原因很简单CPU版的依赖链短不容易在链接阶段出问题能让你先把整个流程跑通建立信心。等你确认代码逻辑没问题了再换成GPU版重新编译一遍这时候如果出问题你至少知道是GPU相关的配置引起的排查范围小很多。下载地址在PyTorch官网的C分发页面选好你的操作系统、语言C、CUDA版本如果选GPU版之后会得到一个压缩包。解压之后目录结构大概是这样的libtorch/ ├── bin/ ├── include/ │ ├── torch/ │ └── ... ├── lib/ │ ├── libtorch.so │ ├── libtorch_cpu.so │ ├── libtorch_cuda.so (GPU版才有) │ └── ... └── share/include目录放头文件lib目录放动态库和静态库bin目录在Windows下放DLLLinux下一般用不到。记住这个结构后面写CMake的时候要用到。2.2 CMake工程的最小可用配置Libtorch官方推荐用CMake来管理工程因为C链接Libtorch涉及一堆依赖库的顺序问题手写编译命令几乎不可能搞对。下面是一个最小可用的CMakeLists.txtcmake_minimum_required(VERSION 3.18) project(libtorch_demo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 把这里换成你实际的Libtorch解压路径 set(TORCH_ROOT /path/to/libtorch) find_package(Torch REQUIRED PATHS ${TORCH_ROOT}) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}) add_executable(demo main.cpp) target_link_libraries(demo ${TORCH_LIBRARIES})这里有几个细节值得展开说。CMAKE_CXX_STANDARD至少要是17Libtorch大量使用了C17的特性用14或者11会编译失败。find_package(Torch REQUIRED PATHS ...)这一行告诉CMake去哪里找Libtorch的配置文件Libtorch的包里自带TorchConfig.cmakefind_package就是靠它来定位头文件和库文件的。TORCH_CXX_FLAGS是Libtorch要求的一些编译选项不加的话在某些平台上会出现ABI不兼容的问题。对应的main.cpp先写一个最简单的#include torch/torch.h #include iostream int main() { torch::Tensor t torch::ones({2, 3}); std::cout t std::endl; return 0; }编译运行mkdir build cd build cmake .. -DCMAKE_PREFIX_PATH/path/to/libtorch make -j4 ./demo如果一切顺利你会看到输出一个2行3列的全1矩阵。别小看这一步很多人卡在链接阶段好几天就是因为CMake配置没写对。能编译通过并正确输出张量说明环境已经通了后面的事情就是在这个基础上加东西。2.3 运行时找不到动态库怎么办Linux下编译通过但运行时报error while loading shared libraries: libtorch.so: cannot open shared object file这是非常常见的问题。原因是系统运行时链接器不知道去哪里找Libtorch的动态库。解决办法有两个一是把Libtorch的lib目录加到LD_LIBRARY_PATH环境变量里二是在CMake里设置RPATH让可执行文件记住库的位置。我一般用第一种简单直接export LD_LIBRARY_PATH/path/to/libtorch/lib:$LD_LIBRARY_PATHWindows下对应的是把lib目录加到PATH里或者把需要的DLL拷贝到可执行文件旁边。这个问题不解决你会看到编译明明成功了一运行就崩而且报错信息有时候不太直观新手容易懵。3. 张量操作C里的Tensor和Python里的到底像不像3.1 创建、索引与类型转换的对应关系Libtorch的torch::Tensor和Python里的torch.Tensor在概念上是一一对应的API命名也高度相似但C的静态类型特性让一些操作写起来不太一样。比如创建一个张量// Python: torch.zeros(3, 4) auto a torch::zeros({3, 4}); // Python: torch.ones(2, 3, dtypetorch.float64) auto b torch::ones({2, 3}, torch::kFloat64); // Python: torch.randn(5, 5) auto c torch::randn({5, 5}); // 从已有数据创建 auto d torch::tensor({1.0, 2.0, 3.0});注意torch::zeros({3, 4})这里用的是花括号初始化列表不是可变参数。Python里可以写torch.zeros(3, 4)C里必须写成torch::zeros({3, 4})这个区别一开始容易写错。索引和切片在C里没有Python那么灵活的语法糖。Python里可以写t[0, 1:3]C里需要用index或者sliceauto t torch::randn({4, 5}); // 取第0行 auto row0 t[0]; // 取第1到第2列不含第3列 auto sub t.slice(1, 1, 3); // 取特定位置的值 float val t[2][3].itemfloat();.itemT()是把单元素张量转成C标量的方法T可以是float、int、double等。这个操作在Python里对应t.item()但C里必须显式指定类型。类型转换方面Python里t.float()、t.long()很常用C里对应t.to(torch::kFloat32)、t.to(torch::kInt64)。也可以用t.toType()但to()更通用还能同时指定设备。3.2 设备管理CPU和CUDA的切换逻辑Libtorch里设备用torch::Device表示。CPU设备是torch::kCPUCUDA设备是torch::kCUDA可以指定具体哪块卡torch::Device cpu_dev(torch::kCPU); torch::Device gpu_dev(torch::kCUDA, 0); // 第0号GPU auto t torch::randn({3, 3}); t t.to(gpu_dev); // 搬到GPU t t.to(cpu_dev); // 搬回CPU这里有个经验在写推理代码的时候尽量把设备选择做成可配置的而不是硬编码。比如从命令行参数或者配置文件读取用CPU还是GPU这样同一份代码在不同环境下都能用。我见过不少项目把.to(torch::kCUDA)写死在代码里结果拿到没有GPU的机器上直接崩改起来还要重新编译。另外GPU版Libtorch在创建张量时如果指定了CUDA设备但当前环境没有可用的GPU会抛异常。所以稳妥的做法是先检查torch::cuda::is_available()torch::Device device torch::cuda::is_available() ? torch::Device(torch::kCUDA, 0) : torch::Device(torch::kCPU);这段代码在CPU版Libtorch上编译时torch::cuda::is_available()会直接返回false不会报错所以可以放心写。3.3 自动求导在C里还要不要如果你只是做推理自动求导基本用不上。但如果你打算在C里做微调或者训练那就需要了解torch::autograd。Libtorch的自动求导机制和Python端一致requires_grad属性、backward()方法都有对应auto x torch::randn({3, 3}, torch::requires_grad()); auto y x.pow(2).sum(); y.backward(); std::cout x.grad() std::endl;不过说实话在C里做训练的场景比较少大部分人是拿Libtorch做推理部署。训练还是在Python端用GPU集群跑更实际。所以这一块了解即可不用花太多精力。4. 模型加载与推理从TorchScript文件到实际输出4.1 导出TorchScript模型的正确姿势Libtorch不能直接加载Python里保存的state_dict它需要的是TorchScript格式的模型文件。导出方式有两种torch.jit.trace和torch.jit.script。trace适合结构固定的模型通过追踪一次前向传播来记录计算图script适合有控制流的模型直接编译Python源码。大部分推理场景用trace就够了import torch import torchvision model torchvision.models.resnet18(pretrainedTrue) model.eval() example_input torch.randn(1, 3, 224, 224) traced_model torch.jit.trace(model, example_input) traced_model.save(resnet18_traced.pt)这里有几个关键点。一定要先调用model.eval()否则BatchNorm和Dropout层的行为不对导出的模型推理结果会有问题。example_input的shape要和实际推理时一致trace会把这个shape固化下来虽然Libtorch加载后可以接受不同batch size的输入但空间维度最好保持一致。保存的时候用.pt后缀这是约定俗成的命名。如果用script模式scripted_model torch.jit.script(model) scripted_model.save(resnet18_scripted.pt)script模式对代码有要求不是所有Python语法都支持遇到不支持的语法会报错。所以实践中trace用得更多除非模型里确实有if/else这种控制流。4.2 在C中加载模型并执行前向传播加载TorchScript模型在C里非常简单#include torch/script.h torch::jit::script::Module module; try { module torch::jit::load(resnet18_traced.pt); } catch (const c10::Error e) { std::cerr 模型加载失败: e.what() std::endl; return -1; } module.to(torch::kCPU); module.eval();torch::jit::load返回一个script::Module对象用try-catch包住是因为文件不存在或者格式不对时会抛c10::Error。加载后调用.to()把模型搬到目标设备.eval()切换到推理模式。前向传播需要构造一个std::vectortorch::jit::IValue作为输入std::vectortorch::jit::IValue inputs; inputs.push_back(torch::randn({1, 3, 224, 224})); at::Tensor output module.forward(inputs).toTensor(); std::cout output.sizes() std::endl;IValue是Libtorch里的通用值类型可以装张量、标量、列表等。forward返回的也是IValue用.toTensor()转回张量。如果模型有多个输出forward返回的可能是tuple需要用.toTuple()再取元素。4.3 输入预处理别让归一化成为精度杀手模型在Python端训练时输入通常经过了归一化处理比如除以255、减均值、除标准差。这些操作在C推理时也必须做而且顺序和参数要完全一致否则输出会偏得离谱。以常见的ImageNet归一化为例Python端可能是这样的transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])在C里如果你用OpenCV读图得到的是BGR格式的cv::Mat需要先转成RGB再转成浮点张量然后做归一化cv::Mat img cv::imread(test.jpg); cv::cvtColor(img, img, cv::COLOR_BGR2RGB); cv::resize(img, img, cv::Size(224, 224)); // 转成张量HWC - CHW并归一化到[0,1] torch::Tensor tensor torch::from_blob(img.data, {img.rows, img.cols, 3}, torch::kByte); tensor tensor.permute({2, 0, 1}).to(torch::kFloat32).div(255.0); // 减均值除标准差 tensor tensor.sub(0.485).div(0.229); // 这里简化写了实际要对每个通道分别处理实际写的时候减均值和除标准差要对三个通道分别操作可以用torch::tensor({0.485, 0.456, 0.406}).view({3, 1, 1})构造一个广播用的张量。这一步如果偷懒不做模型输出可能完全不对而且这种错误不会报异常只是结果精度下降排查起来很隐蔽。5. 踩坑记录那些让我熬夜的编译与运行时问题5.1 版本不匹配引发的ABI错误这是最经典的一个坑。你用PyTorch 2.0训练并导出了模型然后用Libtorch 1.13去加载可能会遇到各种奇怪的报错比如undefined symbol或者version mismatch。原因是TorchScript的序列化格式在不同版本之间可能有变化而且C的ABI在不同编译器版本之间也不兼容。解决办法只有一个PyTorch和Libtorch的版本严格一致。训练用2.0Libtorch就用2.0训练用2.1Libtorch就用2.1。下载Libtorch的时候看清楚版本号别下错了。另外如果你的PyTorch是CUDA 11.8编译的Libtorch也选CUDA 11.8对应的包CUDA版本不匹配同样会出问题。5.2 链接顺序与未定义符号C链接器对库的顺序敏感-ltorch -ltorch_cpu -lc10和-lc10 -ltorch -ltorch_cpu可能一个能过一个不能过。用CMake的find_package(Torch)会自动处理好顺序所以强烈建议不要手写链接命令。如果你非要用Makefile或者手动g那就把TORCH_LIBRARIES变量里的库按原顺序全部带上不要自己调整。还有一个常见情况是编译时报undefined reference to torch::...这通常是因为头文件版本和库文件版本不一致或者链接时漏了某个库。检查TORCH_LIBRARIES是否完整以及include路径是否指向了正确的Libtorch目录。5.3 内存泄漏与张量生命周期Libtorch的张量使用引用计数管理内存正常情况下不需要手动释放。但如果你用torch::from_blob从外部内存创建张量要特别注意from_blob不会拷贝数据它只是包装了外部指针。如果外部内存在张量还在使用的时候被释放了就会出问题。cv::Mat img cv::imread(test.jpg); torch::Tensor tensor torch::from_blob(img.data, {img.rows, img.cols, 3}, torch::kByte); // 如果img在这里被析构tensor就悬空了稳妥的做法是立即克隆一份tensor tensor.clone()或者确保img的生命周期覆盖张量的使用周期。这个坑在图像处理场景里特别容易踩因为cv::Mat的局部变量出了作用域就释放了。5.4 多线程推理的注意事项Libtorch本身是线程安全的多个线程可以同时调用同一个script::Module的forward方法。但要注意两点一是module.to()和module.eval()这种修改模型状态的操作不要在推理过程中调用二是如果用了OpenMP或者自己开了线程池注意控制并发数过多的线程反而会因为上下文切换导致性能下降。我一般用torch::set_num_threads(4)来限制Libtorch内部使用的线程数避免它和外部线程池抢资源。这个设置是全局的在程序启动时调用一次即可。6. 从能跑到跑得好性能调优的几个实际手段6.1 关闭梯度计算与推理模式虽然module.eval()会切换BatchNorm和Dropout的行为但它不会关闭梯度计算。在推理场景下梯度计算是纯浪费。用torch::NoGradGuard可以显式关闭torch::NoGradGuard no_grad; auto output module.forward(inputs).toTensor();这个guard的作用域内所有张量操作都不会记录梯度信息能省下不少内存和计算。在Python里对应with torch.no_grad():C里就是RAII风格的guard对象。6.2 批处理与输入尺寸的权衡批处理能提高GPU利用率但会增加延迟。在服务端场景下需要根据实际QPS和延迟要求来选batch size。我的经验是先用batch size1测出单次推理延迟然后逐步增大batch size观察吞吐量的变化曲线。通常存在一个拐点超过之后吞吐量增长变缓而延迟继续上升。另外TorchScript模型对输入尺寸的灵活性有限。如果trace的时候用的是224x224推理时传256x256可能会报错或者结果不对。所以导出模型时就要确定好输入尺寸或者用torch.jit.script配合动态shape的处理逻辑。6.3 模型量化与Libtorch的配合PyTorch支持动态量化和静态量化量化后的模型体积更小、推理更快。Libtorch可以加载量化后的TorchScript模型但需要注意量化模型在CPU上才能发挥优势GPU上支持有限。如果你的部署环境是CPU量化是值得尝试的优化手段。导出量化模型的方式和普通模型类似只是需要在Python端先做量化转换quantized_model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8 ) traced torch.jit.trace(quantized_model, example_input) traced.save(quantized_model.pt)Libtorch加载这种模型的方式不变但推理时的数值精度会有轻微下降需要根据业务场景评估是否可接受。7. 工程化建议把Demo变成可维护的项目7.1 目录结构与配置分离一个能长期维护的Libtorch项目目录结构应该清晰。我通常这样组织project/ ├── CMakeLists.txt ├── config/ │ └── app.yaml ├── models/ │ └── model.pt ├── include/ │ ├── inference.h │ └── preprocess.h ├── src/ │ ├── main.cpp │ ├── inference.cpp │ └── preprocess.cpp └── third_party/ └── libtorch/模型路径、设备选择、线程数这些参数放在配置文件里不要硬编码。这样换模型或者换部署环境时只需要改配置不用重新编译。7.2 错误处理与日志Libtorch的异常类型主要是c10::Error捕获后用e.what()能拿到比较详细的错误信息。建议在模型加载、前向传播这些关键步骤都加上try-catch并且把错误信息写到日志里。不要用std::cout打日志用成熟的日志库比如spdlog或者至少封装一个简单的日志宏方便控制输出级别。7.3 单元测试与回归验证C项目的测试比Python麻烦但至少要对推理结果做回归验证。我的做法是在Python端用同一张输入图片跑一遍模型保存输出然后在C端加载同一个模型跑同样的输入对比两者的输出差异。如果差异在1e-4以内说明整个链路是通的。这个测试能帮你快速定位是预处理的问题、模型加载的问题还是推理本身的问题。8. 后续可以往哪些方向深入Libtorch初试只是第一步跑通推理流程之后还有不少值得探索的方向。比如自定义算子如果你的模型里有PyTorch原生不支持的算子可以在C里用torch::RegisterOperators注册自定义实现。再比如多模型串联把检测、分类、后处理串成一个C pipeline避免多次进出Python的开销。还有和TensorRT的配合Libtorch负责模型加载和图优化TensorRT负责底层加速两者结合能进一步压榨硬件性能。我个人在实际操作中的体会是Libtorch的学习曲线前陡后缓环境搭建和第一个能跑的Demo是最难的阶段一旦跨过去后面的API使用和工程化都是水到渠成的事情。遇到编译链接问题不要慌大部分情况是版本不匹配或者CMake配置不对仔细看报错信息逐条排查总能解决。

相关新闻

自定义Gym环境可视化指南:从render接口到训练调试的完整方案

自定义Gym环境可视化指南:从render接口到训练调试的完整方案

第一次跑通强化学习训练脚本的人,十个里有九个会在同一个地方多花两三天时间——不是算法调参,而是被自定义gym环境里的可视化绘制卡住。CartPole、MountainCar这些内置环境拿来就能用,但一旦轮到自己定义任务,状态转移、奖励函数…

2026/10/13 16:43:25 阅读更多 →
Python爬虫实战:requests+正则抓取猫眼TOP100电影榜单

Python爬虫实战:requests+正则抓取猫眼TOP100电影榜单

简介:面向Python爬虫入门者的实战资源包,以猫眼电影TOP100榜单为案例,演示如何用requests库请求网页、用正则表达式解析电影名与评分,并说明robots.txt、请求延时、反爬应对等爬虫规范与实用技巧。整包为zip格式,共6个…

2026/10/13 16:43:25 阅读更多 →
jvisualvm实战:63个Java性能诊断场景速查指南

jvisualvm实战:63个Java性能诊断场景速查指南

1. 项目概述:为什么jvisualvm不是“看看CPU就完事”的玩具jvisualvm这个名字,第一次听的人常以为是个带图形界面的top命令——点开、看个曲线、关掉。我刚接触它时也这么想,直到在某次线上服务响应延迟突增的凌晨三点,用它在3分钟…

2026/10/13 16:43:25 阅读更多 →

最新新闻

优卡CAD自动化原理:打版逻辑、放码引擎与COM接口实战

优卡CAD自动化原理:打版逻辑、放码引擎与COM接口实战

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

2026/10/13 17:28:39 阅读更多 →
LiteLLM:统一多模型API调用的轻量级网关实践

LiteLLM:统一多模型API调用的轻量级网关实践

1. 项目概述:LiteLLM 是什么,它解决了哪些真实痛点?LiteLLM 这个名字在最近半年的技术圈里出现频率陡增,尤其在中小型开发团队、独立开发者和AI应用快速验证场景中,几乎成了“模型网关”“统一调用层”“多模型兼容方案…

2026/10/13 17:28:39 阅读更多 →
Linux U盘策略管理:udev+udisks2+Python实现安全可控的设备管控

Linux U盘策略管理:udev+udisks2+Python实现安全可控的设备管控

简介:这是一款面向企业IT管理员与信息安全从业者的U盘安全管控工具,专为解决USB设备滥用导致的数据泄露、病毒传播等风险而设计,适用于办公终端统一安全管理、涉密环境U盘准入控制等典型场景。资源包共9个文件,含1个主程序USBMana…

2026/10/13 17:28:39 阅读更多 →
Fiji-win64实战指南:图像分析环境配置与批量处理技巧

Fiji-win64实战指南:图像分析环境配置与批量处理技巧

简介:fiji-win64是面向科研与图像处理用户的免安装图像分析工具,基于ImageJ生态,支持Windows/Linux/macOS等多平台,尤其擅长读取Raw格式文件及处理高于8bit的图像数据,可完成直方图统计、图像拉伸、区域测量、批量分析…

2026/10/13 17:28:39 阅读更多 →
Cesium Viewer深度解析:从构造配置到性能优化与生命周期管理

Cesium Viewer深度解析:从构造配置到性能优化与生命周期管理

1. 先搞清Viewer在整个Cesium体系里的位置,别再往里面瞎塞东西了 做三维GIS和WebGL开发的人,应该都有这样一个体会:Cesium里的Viewer对象就像一栋写字楼的物业中心——你大部分时间在楼层里办事,却很少琢磨它本身是怎么运作的。这…

2026/10/13 17:28:39 阅读更多 →
空间机器人遥操作双边控制:从力反馈到主从手感的工程实践

空间机器人遥操作双边控制:从力反馈到主从手感的工程实践

简介:这是一份面向机器人控制、人工智能与机器学习方向研究者的博士学位论文,系统探讨通过智能算法提升空间机器人遥操作双边控制的精度与稳定性,重点解决时延力反馈系统中的稳定性、透明性和跟踪性问题。内容涵盖双边PD控制、从手控制力反馈…

2026/10/13 17:27:37 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →