TensorFlow图像分类实战:从环境搭建到模型部署的完整指南
我第一次用TensorFlow是在一个很普通的晚上手里攒着一批没有命名规律的图片想做个自动分类的小工具。当时以为只要装个库、跑几行代码就能出结果结果被环境、版本、数据格式轮番教做人。现在回头看TensorFlow的学习曲线其实没有传说中那么陡难点在于网上信息太杂今天这个教程用旧版本明天那个脚本用新接口按着抄都抄不对。这篇文章不打算从头讲深度学习理论也不打算复述官方文档。我想记录的是自己从零开始用TensorFlow跑通一个图像分类小项目的完整过程包括环境搭建里最容易翻车的细节、张量运算和自动微分如何影响日常调试、训练循环里那些看起来正常但结果不对的坑以及最后把模型保存和部署时容易忽略的问题。如果你正准备开始接触TensorFlow或者已经在用但在某个环节卡住很久这篇文章应该能给你一些能直接落地的思路。1. 为什么我最终绕了一圈还是回到了TensorFlow1.1 我的起点先有需求后有框架写代码的人大多有个毛病喜欢先挑框架再想需求。但我当时是被需求逼着找工具一批图片要分类手工整理太慢需要训练一个模型自动处理。最初我考虑过自己用底层数学库一步步实现但很快放弃因为反向传播的细节足够让人分心我真正想解决的是图片分类问题不是再造一遍轮子。TensorFlow吸引我的原因很朴素文档齐全、社区问答多、上手资料丰富。更重要的是它的核心抽象和“张量”概念非常直接数据被表示成多维数组计算就是让张量在操作之间流动。这种设计让写代码时的心智负担变小——我不用反复确认某个函数的输入输出是什么类型只要把数据形状对齐大部分情况就能跑通。1.2 对比之后的选择逻辑我还顺手对比了另外几套方案有的主打动态图写起来很接近普通程序但部署链路相对独立有的框架在学术界很流行模型定义很简洁但换成TensorFlow之后我发现TensorFlow的生态跨度更大——从数据处理、模型训练到模型导出再到线下的推理服务都有成体系的工具链。对我这种需要把模型真正用起来而不是只跑个精度数字的人来说这一点非常重要。当然这个选择不是绝对的。如果你的任务特别偏研究探索或者你需要频繁修改模型结构别的框架可能会更顺手。但如果你和我一样目标是让模型从训练到落地形成闭环TensorFlow提供的完整链路能省掉很多组合不同工具时踩坑的时间。后来我用同样的思路做第二个小项目时已经可以不去翻太多资料直接按之前跑通的流程走这种确定性在开发中是很值钱的。2. 环境搭建与版本差异第一个拦路虎2.1 版本差异带来的连锁反应TensorFlow的版本更新速度很快不同大版本之间的API变化非常大。我最初照着一篇老教程写代码里面还在用某个旧接口而我的环境默认安装的是新版本接口被移到了别的地方。报错信息又不友好只说某个模块找不到完全没提示新模块叫什么。这种问题很容易让人怀疑是自己的问题其实只是版本不匹配。建议是安装前先明确自己要用哪个大版本然后所有教程、脚本、依赖都按这个版本来。如果参考的代码来自其他项目先看它的配置文件里写了哪个版本再决定是调整自己环境还是换参考代码。遇到“找不到某个模块”的报错第一反应应该是去官方文档查接口迁移说明而不是反复重装环境。我当时就是因为没做这一步在同一个错误上花掉了整整一个下午。2.2 依赖地狱的破解思路环境问题最痛苦的是各种底层库的互相依赖。有一阵我每次导入TensorFlow都报某个原生库加载失败原因是系统里同时存在多个版本的依赖TensorFlow期望的动态库版本和默认加载的版本不一致。查了很多帖子最后解决方法很朴素用干净的虚拟环境重新安装按官方推荐的方式装不要自己手动去更新依赖。另外如果你是装了GPU版本想用显卡加速常见问题是运行时提示找不到GPU。多数情况下不是驱动没装而是缺少配套的运行时组件。可以用TensorFlow自带的检查方法确认它有没有正确识别到设备如果识别不到多半是环境变量或组件版本的问题和代码本身完全无关。这个问题很折磨人因为代码明明是正确的却因为环境细节没对齐而跑不起来。2.3 验证安装是否可用的标准动作我建议所有人在写正式代码前先跑一个最小验证创建一个很小的张量做一次简单的加法运算再把结果打印出来。这个动作看起来毫无技术含量但它能确认Python环境、TensorFlow安装、底层依赖、硬件支持是否已经打通。如果这一步都跑不通后面任何模型代码都不可能顺利运行趁早排查环境能省下大量时间。我当时的小验证很简单就是在交互环境里写了两行代码。import tensorflow as tf x tf.constant([[1.0, 2.0], [3.0, 4.0]]) print(tf.reduce_sum(x))看到输出结果正常出现才敢继续往下写。后来我把这个习惯带到了每一个新项目的开始凡是换机器、换环境、换版本第一件事永远是先跑这个最小验证而不是直接打开训练脚本。3. 张量、自动微分与训练循环把黑盒拆开看3.1 张量数据的基本容器张量可以理解成带形状的多维数组标量是0维向量是1维矩阵是2维图像数据一般是3维以上。TensorFlow里的所有数据都以张量的形式在流动形状不匹配是最常见的报错来源。我记得第一次处理一批图片时把批量维度、宽、高、通道数搞混了明明心里想的顺序和代码写出来的不一样。看清楚“批量大小放在哪一维、通道放在最后还是中间”这类细节能少调半天错。形状问题的典型表现是运行时突然报错说某个操作的输入维度不匹配。这种错误在静态图里通常在构建阶段就暴露但在动态执行时会突然打断训练。我的经验是写代码时不要偷偷省略形状信息多写注释多用打印形状的方式来确认每一步的结果。把张量想象成货架上的箱子搬运工只认标签上的尺寸尺寸对不上就搬不了就这么简单。3.2 自动微分反向传播的具体实现训练神经网络本质上是在调整参数而调整方向依赖损失函数对每个参数的导数。TensorFlow自动处理这些导数计算但你需要理解它背后的逻辑前向计算时记录操作序列反向时用链式法则把梯度一层层传回去。如果梯度算出来是空的或者全是0通常说明前向传播过程中某个关键操作没有连接到损失函数或者参数被重新赋了值而不是原地更新。有一类典型问题你在训练循环里用了变量赋值的方式更新参数结果导致梯度记录中断。TensorFlow的自动微分依赖于磁带记录下完整的计算路径如果你在路径中间插入了一个不参与梯度传递的操作损失函数就和前面的参数断了联系。理解这一点后很多奇怪的更新失效问题就有了排查方向。不要只把损失函数当成一个数值它更是连接模型参数的桥梁。3.3 自定义训练循环到底在做什么我一开始用的是内置的编译加训练函数虽然能出结果但中间过程像一个黑盒出问题时根本不知道在哪里检查。后来我改用自定义训练循环手动创建优化器、计算预测值、计算损失、用梯度更新参数。自定义循环的代码量多一些但每一步都可以打印中间结果。等你理解了循环里的五个要素再回到高层接口很多疑难杂症都能自己定位了。一个标准的自定义训练循环大概长这样optimizer tf.optimizers.Adam(learning_rate1e-3) for step in range(total_steps): with tf.GradientTape() as tape: pred model(batch_x) loss loss_fn(batch_y, pred) grads tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables))这段代码里最重要的就是梯度带。你可以把它理解成录像机前向计算时录下所有操作之后只需要回放就能算出梯度。如果训练没有更新就检查录像带里有没有录到模型参数的计算路径如果梯度数值异常大或异常小就回到损失函数和输入数据去找原因。我后来遇到任何奇怪问题第一件事都是把这个循环里的每一个中间量都打印出来对比正常情况下的数值范围。4. 实战一个图像分类小项目的完整搭建过程4.1 数据准备与预处理心态我用的是一个虚构的图片数据集大概几千张类别的分布不均匀。第一篇代码的第一步是创建数据集对象这里面最容易忽视的是数据增强和批次打乱。如果训练集顺序固定模型很容易学到数据的排列规律而不是真正的特征。还有一点很重要预处理操作最好在数据进入模型之前完成不要在训练循环里反复做。把预处理写进数据管道训练时才会更快。我当时的数据管道是这样写的dataset tf.data.Dataset.from_tensor_slices((image_paths, labels)) dataset dataset.map(preprocess, num_parallel_callstf.data.AUTOTUNE) dataset dataset.shuffle(buffer_size1000).batch(batch_size).prefetch(tf.data.AUTOTUNE)这种写法让数据在后台并行预处理同时预取下一批数据训练循环不会因为等数据而空转。第一次跑的时候我没有加shuffle训练准确率一直很高但验证准确率忽高忽低后来才发现是数据顺序惹的祸。一个好的数据管道应该让模型看到的是随机样本而不是按文件名排列的固定序列这一点在数据量小的时候尤其明显。4.2 模型结构选择的常见误区很多人一开始就堆很多卷积层觉得越深越好。我只用了一个简单的卷积加全连接结构先把流程跑通。结果正常速度也快。我的体会是第一版模型结构最好经典且容易调试复杂结构应该在基线模型已经工作良好之后再引入。不要一开始就用一个很大的预训练模型因为你的任务可能根本不需要那么强的表达能力而越大的模型需要越多的数据、显存和调试成本。我当时定义的模型结构很简单先接一个卷积层提取基本特征经过标准化和激活函数再压缩空间尺寸最后通过全连接层输出分类结果。这种结构虽然不花哨但每一层的作用都很清楚出问题时可以通过观察某一层的输出来判断梯度是否正常。等到基线模型跑通了再考虑是否增加深度、加入正则化或者换成更复杂的结构这样每一步改动的影响都能被单独评估。4.3 训练参数设置的经验值批次大小、学习率、训练轮数这三项参数直接影响训练结果。批次大小受显存限制太小会让梯度估计不稳定学习率太大容易震荡太小则收敛太慢。我用了一个比较稳妥的初始学习率同时把输入数据归一化到特定范围。训练过程中损失值下降正常准确率逐步上升说明参数组合可用。如果你发现训练曲线异常先回顾数据有没有处理好再调学习率大多数问题出在数据侧而不是模型侧。一个比较实用的做法是先用很小的数据量试跑几个批次确认模型结构、损失函数和优化器都没有逻辑错误再切到完整数据上训练。如果小批量数据都无法得到一个下降的损失那一定不是参数调得不够好而是代码本身有问题。我在一次实验里发现损失在第一步就直接变成无限大最后查到原因是输入数据里有异常值归一化没有处理好重新处理数据后问题立刻消失。5. 训练过程中的性能瓶颈与排查链路5.1 数据管道导致的“GPU饥饿”训练到一半我发现GPU利用率一直上不去但训练时间还是很久。后来查看数据读取流程发现瓶颈在磁盘IO和预处理环节。GPU太快数据来不及喂进去整个流程就在空等。解决办法是把数据加载、解码、裁剪这些操作放进数据管道并且启用多进程并行预处理让GPU一直在干活而不是等着下一批数据。数据管道的影响在一开始并不容易察觉因为小数据集上一切看起来都很快。一旦切到真实规模的数据读一张图片再从内存里翻出标签这些琐碎操作叠加起来训练速度会明显下降。我当时在数据管道里加了自动并行处理参数后训练速度几乎提升了一倍。如果你发现训练时的计算设备利用率只有百分之十几先不要优化模型去看看数据管道是不是瓶颈。5.2 内存溢出问题的定位方法有段时间训练中途经常报错提示内存不足。我先以为模型太大后来发现是数据批次创建时缓存了太多中间结果。检查下来是某个环节把整个数据集都放进内存了。解决方法很直接使用按需加载的方式分批次读取并且及时释放不再用的中间变量。定位内存问题可以靠观察内存曲线哪个节点内存突然增长往往就是问题所在。我习惯在训练脚本里加一些临时的监控输出每隔一段时间打印一下当前内存和显存占用。当问题复现时就能看到内存是在数据读取阶段增长还是在训练阶段增长。如果是数据读取阶段基本可以确定是数据集对象的配置问题如果是训练阶段则要检查是不是累积了太多历史计算图。很多时候不是代码写错而是变量被无意中保留了下来占着一大块内存不放。5.3 损失不下降的检查顺序损失值一直不变这个问题几乎每个新手都会遇到。我的排查顺序是先确认数据标签有没有错再看输入数据是否归一化然后检查模型最后一层和损失函数是否匹配最后看学习率是不是太小或者太大了。网上很多人一上来就换模型结构但大多数时候问题出在最基础的数据和参数设置上。有次我把标签做了错误处理模型学到的只是固定的先验概率损失当然不会正常下降。具体排查时我会先把模型冻结只保留最后的输出层用一小批数据跑一次观察损失能否凑合下降。如果连这种情况都不行那多半是数据或者损失函数配置的问题。等损失开始正常下降了再逐步放开前面的层。这样一步一步缩小问题范围比盯着训练曲线瞎猜有效得多。记住模型训练是一个输入到输出的流水线任何一个环节接错整个链条都不会工作。6. 模型保存、加载与部署时容易忽略的问题6.1 两种保存格式的差异训练结束后要把模型保存下来我一开始只知道把所有模型参数存成某种格式但等到要加载时发现少了模型结构信息。TensorFlow的保存方式有很多种我建议直接使用完整的模型格式保存整个模型重新加载后不需要再写一遍模型结构。另一种只保存权重的格式只适合在代码里已有模型结构时使用两者不要混。用完整格式保存其实非常简单tf.saved_model.save(model, saved_model_dir) loaded_model tf.saved_model.load(saved_model_dir)这样保存的是整个模型图和参数加载后可以直接推理。如果你只是保存了权重那么加载时还必须有模型结构的代码否则程序根本无法恢复一个完整的计算图。我一开始为了方便把两者混着用结果加载时总是报错后来统一改用完整格式再没出过这类问题。6.2 部署时输入输出签名的重要性把模型部署成服务时需要明确输入输出的数据形状和类型。如果部署时遇到报错说输入签名不匹配多半是因为训练时的数据格式和部署时的请求格式不一致。我踩过这个坑训练入口接收一个批次数据部署接口按单张图片请求没有在中间加一个批次维度结果预测结果总是错的。先定义一个明确的签名函数规定输入输出的张量形状再写服务逻辑就能避免很多低级错误。部署前可以给模型指定一个服务签名这样对外只暴露一个固定的入口tf.function(input_signature[tf.TensorSpec(shape[None, 224, 224, 3], dtypetf.float32)]) def serve(image_batch): return model(image_batch, trainingFalse)这个签名的含义是接收一批形状为动态批量、宽224、高224、3通道的浮点图像返回模型的预测结果。部署后所有请求都必须符合这个形状。我当时的教训是训练时数据是四维的而部署代码把单张图片直接传进去忘了在最前面补一个批次维度导致推理结果错乱。这类问题非常隐蔽因为不报错只是结果不对只能靠检查签名和实际请求的形状来发现。7. 最后分享几个让我少走弯路的实操习惯7.1 固定随机种子神经网络初始化、数据打乱和训练过程都会用到随机数。如果不固定随机种子每次运行同样的代码可能会得到完全不同的结果。我在第一次实验记录里写了两条互相矛盾的结果后来才想起前后的随机种子没有统一。固定随机种子不是为了追求绝对一致的复现而是让实验结果可比较、问题可定位。在TensorFlow里固定随机种子的方式很直接设置一个统一的随机种子即可。设置之后同一份代码在同样的数据上通常会给出相同的结果这样调整参数时能确定影响结果的因素到底来自代码还是来自随机波动。如果你做实验时不固定种子哪怕只改了一个无关紧要的小参数也分不清效果是参数带来的还是运气带来的。7.2 记录每次实验的配置我后来养成了一个简单的习惯每个实验都用一个小的日志文件记录版本、参数、数据路径和当前损失值。很多问题在当下看毫无头绪但对比几次实验记录之后规律就出来了。这个习惯不需要复杂工具甚至用文本文件都行但它能让你从“瞎试”变成“有方向地调整”。有一次我发现同样的代码在不同时间跑出来的精度差异很大差点怀疑是随机种子没有固定。后来翻日志才发现是底层依赖的版本在两次安装之间发生了变动导致了数值结果差异。如果没有日志这个问题的排查几乎无从下手。记录配置这件事看似琐碎其实是在帮未来的自己省时间。我现在每开一个新项目第一件事就是把环境和参数的快照存起来后面所有疑问都可以先对照快照来排查。7.3 先跑通最小闭环再逐步增加复杂度无论做什么功能我都建议先用最小的数据量、最简单的模型把全流程走通。只要流程能走通后面每一步的报错你都能清楚知道是哪个环节引入的。我见过不少同学一开始就在完整数据集上训练一个很大的模型想一步到位结果环境问题、代码问题、数据问题混在一起根本分不清该修哪个。先跑通一个最小闭环再逐步增加数据量和模型复杂度是效率最高的路径。这个习惯在TensorFlow里特别管用因为它的报错信息有时候会隐藏得很深一个几百层的模型和一个两三层的模型在报错逻辑上完全一样但排查难度天差地别。我还记得第一次完整跑通分类项目时用的数据只有几十张图片模型也只有几层但那个过程中该踩的坑基本都踩了一遍。后来把数据换成几千张、模型加深几乎没有新增的问题。最小闭环就像先修好一条小路再把它扩建为高速公路顺利得多。如果你现在正卡在TensorFlow的某个环节别急着怀疑自己。先按这套思路把环境验证一遍再把数据管道、训练循环、模型保存部署逐个跑通你会发现大部分问题都出在几个固定的地方。等到流程完整跑过一两次那些报错就再也不会吓到你了。

相关新闻

上下文模式设计:从请求级到会话级的架构决策与避坑指南

上下文模式设计:从请求级到会话级的架构决策与避坑指南

1. 从“上下文模式”说起:一个被低估的架构决策第一次看到context-mode这个词,很多人会下意识觉得它是个小到不值得一提的配置项。但如果你真正在多个项目里踩过坑,就会明白:上下文模式的选择,往往决定了一个系统在后期…

2026/10/15 6:41:48 阅读更多 →
.NET 8 CORS 配置全解:从中间件顺序到预检请求调试

.NET 8 CORS 配置全解:从中间件顺序到预检请求调试

前后端项目一拆开,CORS 基本是所有团队都绕不过去的一道坎。前几天有个朋友发消息问我,他在 .NET Core 8 里写了个 Web API,后端跑在 5000 端口,前端用 Vite 在本地 5173 端口调试,结果一调接口就被浏览器拦着&#xf…

2026/10/15 6:40:48 阅读更多 →
PyTorch实战:从环境搭建到模型部署的完整链路与避坑指南

PyTorch实战:从环境搭建到模型部署的完整链路与避坑指南

1. 为什么“pytorch”这个标题值得单独拎出来聊如果你在技术社区里闲逛,看到有人只发了“pytorch”这一个词当标题,底下大概率会分成两拨人:一拨觉得这太宽泛了,根本不知道要讲什么;另一拨人则会心一笑,因为…

2026/10/15 6:40:48 阅读更多 →

最新新闻

Studio Pro 8实战:编曲、直播机架与实时调音三合一攻略

Studio Pro 8实战:编曲、直播机架与实时调音三合一攻略

先说个真实情况:最近好几个朋友都在找“Studio Pro 8”,有的是想拿来编曲,有的是想搭直播机架,还有的只是想给唱歌效果做实时美化。我拿到这套软件在Mac和Windows两台机器上都实测了一段时间,有些体会还挺反直觉的——…

2026/10/15 7:23:56 阅读更多 →
Spring Boot会员管理系统毕设实战:从数据库设计到JWT鉴权部署

Spring Boot会员管理系统毕设实战:从数据库设计到JWT鉴权部署

“名士会所会员管理系统”,光看这个标题你可能觉得就是一个普通的Spring Boot CRUD项目,但我做完这套毕业设计源码之后最大的感受是:它其实是一个把业务复杂度控制得恰到好处的“小型企业级系统”。会所行业的会员管理,表面上只有…

2026/10/15 7:23:56 阅读更多 →
CSP-J 2024 真题 地图探险 题解(普及-)|从暴力到正解全讲一遍

CSP-J 2024 真题 地图探险 题解(普及-)|从暴力到正解全讲一遍

继续刷 CSP-J 2024 真题。这题考点是暂无评定,先把题意吃透。 题目来源:ACGO A34462 | 洛谷 P11228难度定位:普及- | 通过率:47.16% 一、题目信息 题目名称:地图探险 所属赛事:2024 …

2026/10/15 7:23:56 阅读更多 →
吊装安全生命线受力分析模块:原理与应用

吊装安全生命线受力分析模块:原理与应用

1. 吊装安全的核心防线:生命线受力分析模块解析在重型设备吊装作业现场,生命线(绳)作为最后一道安全屏障,其可靠性直接关系到高空作业人员的生命安全。传统经验判断法已无法满足现代工程对精确计算的需求,这…

2026/10/15 7:23:56 阅读更多 →
SpringBoot+MySQL实现4S店车辆租售一体化管理系统全流程拆解

SpringBoot+MySQL实现4S店车辆租售一体化管理系统全流程拆解

1. 项目概述与需求拆解1.1 这类系统到底解决了什么现实问题先聊一个我在带毕设和做外包时反复遇到的现象:很多同学一听到"汽车销售管理系统",第一反应就是"无非是车辆信息的增删改查"。但真正走进一家4S店或者二网经销商去看&#x…

2026/10/15 7:23:56 阅读更多 →
DeepSeek本地部署硬件要求与环境配置:显存估算、CUDA对齐与推理框架选型

DeepSeek本地部署硬件要求与环境配置:显存估算、CUDA对齐与推理框架选型

简介:这份PDF资料聚焦DeepSeek大模型的本地化部署,面向希望在私有环境中运行开源大模型的开发者、运维人员及企业技术团队,帮助解决硬件选型与软件环境配置两大核心难题。资源包内含1个PDF文件,大小约274KB,内容按硬件…

2026/10/15 7:22:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →