尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python+CNN花朵识别课程设计实战:从数据处理到GUI部署

发布时间:2026/9/26 15:42:02

资讯中心
01
ARTICLE

Python+CNN花朵识别课程设计实战:从数据处理到GUI部署

Python+CNN花朵识别课程设计实战:从数据处理到GUI部署
简介这是一套基于卷积神经网络的花朵图像识别课程设计资源包含完整源码、说明文档、GUI演示与快速部署指南面向高校计算机、智能科学、信息工程等专业学生适合课程实践、毕业设计参考及入门图像识别二次开发。压缩包共88个文件整体约107.39MB涵盖Python源码、模型权重文件、预处理后的npy数据、Docker配置、前端页面以及牵牛花、月季、万寿菊、石竹、三色堇等花卉训练图片能支撑从数据预处理到模型推理的完整复现。已有43人学习下载可结合FlowerRecognition项目理解CNN在花朵分类中的典型应用。资源采用模块化架构包含数据预处理、特征提取、分类识别和Web端可视化展示全流程并附带InceptionV3与TensorFlow模型及一键部署脚本便于快速搭建演示系统、调试接口或替换数据集进行功能扩展。注意该资源来源于网络分享仅限教育科研用途不可用于商业场景。1. 花朵识别课程设计为什么说PythonCNN是这块硬骨头的最优解课程设计题目发下来看到“基于Python的花朵识别卷积神经网络”这几个字大多数人的第一反应是慌图像识别不是AI公司才做的事吗实际上这是高校里最常见的CNN入门级课程设计核心目标不是让你发明新算法而是把卷积神经网络的原理走通一遍并交付一份能运行、能答辩、能演示的完整工程。它通常包含三块硬要求可运行的Python源码、规范的设计文档、能现场点图片出结果的GUI界面。选Python是因为生态太成熟PyTorch和TensorFlow都有现成的图像分类组件网上也能找到大量免费源码参考选CNN则是因为花朵分类这类细粒度识别任务传统方法靠手工设计颜色和纹理特征CNN能端到端学习而且LeNet-5这类经典结构就够用不需要一上来就上Transformer。下面直接给你一条从数据集处理、模型训练到GUI打包的落地路径以及我踩过的那些坑。2. 模型选型与数据准备把花朵图片变成CNN能吃的张量在写任何训练代码之前先把数据问题解决掉。卷积神经网络本身只是个数学函数它吃的是固定尺寸的张量而不是任意尺寸的jpg。这个环节做不好后面一切白搭。我见过很多同学上来就写模型结果数据加载时报错或者训练出来准确率只有30%最后发现是图片尺寸不统一、标签错位。2.1 数据集怎么选自拍、公开数据集与课程要求之间的平衡常见做法是使用PyTorch或TensorFlow官方教程里的花朵分类数据集比如Oxford 102 Flowers有102类但课程设计一般不会让你做那么大规模。我建议先问清楚老师的验收标准是要求5类、10类还是更多如果是自选数据集最简单的方式是使用torchvision.datasets.ImageFolder把图片按类别放在不同文件夹里例如data/flower_photos/ rose/ 玫瑰图片若干张 tulip/ 郁金香图片若干张 sunflower/向日葵图片若干张 daisy/ 雏菊图片若干张 dandelion/蒲公英图片若干张采用这种结构ImageFolder会自动按子目录名生成类别索引省去手工写标签的麻烦。如果要自己收集图片注意每个类别至少准备50张并且要覆盖不同角度、光照和杂乱背景。只从网上爬几十张高清图是不够的因为真实场景中花瓣姿态变化很大训练集太干净测试时一泛化就崩。我一般会选择5类每类80到100张这样在普通CPU上十几分钟就能跑完一轮完整训练演示效果也足够。这里有一个关键点数据集里的图片尺寸参差不齐有的是手机拍的3000x4000有的是网图500x500。CNN在卷积层虽然能处理任意尺寸输入但全连接层的输入维度是固定的所以必须统一尺寸。常见做法是用transforms.Resize把图片放缩到目标尺寸再中心裁剪或者干脆粗暴Resize成正方形。我倾向于直接Resize到128x128或224x224。128能加快训练224精度略高但显存占用更大。课程设计不追求极致精度128x128完全够用而且能在答辩现场快速出结果。2.2 预处理流水线resize、归一化与标签编码数据预处理不只是resize。真正让CNN训练稳定的关键在归一化。PyTorch里最常见的做法是直接使用ImageNet的均值和标准差代码很短但效果可靠from torchvision import transforms transform transforms.Compose([ transforms.Resize((128, 128)), # 统一尺寸保证全连接层输入维度一致 transforms.ToTensor(), # 把HWC转成CHW像素值缩放到[0,1] transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])这段代码看着简单但有两个细节容易出错。一是Resize会把图片拉伸变形不过对花朵识别影响不大勉强接受。二是ToTensor已经自动把像素从0到255变成0到1如果你之后再手动除以255就是重复归一化会导致输入分布偏离预期loss收敛变慢。Normalize使用的是ImageNet统计值对大多数自然图像都能起到稳定训练的作用不是随便拍的。如果你的数据集是黑白或特殊风格最好自己算一下均值和标准差可以用mean data.mean()之类的代码做统计。标签编码这一步不需要手动做。ImageFolder会扫描子目录并按字母序编码比如daisy是0、dandelion是1。但要注意这个顺序和你自己的预期可能不一致。在GUI里显示中文类别名时需要自己维护一个idx_to_class字典千万不要想当然地按文件夹顺序猜。这也是答辩时老师最爱问的一个点你的类别映射关系是怎么来的提前把这部分讲清楚能少很多尴尬。2.3 网络结构抄哪份LeNet-5变体还是自定义三层卷积网络结构是重头戏。课程设计不要求你设计新结构但至少要能说清楚每一层的作用。最稳妥的选择是仿照LeNet-5做一个小型CNN输入128x128的RGB图经过三个卷积层和池化层再接两个全连接层。卷积神经网络结构图可以画成下面这个流程答辩PPT里直接放这张图老师一看就知道你学过输入(3x128x128) - 卷积3x3,16 - ReLU - 池化2x2 - 卷积3x3,32 - ReLU - 池化2x2 - 卷积3x3,64 - ReLU - 池化2x2 - 展平 - 全连接256 - Dropout - 全连接(num_classes)代码实现如下import torch.nn as nn class FlowerCNN(nn.Module): def __init__(self, num_classes5): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 16, kernel_size3, padding1), # 3通道输入16个卷积核 nn.ReLU(inplaceTrue), nn.MaxPool2d(2, 2), nn.Conv2d(16, 32, kernel_size3, padding1), # 16进32出扩大通道数 nn.ReLU(inplaceTrue), nn.MaxPool2d(2, 2), nn.Conv2d(32, 64, kernel_size3, padding1), # 32进64出提取更高层特征 nn.ReLU(inplaceTrue), nn.MaxPool2d(2, 2), ) self.classifier nn.Sequential( nn.Flatten(), nn.Linear(64 * 16 * 16, 256), nn.ReLU(inplaceTrue), nn.Dropout(0.5), nn.Linear(256, num_classes), ) def forward(self, x): return self.classifier(self.features(x))输入128x128经过三次kernel大小为2的MaxPool之后特征图尺寸从128变成64、32、16所以全连接层输入是64 * 16 * 16 16384。需要说明的是如果你修改了输入尺寸这里要同步换算否则会报mat1 and mat2 shapes cannot be multiplied错误。卷积核数量16/32/64是我试过的一个性价比平衡点再增加卷积核训练时间成倍增加准确率提升却很有限。Dropout放在全连接层前是为了抑制过拟合训练时随机丢弃一半神经元测试时自动全部保留。为什么选这个结构而不是直接用现成的ResNet18因为课程设计的核心是演示CNN原理模型越小越好讲。ResNet的残差连接准确率确实更高但你要在答辩时解释跳跃连接、BatchNorm这些概念很容易把自己绕进去。如果你实在想拉高准确率可以在基础任务完成之后再用迁移学习单独做一个对比实验这个放到第6章讲。3. 训练与调参从loss下不去到准确率95%的完整过程数据就绪网络结构写好接下来就是训练。这一步是整个课程设计里最“玄学”的地方。同样的模型一个人跑出来90%另一个人跑出来60%差别往往不在代码而在参数、数据顺序和随机种子。你需要一个可复现的最小训练脚本然后围绕它做实验。3.1 最小训练脚本训练循环、模型保存与学习率调度先从能跑通开始。下面是一个完整的PyTorch训练脚本骨架包含数据加载、模型初始化、损失函数、优化器、训练循环和模型保存import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms # 与第2章相同的预处理 transform transforms.Compose([ transforms.Resize((128, 128)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) train_data datasets.ImageFolder(rootdata/flower_photos, transformtransform) train_loader DataLoader(train_data, batch_size32, shuffleTrue, num_workers2) model FlowerCNN(num_classes5) device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) scheduler optim.lr_scheduler.StepLR(optimizer, step_size10, gamma0.1) epochs 30 for epoch in range(epochs): model.train() running_loss 0.0 correct 0 total 0 for images, labels in train_loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() scheduler.step() print(fEpoch {epoch1:02d} Loss: {running_loss/len(train_loader):.4f} Acc: {100*correct/total:.2f}%) torch.save(model.state_dict(), flower_cnn.pth)逻辑说明每个epoch遍历一次全部数据。optimizer.zero_grad()清空上一轮梯度如果不调用梯度会累加loss.backward()计算反向传播梯度optimizer.step()更新模型参数。scheduler.step()在每轮结束后调整学习率这里设置每10个epoch衰减为原来的0.1让训练后期用小学习率做精调减少loss震荡。参数说明batch_size32是CPU和低端显卡都友好的数值显存不足可以降到16。lr0.001是Adam的经典默认值大多数CNN任务都能在这个基础上收敛。如果loss不下降优先检查是不是lr太大导致震荡或者数据没有归一化。num_workers2表示用两个子进程加载数据Windows下如果报BrokenPipeError直接改成0最省心虽然慢一点但不会出错。最后保存的是state_dict不是整个模型后面加载时要用相同的网络结构来接。3.2 损失曲线翻车现场过拟合、学习率过大与标签错乱训练过程不是一帆风顺我总结了三类高频翻车现象。第一类loss快速下降后不再变化准确率卡在70%左右。这通常是模型容量不够或者数据太单一。解决办法是增加卷积核数量比如把最后一个卷积层的64改为128同时配合数据增强。第二类loss在训练集上极低但一跑验证集就原形毕露。这是过拟合。Dropout已经加了还压不住那就检查是不是训练集和验证集混在一起了。常见错误是有的人直接把原始数据集随机切分但没做shuffle导致验证集里混进了训练集同源的图片评估结果失真。第三类是最隐蔽的loss正常下降但准确率从头到尾在20%左右波动。这多半是标签和数据错位了。比如你的文件夹顺序是rose、tulip、sunflower、daisy、dandelion但GUI里显示的中文名对应序号却是另一套。这种错位不会报错结果却完全错。调试方法很简单随机抽几张训练样本打印dataset.class_to_idx和图像路径人工确认一遍。我曾在一次实验中把训练好的模型接到GUI里发现“向日葵”的置信度总是拿不到高分排查半天才意识到是类别顺序映射错了而不是模型没学好。学习率过大也会导致loss变成NaN。我曾经把lr设成0.1训练到第5个epoch时loss直接变成nan原因是Adam在大梯度下也救不回来。如果遇到NaN先把lr降到0.0001并加上梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm5)梯度裁剪能抑制梯度爆炸是训练RNN和较深CNN时常用的手段。放在loss.backward()之后、optimizer.step()之前即可。3.3 用混淆矩阵找弱势类别向日葵和蒲公英为什么总搞混光看整体准确率不够。答辩时老师会问“你觉得模型对哪类花最容易分错” 回答“不清楚”会很尴尬。用混淆矩阵看错误分布是必做的功课。下面这段代码在验证集上输出每类别的精确率、召回率和混淆矩阵from sklearn.metrics import confusion_matrix, classification_report import numpy as np model.eval() y_true [] y_pred [] with torch.no_grad(): for images, labels in val_loader: images images.to(device) outputs model(images) _, predicted torch.max(outputs, 1) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted.cpu().numpy()) print(classification_report(y_true, y_pred, target_nameslist(train_data.classes))) cm confusion_matrix(y_true, y_pred) print(cm)classification_report会直接给出每一类的精确率、召回率和F1分数。如果发现某两个类别混淆严重通常是它们的视觉特征太接近。向日葵的花盘和蒲公英的绒球在缩小到128x128后纹理细节几乎丢失确实容易混。常见解决方法是把输入尺寸提高到224或者增加卷积层数也可以单独为这两类补充训练样本。作为课程设计整体准确率达到90%以上并且能解释清楚混淆原因已经算是优秀了。4. GUI演示用Tkinter把模型包成可交作业的桌面应用模型训练好接下来是课程设计里最有“演示效果”的环节GUI。老师在验收时不看你在终端里跑得多欢他要看见一个窗口能选图片、点按钮、出结果。Tkinter是Python自带的标准库不需要额外安装打包也方便所以是课程设计首选。不要为了炫技去用PyQtPyQt在打包体积和许可证上都有更多坑而且课程设计用不上那么强的组件。4.1 Tkinter界面最小框架按钮、图片框与置信度输出一个能用的GUI至少包含三个元素选择图片按钮、图片显示区域、预测结果文本。我常用的布局代码如下import tkinter as tk from tkinter import filedialog, Label from PIL import Image, ImageTk class FlowerApp: def __init__(self, root): self.root root self.root.title(花朵识别CNN演示) self.root.geometry(520x450) self.btn tk.Button(root, text选择图片, commandself.open_image) self.btn.pack(pady10) self.image_label Label(root) self.image_label.pack() self.result_label tk.Label(root, text等待选择图片, font(微软雅黑, 14)) self.result_label.pack(pady10) def open_image(self): path filedialog.askopenfilename(filetypes[(图片, *.jpg *.png *.jpeg)]) if not path: return img Image.open(path).convert(RGB) img.thumbnail((200, 200)) self.img ImageTk.PhotoImage(img) self.image_label.config(imageself.img) if __name__ __main__: root tk.Tk() app FlowerApp(root) root.mainloop()需要特别注意self.img ImageTk.PhotoImage(img)必须保存在实例属性里否则会在函数返回后被垃圾回收图片不显示。这是Tkinter最常见的问题之一很多人只看到界面空白不知道是引用丢了。界面骨架搭完后再在open_image里加入模型预测逻辑。4.2 加载模型的正确姿势避免每次预测都重新读权重一个容易犯的错误是把模型加载放在按钮回调里导致每点一次按钮就重建一次模型、读一次权重慢得让人怀疑程序卡死。正确做法是在__init__里初始化一次保持常驻内存import torch from torchvision import transforms # 在 __init__ 中 self.device torch.device(cuda if torch.cuda.is_available() else cpu) self.model FlowerCNN(num_classes5) self.model.load_state_dict(torch.load(flower_cnn.pth, map_locationcpu)) self.model.to(self.device) self.model.eval() self.transform transforms.Compose([ transforms.Resize((128, 128)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])预测函数里把选中的图片做同样的预处理然后前向传播取softmax概率最大的类别def predict(self, path): img Image.open(path).convert(RGB) img self.transform(img).unsqueeze(0).to(self.device) with torch.no_grad(): outputs self.model(img) probs torch.softmax(outputs, dim1) conf, idx torch.max(probs, 1) return self.classes[idx.item()], conf.item()这里self.classes是从train_data.classes保存下来的类别列表不要写死因为你可能换数据集。torch.no_grad()关闭梯度计算预测时省内存且更快这是常见的最佳实践。在GUI的result_label里显示“识别结果向日葵置信度98.2%”这样的文案比只显示类别名要直观得多答辩演示效果好很多。4.3 PyInstaller打包资源路径与opencv的常见坑课程设计一般要求提交可执行文件最常用的是PyInstaller。打包命令可以这样pyinstaller -w -F --add-data flower_cnn.pth;. --add-data data;data gui.py-w表示不显示控制台窗口-F打包成单个exe--add-data把模型权重和数据集一起塞进包里。注意Windows下路径分隔符是分号;Linux下是冒号:开发环境在Windows就写分号。打包后运行时经常报找不到模型文件原因是PyInstaller把资源解压到了临时目录_MEIPASS而不是exe所在目录。解决办法是在代码里用sys._MEIPASS拼接资源路径import sys, os def resource_path(relative_path): base_path sys._MEIPASS if hasattr(sys, _MEIPASS) else os.path.abspath(.) return os.path.join(base_path, relative_path) model_path resource_path(flower_cnn.pth)还有一个高频坑是PIL和opencv同时存在时的numpy版本冲突常见报错是np.float属性不存在。这通常是numpy版本太新而PIL或opencv的老代码还在用np.float。解决方法是锁定numpy版本到2.0以下比如pip install numpy1.26.4。另外如果你的GUI里用到了cv2.imread注意它读取的是BGR顺序而PIL读取的是RGB颜色会偏蓝最好统一用PIL处理避免调色差问题。5. 快速部署与答辩避坑源码、文档、环境三件套的常见问题训练和GUI都搞定剩下的就是开发机到演示机的环境迁移问题。很多课程设计代码在自己的电脑上跑得好好的一换机器就各种报错。明明源码、数据集、权重都在就是跑不起来。这一章专门处理这些“最后一公里”的坑。每条都按现象、原因、解决三步写你可以直接对照排查。5.1 Python环境装不上的血泪教训3.8还是3.10现象按网上教程装Anaconda然后pip install torch结果下载几个小时后报Could not find a version that satisfies the requirement torch。原因PyTorch对Python版本有硬性要求某些老版本代码只支持到Python 3.8而新安装的Python可能是3.11或3.12。反过来有些教程代码用了较新的语法在3.7上又会报错。课程设计源码往往来历不明作者用的Python版本和你不一样是常态。解决不要追新直接用Anaconda创建独立环境锁定Python版本。我一般用Python 3.8或3.9跑PyTorch项目兼容性最好。命令如下conda create -n flower python3.8 conda activate flower pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu如果只是CPU演示不要装CUDA版体积大且容易出问题。课程设计用CPU跑完全足够。Windows下如果pip下载慢可以配置国内镜像源但torch的CPU版建议用官方源更稳镜像源偶尔会缺包。装完后用python -c import torch; print(torch.__version__)验证能输出版本号就是成功。这一步是很多人卡住的地方建议在需求文档里写明“使用Python 3.8 torch 2.x CPU版”减少老师那边复现的阻力。5.2 源码能跑但GPU占用0TensorFlow与CUDA的版本战争现象代码里写了torch.cuda.is_available()返回True但训练时速度仍然很慢任务管理器里GPU占用率0%。原因可能是模型和数据没有全部移动到GPU上比如只移动了images忘了移动labels也可能是你的PyTorch本来就是CPU版torch.cuda.is_available()返回False但你没注意。另一种常见情况是使用了TensorFlow代码装了GPU版却没匹配CUDA和cuDNN导致TensorFlow偷偷退回CPU计算。解决如果是PyTorch训练循环里一定要检查每个参与计算的张量和模型都在同一设备。简单粗暴的做法是定义device torch.device(cuda if torch.cuda.is_available() else cpu)然后对model、images、labels都调用.to(device)。如果确认代码没问题但仍然没有GPU加速大概率是安装的PyTorch是CPU版卸载后按5.1重新安装即可。不要在课程设计里死磕GPUCPU跑演示足够了真要用GPU提前检查CUDA版本和PyTorch版本是否对应这个可以直接参照官网的安装命令。5.3 GUI窗口一闪而过或白屏远程桌面与显示环境现象双击打包后的exe窗口一闪就消失或者显示白屏没有任何按钮。原因一是代码启动时异常程序直接退出二是Tkinter的显示环境问题。如果你用Windows远程桌面登录某些精简系统桌面主题被禁用Tk窗口可能无法正常实例化。还有一种常见原因是打包时漏了Tcl/Tk资源PyInstaller不会自动把所有Tk依赖带上。解决先增加日志文件定位崩溃原因。在源码入口包一层import traceback try: root tk.Tk() app FlowerApp(root) root.mainloop() except Exception: with open(error.log, w, encodingutf-8) as f: traceback.print_exc(filef)如果error.log里显示No display name and no $DISPLAY environment variable说明你在Linux环境跑图形界面但没有X服务需要补装python3-tk或者换用VNC/物理机登录。Windows下闪退则多半是Tkinter相关动态库没打包进去可以在spec文件里手动添加tcl和tk的路径。如果打包是在Docker里做的要格外小心我遇到过因为基础镜像没有libX11.so导致GUI起不来的情况。解决方法是换用完整的桌面版Python环境重新打包。5.4 文档和源码不一致答辩问答环节的翻车重灾区现象开发文档里写的网络结构是“三层卷积两层全连接”但源码里实际是四层卷积文档里写学习率0.01代码里是0.001。答辩老师稍微一对发现矛盾直接扣印象分。原因时间紧文档是在最后赶出来的代码已经改了好几版文档没跟上。或者是从网上Copy了教程文档直接贴到自己的课程设计报告里却没和代码核对。解决把文档和源码当作一个整体来交付。文档里的网络结构部分直接用代码生成参数表不要手写。例如在模型定义后打印每一层的信息from torchsummary import summary summary(model, input_size(3, 128, 128))输出每一层的输出形状然后截图放进文档里。这样文档里的[64, 256]和源码一定一致。另一个技巧是保存模型的同时保存一个model.json记录训练参数、数据集路径、类别顺序答辩时被问到任何细节直接打开文件念就行。如果时间实在不够优先保证文档里的网络结构、输入尺寸、准确率这三个数字和代码对得上其他文字描述可以适当简化。5.5 提交包缺这个少那个五件套不能落现象交作业的zip里只有train.py和gui.py没有数据集、没有requirements.txt、没有模型权重老师根本跑不起来。原因以为源码就是全部忽略了数据集、权重、依赖清单、文档。课程设计验收最看重可复现缺一个文件都不行。解决在项目根目录放一个requirements.txt不要用pip freeze requirements.txt全量导出它会把无关包也打进去。手动列出能跑通的核心依赖即可比如torch、torchvision、Pillow、numpy、scikit-learn。提交前在全新的虚拟环境里按文档步骤跑一遍这一步我称之为“干净环境验证”能暴露90%的部署问题。我的习惯是代码、数据、权重、文档、requirements.txt这五样缺一不可。宁可多打包也不要让老师卡在第一步。6. 进阶玩法把课程设计变成简历上的项目亮点课程设计做完只是起点。如果你想让这个项目在简历上更有分量可以在现有基础上加三个低成本升级。第一个是数据增强这是性价比最高的改动。在transforms.Compose里加上RandomHorizontalFlip随机水平翻转、RandomRotation随机旋转和ColorJitter色彩抖动只需要几行代码模型泛化能力就能明显提升。第二个是迁移学习用torchvision.models里预训练的ResNet18替换自定义特征提取层训练时冻结前几层只微调最后几层。准确率通常能提到98%以上而且训练时间不会太长代价是你需要能解释清楚预训练模型和微调的差异。第三个是导出为ONNX格式做跨平台部署。用torch.onnx.export把模型导出成.onnx文件再用ONNX Runtime在纯Python环境里跑推理这样GUI就不依赖PyTorch了打包体积从几百兆缩小到几十兆部署更方便。这三个升级不用全部做选一个和你的课程设计结合即可。答辩时如果能说一句“我对比了数据增强前后的准确率从89%提升到94%”老师会觉得你有完整的实验意识而不是只会跑通代码。最后分享一个我自己的习惯每次在终端看到loss: nan我都先把模型和数据清空检查三件事——数据有没有归一化、学习率是不是太大、标签有没有错位。这个排查顺序帮我省下了很多时间。希望这些经验能帮到你的课程设计祝你顺利跑通一朵花。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。