恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

EfficientNet迁移学习实战:104类花卉识别项目全流程指南

  • 首页
  • 资讯中心
  • /
  • EfficientNet迁移学习实战:104类花卉识别项目全流程指南

相关资讯

告别低效提示词:3个AI编程工作流实战指南 2026/10/5 9:30:51
STM32最小系统板搭建低成本FOC矢量控制方案全解析 2026/10/5 9:30:51
ITK-SNAP实战:分割标注、三维显示与颜色配置全攻略 2026/10/5 9:30:51

最新资讯

STM32通过IIC通讯在OLED上绘制DEEPSEEK鲸鱼娘(keyskingCH1116学习笔记)
Java远程教育网站开发实战:Spring Boot+MyBatis从课程表到作业提交
开题报告不是“预告片”,是“施工蓝图”——云智变AI开题报告撰写生成功能科普|云智变AI官网www.yunzhibian.cn 微信公众号搜一搜 云智变ai学术
OpenCV工业机器人视觉引导抓取实战:手眼标定、位姿估计与路径设计
医疗影像AI落地实战:DeepSeek本地化部署与DICOM文件分析模型微调
GitHub热榜第一|Strata源码静态评测:消费级硬件本地运行Qwen3.8‑Flash‑Next推理引擎

今日推荐

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单
YOLOv5 OBB旋转框训练实战:从DOTA数据准备到调参避坑全流程
Zeron 终端、Worktree 与 Diff 面板:像 IDE 一样查看并驱动你的代码变更

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

EfficientNet迁移学习实战:104类花卉识别项目全流程指南

发布时间:2026/10/5 9:30:51
EfficientNet迁移学习实战:104类花卉识别项目全流程指南 简介一套面向图像分类与迁移学习实战的完整项目包基于EfficientNet轻量级网络实现104种常见花卉的识别适合对轻量级模型、预训练微调感兴趣的开发者也可作为课程设计与毕业设计项目参考。项目中可选b0至b7共8种模型支持设置是否加载官方预训练权重、是否冻结层并提供Adam、SGD、AdamW三种优化器与余弦退火学习率能够灵活对比不同配置下的训练效果。资源共2000个文件主要为1993张花卉图像另含3个Python训练/评估脚本、2个JSON指标文件以及txt和readme说明方便查看各类别的准确率、召回率、F1分数与特异度等详细评估结果。压缩包约514MB已包含完整数据集与类别标签可一键启动训练与评估训练集精度约0.9。目前已有124人学习下载适合需要快速上手迁移学习项目或更换自定义数据集进行扩展的读者。1. 用EfficientNet做104类花卉识别轻量网络与迁移学习到底能省多少事很多人第一次看到“104种花”这个数字时觉得不过是个图像分类任务。但当类别数从十几个涨到100以上问题性质就变了相似花种之间的差异越来越小、样本分布开始倾斜、单张图片的推理时延也成了必须考虑的指标。EfficientNet作为轻量级网络配合迁移学习能在一张普通消费级GPU上几小时内把Top-1准确率推到90%上下不需要从零训练。这篇文章会沿着数据准备、预训练权重加载、分阶段微调、评估与排错这条线把一个104类花卉识别项目的完整落地路径讲清楚。适合正在做图像分类方向、算力有限又想快速验证效果的工程师。2. 为什么选EfficientNet而不是ResNet或MobileNet从参数效率看选型逻辑2.1 复合缩放EfficientNet的宽度、深度与分辨率是怎么协同放大的EfficientNet的核心思路不是某一种单独的网络结构而是提出了一套“复合缩放”规则。传统做法是模型小了就砍深度模型大了就加宽度或者直接改输入分辨率这三者互相独立调整往往顾此失彼。EfficientNet用神经架构搜索先找到一个基础网络再按固定比例同时放大深度、宽度和输入分辨率让每一维度的资源投入都落在其他维度能消化的范围内。这个基础网络就是EfficientNet-B0。它的主体由一系列MBConv模块组成MBConv全称是Mobile Inverted Bottleneck Convolution先用1x1卷积升维、再做深度可分离卷积、中间嵌入Squeeze-and-Excitation注意力模块最后用1x1卷积降维。这种结构本身继承了MobileNet系列的参数效率但比MobileNet多了一个通道注意力机制让模型能学会“重视哪些特征图通道”。在花卉识别里这个机制对花瓣纹理和花蕊颜色相当有用因为相似花种之间往往就差在局部细节上。从B0往后EfficientNet-B1到B7是同一个网络按不同系数缩放出来的。以B0为例输入分辨率224x224时参数量约5.3M计算量约0.39B FLOPs。作为对比ResNet-50参数量约25.6M计算量约4.1B FLOPs。换句话说B0的参数量只有ResNet-50的五分之一左右计算量只有十分之一左右但在ImageNet上的Top-1准确率能到77%上下已经追平甚至超过了一批更重的网络这正是轻量级网络在图像分类项目中最大的价值。2.2 与ResNet50、MobileNetV3对比算力受限时谁更稳选backbone不能只看paper上的准确率要结合训练成本和推理环境。下面这张表是我在做类似图像分类项目时的常用对比口径输入统一按224x224估算。模型参数量计算量优势劣势EfficientNet-B0约5.3M约0.39B精度/算力比高微调友好需留意BN统计量ResNet-50约25.6M约4.1B资料多结构简单稳定参数多训练慢MobileNetV3-Large约5.4M约0.22B最快适合移动端100类以上精度略弱ResNet-50的优点是“皮实”你几乎不需要关心BN层、缩放系数这些细节按经验值就能跑出不错的结果。但如果你用一张消费级显卡训练104类花卉ResNet-50一轮epoch的时间大约是EfficientNet-B0的三到四倍迭代试错成本会明显变高。MobileNetV3虽然更快但在细粒度分类场景下特征表达能力比EfficientNet弱一些尤其是遇到花瓣颜色接近、背景干扰大的花种时Top-1准确率会低两三个百分点。所以我的结论是在中等算力环境下EfficientNet-B0是最稳的起点。# 如果你用nvidia-smi看显存占用B0224输入 batch_size 32 # 在8GB显存上训练时大约占用5.5GB到6.5GB余量足够跑验证 nvidia-smi --query-gpumemory.used,memory.total --formatcsv2.3 直推式迁移学习与常规微调两种迁移策略的适用边界迁移学习在图像分类项目里有两个方向一个是归纳式的常规微调另一个是直推式迁移学习。前者是拿ImageNet上预训练好的模型在自己的数据集上接着训后者更严格要求目标域数据在训练阶段就能参与建模常用于目标域数据少但有大量未标注样本的场景。在花卉识别这种标注相对可控的项目里常规微调是主流做法直推式迁移学习的收益不明显反而容易因为目标域和源域分布差异过大引入噪声。# 一个务实的判断标准先看你的数据集与ImageNet的语义距离 # 如果花在画面中占比高、背景干净直接微调最后一层就能见效 # 如果花在场景里很小、被枝叶遮挡严重则需要解冻更多层 def estimate_domain_gap(train_loader, model): model.eval() mean_feat, std_feat None, None with torch.no_grad(): for images, _ in train_loader: feat model.features(images) feat feat.mean(dim(2, 3)) if mean_feat is None: mean_feat feat.mean(dim0) else: mean_feat 0.9 * mean_feat 0.1 * feat.mean(dim0) return mean_feat.shape这段代码不严谨但它的意图是让你先跑一遍前向看一眼预训练模型的中间特征均值分布有没有过大的方差。如果你的数据集和ImageNet内容差距很大特征均值会飘得厉害这时候应该考虑解冻更多层而不是只训练分类头。在104类花卉这种语义相对统一的任务里一般用B0微调5到8个epoch就能收敛比从零训练少花一个数量级的时间。3. 104类花卉数据集目录结构、标签编码与数据划分3.1 目录规范与Label映射文件夹命名直接决定标注质量做图像分类项目第一个要过的关是让数据集的目录结构和代码里的标签映射完全一致。大型花卉数据集通常按花的品种名建文件夹这是最便于阅读和校验的组织方式。但有几个细节容易翻车文件夹名里带空格、带括号或者同一种花用了不同写法比如“rose”和“Rosa”两个文件夹同时存在都会让类别数对不上训练时直接报错。我的做法是一律用小写、下划线代替空格并在读取时用sorted排序保证标签顺序在多次运行间保持一致。import os from torch.utils.data import Dataset from PIL import Image class FlowerDataset(Dataset): def __init__(self, root_dir, transformNone): self.root_dir root_dir self.transform transform # sorted()保证标签顺序稳定这对后续可视化混淆矩阵很重要 self.classes sorted(os.listdir(root_dir)) self.class_to_idx {cls: i for i, cls in enumerate(self.classes)} self.samples [] for cls in self.classes: cls_dir os.path.join(root_dir, cls) if not os.path.isdir(cls_dir): continue for fname in os.listdir(cls_dir): # 只收常见图片后缀避免隐藏文件或损坏文件混进来 if fname.lower().endswith((.jpg, .jpeg, .png)): self.samples.append((os.path.join(cls_dir, fname), self.class_to_idx[cls])) def __len__(self): return len(self.samples) def __getitem__(self, idx): path, label self.samples[idx] img Image.open(path).convert(RGB) if self.transform: img self.transform(img) return img, label这段代码最关键的是convert(RGB)它会把灰度图统一转成三通道避免推理时碰到单通道图片导致通道数不匹配。另一个容易忽略的问题是损坏图片有些数据集下载过程中会混入0字节文件Image.open不会立刻报错但load()时就会抛异常。建议在第一次读取时加一个完整性校验把打不开的文件过滤掉。常见做法是单独写一个脚本扫描一遍全部图片遇到解压失败或尺寸异常的file直接移入一个ignore目录不要直接删以后可能要回头用于其他分析。3.2 按类别分层划分训练、验证、测试怎么切才不翻车104类数据集的样本分布通常不均匀有些花种有几千张图有些只有几十张。这时候如果直接用随机划分很容易出现验证集里某些类别一张都没有或者训练集里某个类只有几张图的情况。我用的是sklearn的train_test_split并开启stratify参数让每个类别的样本在训练集和验证集中保持相同比例这种按类别比例抽样的方式能显著减少验证集准确率的抖动。import os from sklearn.model_selection import train_test_split dataset FlowerDataset(root_dirflowers_104) paths [s[0] for s in dataset.samples] labels [s[1] for s in dataset.samples] # stratifylabels 保证每个类别在训练/验证集中的比例一致 train_paths, val_paths, train_labels, val_labels train_test_split( paths, labels, test_size0.2, stratifylabels, random_state42 )划分之后必须人工看一眼每个类别的数量这一步能提前暴露标注质量问题。我会打印出样本数最少的5个类别和最多的5个类别确认最少的那一类在训练集里有没有足够的样本。如果某个类在训练集里只有不到10张图数据增强再怎么撑也有限这时候就要考虑去补充数据或者接受该类别准确率偏低后续通过类别权重去平衡损失函数。4. 用EfficientNet-B0做迁移学习从冻结特征到分阶段微调4.1 加载预训练权重与替换分类头代码中的三个细节用torchvision加载EfficientNet-B0预训练权重非常直接但有几个细节决定训练成败。第一个细节是分类头的替换位置。EfficientNet的classifier不是只有一个Linear层而是一个Sequential包含Dropout和Linear两层直接替换整个classifier会丢掉Dropout训练后期容易过拟合。正确姿势是保留Sequential只替换里面的线性层。import torch import torch.nn as nn from torchvision import models # 加载ImageNet预训练权重 model models.efficientnet_b0(weightsmodels.EfficientNet_B0_Weights.IMAGENET1K_V1) num_classes 104 # 关键classifier[1]才是Linear层classifier[0]是Dropout保留它 in_features model.classifier[1].in_features model.classifier[1] nn.Linear(in_features, num_classes)第二个细节是输出层初始化。新替换的Linear层默认初始化范围对迁移学习来说偏小会导致第一个epoch的loss下降很慢。我习惯手动把分类头的权重标准差调大一点对最后一层用一个大于默认值的scale初始化让梯度在第一轮就能有效传播。第三个细节是B0的dropout默认是0.2如果你是1024类以上的大任务可以提到0.3但104类花保留0.2就够调太高反而会拖慢收敛。# 手动初始化分类头让第一轮训练能更快响应 nn.init.trunc_normal_(model.classifier[1].weight, std0.01) nn.init.zeros_(model.classifier[1].bias)4.2 分阶段训练策略先训头再训全身的学习率设置直接把整个模型放开训练是所有迁移学习新手最常犯的错误。预训练模型的特征提取器已经很成熟如果一开始就用全局学习率0.001去更新所有参数前面几层会被破坏得七零八落验证准确率一直在低位徘徊。正确做法是分两个阶段。第一阶段冻结全部特征层只训练新分类头学习率可以用1e-3到1e-3之间这个量级这相当于在ImageNet特征上快速拟合新任务的线性分类器。第二阶段再以很小的学习率解冻整个网络。# 第一阶段冻结特征层只训练分类头 for param in model.features.parameters(): param.requires_grad False optimizer torch.optim.Adam(model.parameters(), lr1e-3)# 第二阶段解冻全部层特征层用更低学习率防止破坏预训练知识 for param in model.features.parameters(): param.requires_grad True optimizer torch.optim.Adam([ {params: model.features.parameters(), lr: 1e-5}, {params: model.classifier.parameters(), lr: 1e-4} ], weight_decay1e-4)分阶段训练里最不好把握的是第二阶段的epoch数。我一般只看验证集loss当验证loss连续3个epoch不降反而上升时立即停止训练并回滚到最佳checkpoint。还有一个更精细的操作在第二阶段里给不同层组分配不同学习率前面几层学到的都是通用边缘纹理特征应该用最低学习率最后几层学到的是ImageNet特有的语义特征可以放宽一些。常见做法是给features的前80%设置1e-5后20%设置3e-5分类头维持1e-4。这类精细调节在104类花上收益没有想象中大但对更细粒度的任务会有帮助。4.3 数据增强与训练流程防止在花卉这种近邻类别上过拟合花卉图像分类有一个特点同一朵花从不同角度拍视觉差异可能比不同花种的差异还大。所以数据增强的策略不能一味追求裁剪强度否则会把花蕊、花瓣边缘这些判别性细节裁掉。我常用的增强组合是随机裁剪加缩放、水平翻转、小角度旋转和轻微的亮度饱和度扰动翻转的角度不能太大因为花虽然不像文字那样有方向性但过于剧烈的旋转会影响花型结构的空间关系。from torchvision import transforms train_transform transforms.Compose([ transforms.RandomResizedCrop(224, scale(0.6, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.05), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_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]) ])注意训练用的RandomResizedCrop里scale参数我设成了(0.6, 1.0)而不用默认的(0.08, 1.0)。花卉数据集里主体一般占画面较大比例如果把尺度下限拉到0.08很多图会裁到背景和叶子把模型带偏。验证集的Resize到256再CenterCrop到224是torchvision的标准做法不要改成直接Resize到224否则会让验证集图像与训练数据分布不一致很多博客这里都写错了。训练循环本身不需要什么特殊设计但有两个小习惯值得保留每个epoch结束后在验证集上计算准确率并保存最佳模型不保存最新模型EfficientNet的BatchNorm在前向时对batch size较敏感训练和验证的batch size差异太大时最好在验证前调用一次model.train(False)并确保BN统计量是训练中累积的。5. 花卉识别项目的避坑清单现象、原因与修复5.1 现象验证准确率在高位反复震荡loss下不去训练到中途验证集的Top-1准确率会在80%到90%之间来回跳每个epoch的波动幅度超过两个百分点。最常见的原因是学习率设置过大在损失面比较平坦的区域参数更新步长跨越了最优区域的两侧导致准确率始终在最优解附近振荡。解决办法是把第二阶段的特征层学习率从1e-5降到3e-6或者使用余弦退火调度器让学习率随epoch递减。如果已经训练了很久不想重启可以直接加载最好的checkpoint把学习率减半再训练两三个epoch通常能立刻把震荡压下来。5.2 现象少数类被多数类淹没低样本类准确率极低如果数据集里多数类有几千张图少数类是只有几十张不加处理的话少数类的准确率往往会低到20%以下甚至出现模型把所有输入都预测成多数类的极端情况。原因是交叉熵损失在类别数量不均时天然偏向样本多的类。常见做法是给每个类别配置一个权重样本越少的类别权重越大让损失函数对少数类的错误分类更敏感。我用sklearn的compute_class_weight就能直接算出来然后把权重传给CrossEntropyLoss的weight参数。import numpy as np from sklearn.utils.class_weight import compute_class_weight from torch.nn import CrossEntropyLoss class_weights compute_class_weight(balanced, classesnp.unique(labels), ylabels) class_weights torch.tensor(class_weights, dtypetorch.float32).cuda() criterion CrossEntropyLoss(weightclass_weights)除了改损失函数另一个有效手段是对少数类做过采样。在数据加载时给每张图一个抽样概率样本少的类被抽中的概率高这样每个batch里不会全是多数类。但要警惕一点过采样会让模型反复看到少数类那几十张图如果这几十张图恰好是同一个角度拍的模型学到的就是角度而不是花种特征所以过采样必须配合更强的数据增强一起用。5.3 现象用错预处理参数推理精度突然暴跌训练时一切正常模型也保存了但把单张图片丢进去预测时Top-1准确率比验证集低了十几个百分点。十有八九是推理时的预处理流程和训练时不一致。常见错误有两种一是推理时用PIL读取的图片没有转RGB导致通道是BGR顺序输入和训练分布完全错位二是推理时的Resize方式和训练时不同训练用RandomResizedCrop推理却直接Resize到224x224导致目标比例失真。EfficientNet对输入分布的要求比其他网络更严格因为它的BN层对输入均值和方差很敏感。def preprocess_inference(image_path): from PIL import Image img Image.open(image_path).convert(RGB) # 确保RGB img val_transform(img) # 和训练验证集完全相同的预处理 return img.unsqueeze(0)解决方式很朴素强制推理时复用训练代码里定义好的val_transform不要手写一套新逻辑。EfficientNet的原始输入归一化均值和方差是固定的也就是ImageNet那套[0.485, 0.456, 0.406]单位换算成255后再除以255这个步骤抄错一点精度就会掉一个档次。5.4 现象训练loss下降但验证loss上升过拟合来得比预期早104类花卉数据量通常不够大到支撑B0完全微调如果不设早停训练到第10个epoch左右就会开始过拟合。验证loss上升的同时训练loss还在继续降这是模型开始记忆训练集特有噪声的典型信号。解决方向有三个第一增强数据增强的强度比如把RandomRotation角度从15度加到30度第二在分类头之前把dropout从0.2提升到0.3第三给优化器加上weight_decay并适当加大到1e-4。其中调大dropout效果最直接但会延长收敛时间通常需要多训练两三个epoch才能掩盖掉dropout带来的训练loss上升。# 在torchvision中直接修改模型内部的dropout比例 model.classifier[0].p 0.3还有一个很容易被忽略的点验证集的增强强度要适中。如果验证集也用了较强增强模型在验证集上的表现会低于真实泛化能力让人误判为过拟合。验证集用最简单的Resize、CenterCrop、Normalize就够不要套训练用的随机旋转和抖动。5.5 现象单张推理比一张batch推理还慢GPU利用率极低模型训练得很快但部署后单张图片的推理延迟迟迟降不下来GPU利用率始终在20%以下。原因通常是每次推理都通过python一句句地做图片解码、预处理、张量搬运大量时间浪费在数据加载而不是计算上。EfficientNet-B0的计算量本身只有0.39B FLOPs单张推理如果还用常规PipelineCPU预处理的时间会远远超过GPU计算时间。改进方法是把多张图片拼成一个batch一起推理或者改用ONNX Runtime加载模型在CPU上也能跑出接近GPU的速度。import torch import onnxruntime as ort dummy_input torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, efficientnet_b0_flowers.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: batch}, output: {0: batch}})还有一个隐蔽的坑推理时忘记调用model.eval()导致模型中的Dropout和BatchNorm仍然处于训练模式。Dropout在推理时会让一部分随机神经元被丢弃预测结果不稳定BatchNorm在训练模式会用当前batch的统计量而不是全局统计量这会让单张图片的归一化结果取决于batch里其他图的分布直接影响精度。这是所有Pytorch推理脚本里最常见的低级错误每次写推理代码第一件事就是model.eval()。6. 评估与上线混淆矩阵、Top-5准确率与单张推理脚本6.1 用混淆矩阵定位难分的花种对整体准确率只能说一个大概真正需要关注的是哪些类别被搞混了。104类花卉里必然有一些外观接近的品种比如不同颜色的菊科花、不同品种的月季。混淆矩阵是定位这些问题的第一工具。import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix def plot_confusion_matrix(model, val_loader, class_names, devicecuda): model.eval() y_true, y_pred [], [] with torch.no_grad(): for images, labels in val_loader: images, labels images.to(device), labels.to(device) outputs model(images) _, preds torch.max(outputs, 1) y_true.extend(labels.cpu().numpy()) y_pred.extend(preds.cpu().numpy()) cm confusion_matrix(y_true, y_pred) # 找出错误最多的类别对 cm_no_diag cm.copy() np.fill_diagonal(cm_no_diag, 0) idx np.unravel_index(np.argmax(cm_no_diag), cm_no_diag.shape) print(f{class_names[idx[0]]} 与 {class_names[idx[1]]} 最容易混淆) return cm拿到混淆矩阵以后我会特别关注两个数字一是被混最多的那个类别对是哪一个二是每个类别的对角线召回率谁最低。前者看的是相似花种之间的区分问题解决手段往往是针对性地补充该品种从不同角度拍的数据后者看的是样本量不足的问题解决手段通常是我们第四节说的类别权重。不要指望一个通用模型把所有104个类都做得一模一样把训练时间和数据增强资源倾斜给最弱的类整体准确率提升会比均匀用力更明显。6.2 推理脚本与Top-5输出让模型在真实场景少犯错花卉识别的真实场景里一朵花很容易被叶子或另一朵花遮挡模型在Top-1上的自信预测不一定可靠。我习惯在推理脚本里同时输出Top-5的候选类别和置信度让调用方自己决定是否接受这个结果。如果Top-5里前两个类别置信度非常接近说明这个样本确实难分这时候宁可让用户看到多个候选项也不要强行给一个错误的Top-1结论。def predict_top5(model, image_path, transform, class_names, devicecuda): from PIL import Image model.eval() img Image.open(image_path).convert(RGB) x transform(img).unsqueeze(0).to(device) with torch.no_grad(): logits model(x) probs torch.softmax(logits, dim1) top5_prob, top5_idx torch.topk(probs, 5) results [(class_names[i], p.item()) for i, p in zip(top5_idx[0], top5_prob[0])] return results这个脚本看起来短但有一个细节值得养成习惯把model.eval()放在函数第一行而不是放在调用方代码里。这样无论谁拿来用都不会因为忘记切模型模式而得到抖动结果。我在做这类图像分类项目的时候一般还会把推理脚本封装成一个HTTP接口接口返回类别名数组和置信度数组前端只展示置信度超过阈值的结果低于阈值就提示用户重新拍一张。这个套路从早期的花卉识别项目用到现在虽然简单但比训练模型本身更能减少线上事故。另外如果要在真实手机端部署可考虑把EfficientNet-B0导出成ONNX再用ONNX Runtime做推理这在保持分类准确率的同时还能把单张推理时延压到几十毫秒级别。如果只是做技术验证Pytorch的eval模式配合GPU就足够了。无论走哪条路线评估时记得把推理结果和人工复核结果随机抽出来做抽样对比这一步看起来笨却是判断模型是否真正可用最有效的方式。我在这类项目上吃过不少没做抽样复核的亏第一次只看了整体准确率就直接上线结果某个小众花种连续几天被错误预测回归测试做了三轮才找到问题根源。所以现在哪怕时间再紧我也会保留一个固定的人工复核周期。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号