从ResNet到Flask:城市遥感影像分类毕设全流程实战

发布时间:2026/10/18 21:41:23
从ResNet到Flask:城市遥感影像分类毕设全流程实战 每年到毕设季总有人抱着一个看起来很宏大的题目来找我聊问我该从哪里下手。像Flask-基于深度学习的城市遥感影像分类方法研究这种其实是一个非常典型的动手型题目核心任务是用深度学习模型对城市遥感影像做地物分类交付物是一套能演示的Web系统最后还要拿它去答辩。题目里写的RestNet学界通用拼法其实是ResNet残差网络这个拼写问题答辩前一定要改过来不然PPT第一页就被老师点名了。这篇文章我就按一个真实做过类似项目的角度从拆题、数据准备、模型训练到Flask把模型包装成可演示的网站再到答辩时老师最爱追问的深水区问题完整梳理一遍。想拿这套思路去复现项目、或者只是想把毕设做得更稳的同学可以直接照着操作。1. 先把题目拆明白遥感影像分类到底要做什么做到什么程度才算完1.1 毕设项目的目标拆解很多同学拿到题目第一反应是深度学习好难、遥感影像看不懂其实这题的交付物很清晰拆开就三块第一核心任务让模型输入一张城市遥感影像输出这张图对应的地物类别。比如输入的是一块区域的正射影像模型告诉你这里面主要是建筑物、道路、绿地还是水体。注意这是图像分类任务不是语义分割。分类是把整张图打一个标签分割是给每个像素打标签。题目既然写的是分类方法研究那就以整图分类为基线来设计不要一上来就给自己加戏去做UNet逐像素分割。第二研究方法以ResNet系列为核心模型做对比实验和消融实验。毕设论文必须有方法研究的味道纯粹把模型跑通是不够的要有为什么选这个结构、深一点浅一点有什么区别、迁移学习有没有用这类内容。第三系统演示用Flask搭一个Web应用让用户上传一张遥感影像页面返回分类结果、置信度、各类别概率。这是答辩时最能直观展示的部分。模型训练得再好没有可视化界面老师在答辩现场很难感知你的工作量。我当时给一个学弟做模拟项目X的时候就把这三件事拆成三个里程碑第一周跑通ResNet-18基线拿到80%以上的验证准确率第二周换ResNet-50和迁移学习策略把指标拉高第三周写Flask应用把模型挂上去。每个里程碑都能单独演示这比憋一个大而全的东西稳得多。1.2 为什么选ResNet和Flask这套组合先回答一个大家都会问的问题为什么是ResNet不是VGG不是ViT更不是自己随便堆几层卷积ResNet的优势在于有预训练权重、结构可靠性高、部署生态成熟。它用残差连接shortcut解决了网络加深后的退化问题所以哪怕你拿到的数据集只有几千张图直接加载在ImageNet上预训练好的ResNet权重做微调也能训出不错的精度。VGG结构简单但参数量大、训练更慢ViT在遥感影像上效果确实好但它对数据量和训练技巧要求更高普通学生用单卡训练容易翻车自己搭CNN不是不行但论文里缺少对比参照答辩会很被动。Flask则是所有Python Web框架里最适合毕设演示的。它足够轻一个app.py就能跑起来它足够简单Jinja2模板加几个路由就能做出上传页面它的资料最多遇到问题一搜就有答案。有人会说FastAPI性能更好但毕设场景下性能不是瓶颈而是能不能快速跑通、能不能讲清楚代码Flask在这两点上完胜。1.3 系统整体架构与端到端流程整个系统分训练端和推理端。训练端是标准的PyTorch流程准备数据集 → ImageFolder加载 → ResNet加载预训练权重 → 训练若干轮 → 在验证集上挑选最优checkpoint → 在测试集上评估得到准确率、F1、混淆矩阵等指标。训练和推理是两套环境训练用GPU推理演示甚至可以放在CPU上跑因为单张图的推理耗时通常可以接受。推理端就用Flask包装app启动时把模型加载到内存每次收到上传图片请求走一遍与训练时完全一致的图像预处理然后forward得到logits再softmax转成概率把Top-1类别和Top-5概率返回给页面。所谓端到端就是从你在浏览器选一张遥感影像开始到页面显示类别建筑置信度0.92中间所有环节都要串起来。数据流大致是遥感影像文件 → Flask接收 → PIL打开 → resize/裁剪/归一化 → 转Tensor → ResNet前向推理 → softmax → 类别与概率 → 渲染页面。这个链路里最容易出问题的是预处理和训练不一致后面我会单独讲。2. 数据和任务定义建模之前最容易被低估的一步2.1 类别体系怎么定从地物到分类标签遥感影像分类不是随随便便打个标签类别体系直接决定整个项目的难度和可信度。城市地物一般可以概括成这么几类建筑、道路、植被、水体、裸地、农田如果还想更完整可以加一个其他/背景类总共控制在6到8类。这个数量对毕设来说比较合适类别太少显得任务太简单类别太多则标注样本和类别均衡都是麻烦事。这里有一个反直觉的经验类别定义越细分类边界越难学。道路和裸地在影像上颜色相近水体和建筑物的阴影经常被弄混植被和农田在光谱上更是纠缠不清。所以类别体系本身就是论文里可以写一节的研究内容——你是依据什么标准来定义类别的各类别在实际影像上有什么特征哪些类别容易被混淆这些都能体现你对任务的思考。如果你用的是公开数据集类别体系一般是对方定好的你只需要按它的规则来如果你是自己从影像底图上裁剪patch那就要先定类别规则再组织标注。我建议优先用公开标注数据集因为遥感影像标注成本极高一个256x256的patch里可能有多种地物标注标准不一致会让模型学到错误特征。2.2 数据来源与预处理管线数据量方面分类任务起步至少需要每类几百张图。假设做7类那么总样本量最好在3000张以上不然ResNet这种深网络很容易过拟合。公开的城市遥感影像分类数据集通常是已经有类别标签的RGB影像直接下载就能用。如果想自己构建常见做法是从大范围影像底图上按网格裁剪出若干patch再结合已有的地物矢量文件给每个patch打标但这个方法工作量非常大毕设时间有限的话不推荐。拿到数据后第一道工序是统一格式。所有图像统一转成RGB三通道尺寸建议先定成256x256。为什么是256因为主流预训练模型的标准输入是224x224先resize到256再做中心裁剪到224是最经典的预处理组合既保留了空间上下文又和预训练时的数据分布一致。如果原始影像太大直接resize会造成严重的信息损失宁可裁剪也不要不等比缩放。然后是归一化。PyTorch的torchvision里使用ImageNet预训练权重时必须配合那组固定的mean和stdmean[0.485, 0.456, 0.406]std[0.229, 0.224, 0.225]。这一点几乎人人都会写但很多人不理解为什么。因为预训练模型是在经过这种标准化后的数据上训练的你推理时如果不做同样的标准化输入分布就漂移了模型输出自然不对劲。用代码写就是from torchvision import transforms train_transform transforms.Compose([ transforms.Resize(256), transforms.RandomCrop(224), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2), 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]) ])这里有一个关键原则训练时的数据增强可以丰富多样但验证和测试时的transform必须保持简单、确定只做Resize和CenterCrop。测试时加入随机翻转这类增强会造成评估结果不稳定答辩时被问到你的指标为什么会有波动就很尴尬。2.3 数据增强和数据集划分的细节遥感影像和自然影像有一个重要区别同类地物的成像变化很大。同一个建筑区不同的季节、不同的光照、不同的传感器参数影像颜色和纹理都可能差异明显。这就是为什么数据增强在遥感分类里非常关键。随机旋转、水平翻转、色彩抖动、随机裁剪这几招基本够用。不要用太激进的增强比如99度的旋转或者极端的亮度变化那会让模型学到扭曲的特征。数据集划分是很多人踩坑的重灾区。如果你是按照patch网格来构建数据的那么相邻的patch之间高度相关。比如一张大影像切割成网格patch 1和patch 2有大量重复区域如果它们一个在训练集一个在验证集验证准确率就会虚高。更规范的做法是按图像块或地理区域来划分比如一栋建筑周围的patch全部进训练集另一栋建筑周围的patch全部进验证集确保训练和验证的数据尽量来自不同的空间区域。划分比例用7:2:1或者8:1:1都可以。数据量不大时保证验证集和测试集每类至少有50到100张图否则算出来的指标方差极大根本不能说明问题。划分完之后一定要看一眼每类的样本数量画个柱状图如果不均衡就要在损失函数或采样策略上做文章。这个问题答辩必问后面第5章我会展开讲。3. ResNet模型选型与训练调参全过程3.1 残差结构到底解决了什么问题ResNet的核心理念一句话就能概括在普通卷积网络的基础上给每个基本模块加一条恒等快捷连接。原来网络的中间特征是H(x)现在让模块去学习F(x) H(x) - x最终的输出是F(x) x。这条shortcut就像一条保障通道即使中间卷积层学不到有用的东西原始输入也能直接传到后面梯度回传时也不会因为链式法则连乘而消失。用一个生活化的类比普通网络是快递员从A地往B地送包裹每一站都要重新打包层层传递中途任何一站出错包裹就丢了或变形了。ResNet相当于给每个快递员配了一辆直达车即使他在途中什么都没干包裹也能原样抵达终点他只需要在车到达前把顺手加个赠品这件事做好。这样网络就能放心地堆到50层、100层而不是像早期的VGG那样越深反而越差。ResNet家族里ResNet-18、ResNet-34用的是BasicBlockResNet-50及以上用的是Bottleneck结构1x1卷积降维、3x3卷积提取、1x1卷积升维。Bottleneck在增加深度的同时控制参数量和计算量所以ResNet-50是性价比分水岭。毕设项目我建议以ResNet-50作为主模型ResNet-18作为对照组这两个模型的对比正好能撑起论文里的实验章节。3.2 迁移学习策略冻结和微调的边界在哪里城市遥感影像的开源数据量通常不大几千张图让ResNet-50从头训练随机初始化几乎是自找苦吃。正确做法是加载ImageNet预训练权重ImageNet上的边缘、纹理、颜色特征对遥感影像的底层特征提取非常有用。迁移学习有三种策略从简单到复杂一是线性探测冻结backbone全部参数只训练最后一层全连接分类器。适合数据极少时快速跑通管线速度很快但精度一般有限。二是常规微调冻结backbone前若干层比如前40%解冻后面层和分类器一起训练。这样既保留了底层通用特征又能让高层特征适配遥感数据。这是实战中最常用的策略。三是全量微调所有层都参与训练但学习率要调小比如1e-4到1e-5避免在预训练权重的基础上大步乱跳。数据量大时效果最好但训练时间也最长。我在模拟项目X中实际走的路线是先用线性探测跑通全流程拿到一个不算好但稳定的baseline指标确认代码没问题然后解冻后半段网络用1e-4的学习率微调30个epoch精度通常能明显提升。这两组结果写进论文就是一组对比实验比编数据靠谱得多。修改ResNet-50的输出层要注意ResNet-50的最后一层是model.fc输入维度是2048Bottleneck的输出通道数你需要把它改成类别数比如7类就是import torchvision.models as models model models.resnet50(weightsmodels.ResNet50_Weights.IMAGENET1K_V1) num_classes 7 model.fc torch.nn.Linear(model.fc.in_features, num_classes)这里model.fc.in_features会自动读出2048不要写死万一你换成ResNet-18它的fc输入是512代码也能复用。改完最后一层之后backbone的预训练权重依然保留只有fc层是随机初始化的所以在训练初期先只训练fc层或者给fc层单独设一个更大的学习率收敛会更快。3.3 训练配置、指标与结果解读训练超参不是抄公式就行得明白每个参数在干什么。我常用的配置是输入尺寸224x224batch size32或64取决于GPU显存显存不够就降到16同时把学习率也按比例调小优化器AdamWweight_decay设为1e-4。有些人喜欢用SGD加momentum也行但对新手来说AdamW更容错初始学习率全量微调用1e-4如果只训练fc层用1e-3学习率调度CosineAnnealingLRT_max等于总epoch数省得手动调下降节点或者StepLR每30轮乘以0.1训练轮数50到100轮配合early stopping验证集准确率连续10轮不涨就停损失函数CrossEntropyLoss如果类别不均衡要加类别权重混合精度如果你的训练环境支持自动混合精度可以用能省显存并且加速但对毕设来说不是必需品评估指标千万不能只看accuracy。遥感分类场景下类别不均衡会让accuracy变得很有欺骗性如果植被类占了全部样本的一半那模型把所有图都猜成植被也能拿到50%的准确率。必须同时看每个类别的precision、recall、F1以及整体的混淆矩阵。做遥感的老教师一般还喜欢看Kappa系数它是衡量分类一致性的指标比accuracy更能反映真实分类质量。计算方式并不复杂用混淆矩阵就能算出来这也是答辩的一个加分点。我在模拟项目X测试集上的结果大概长这样数据只做演示模型总体准确率平均F1Kappa备注ResNet-18微调84.2%0.8330.812基线ResNet-50线性探测83.5%0.8260.802训练最快ResNet-50微调87.6%0.8680.851主模型从这张表就能读出论文里可以写的结论线性探测受限于冻结的backbone精度提升有限微调能让高层特征适应遥感数据分布所以主模型采用ResNet-50微调方案。ResNet-50比ResNet-18高3个多百分点说明模型容量对遥感分类任务有正向帮助但边际收益在递减这就为为什么不直接上ResNet-101留下了回答空间。训练曲线解读也是有门道的。如果验证集loss在第20轮左右开始抬升而训练集loss还在下降这就是标准过拟合信号应对办法是加强数据增强、加大weight_decay或者提前停止。如果验证集准确率迟迟不涨先检查是不是学习率设置过大导致震荡再看是不是数据预处理弄错了。别急着换模型先排掉这些低级问题。3.4 训练过程常见坑与对应调整我在帮同学排查训练问题时遇到最多的坑反而是环境级的。比如训练时用了GPU保存checkpoint推理时在CPU上加载就会报CUDA不能使用的错又比如训练和推理用了不同版本的torchvision导致模型权重加载时报key不匹配。规范做法是训练脚本和推理脚本里的模型定义必须完全一致checkpoint至少要保存state_dict并且把类别列表和预处理参数一起保存在一个配置文件中。第二个坑是遥感影像的亮度差异。同一个城市夏天和冬天的影像亮度差很多卫星和航拍的色彩风格也不一样。如果模型只在一种影像风格上训练遇到新图就完蛋。ColorJitter增强虽然能缓解但更稳妥的做法是训练前先做一次全数据集的像素统计分析看看每类地物的均值方差是不是差异很大如果差异大就要考虑按传感器或季节把数据分开做域适应而不是一股脑混着训。第三个坑是训练日志混乱。很多同学喜欢把指标print到控制台就完事等到要写论文了才发现没有历史曲线。建议从第一天开始就把每个epoch的train loss、val loss、val accuracy、F1、Kappa写进CSV文件训练结束后用脚本直接画曲线。这不仅是论文素材也是排查问题的重要依据比如你发现val loss在第N轮突然跳高回头对照CSV就能猜出是学习率调度器在那一步降了学习率还是数据加载出了错。4. Flask搭建推理服务把模型变成答辩现场能看的演示系统4.1 项目结构与模型加载训练跑通只是完成了研究部分答辩时你能现场打开浏览器演示上传图片、查看分类结果那效果完全不一样。Flask这层的代码量不大但结构要清楚。一个典型的项目布局是这样的project/ ├── app.py # Flask主程序 ├── model_utils.py # 模型加载与推理封装 ├── weights/ │ └── best_model.pth # 最优checkpoint ├── templates/ │ ├── index.html # 上传页面 │ └── result.html # 结果展示页 └── static/ └── uploads/ # 上传图片临时存放在app.py里模型加载是要放在全局区间的不能每次请求都重新加载一次模型。否则每来一个用户就要重新读一遍几百MB的权重文件响应时间直接变成灾难。正确做法是模块导入时就把模型加载好import torch from flask import Flask, request, render_template, jsonify from model_utils import load_model, predict_image app Flask(__name__) # 全局加载只在服务启动时执行一次 device torch.device(cuda if torch.cuda.is_available() else cpu) model, class_names, transform load_model(weights/best_model.pth, device)模型加载函数里要特别注意map_location。训练时权重在GPU上但答辩演示很可能只有一台CPU机器所以加载时要明确指定map_locationdef load_model(weight_path, device): model models.resnet50() num_classes 7 model.fc torch.nn.Linear(model.fc.in_features, num_classes) checkpoint torch.load(weight_path, map_locationdevice) model.load_state_dict(checkpoint[model_state_dict]) model.to(device) model.eval() return model, class_names, val_transform这里model.eval()是一行容易被忽略但极其关键的代码。PyTorch模型在训练模式下BatchNorm层和Dropout层的表现与推理模式完全不同。忘了切eval模式同一个模型在推理时结果可能和训练时不一致而且还不稳定。4.2 图像预处理必须和训练对齐这段是整个Flask项目里最容易出错的地方我必须单独拿出来讲。很多人训练代码里写了transforms推理代码里又自己写了一套读图像的逻辑两边不一致导致模型输出完全不对。正确做法是推理时复用训练时验证集的transform。我的推理流程是这样的def predict_image(image_path, model, transform, device, class_names): from PIL import Image img Image.open(image_path).convert(RGB) img transform(img) # 与训练时验证集完全一致 img img.unsqueeze(0).to(device) # 增加batch维度 with torch.no_grad(): logits model(img) probs torch.softmax(logits, dim1)[0] top_prob, top_idx torch.topk(probs, k1) label class_names[top_idx.item()] confidence top_prob.item() all_probs {class_names[i]: round(probs[i].item(), 4) for i in range(len(class_names))} return label, confidence, all_probs有几个细节要说明。第一PIL打开图片后要.convert(RGB)否则遇到没有alpha通道的灰度图或带透明通道的PNG通道数会不一致。第二transform里的ToTensor已经会把PIL图像转成CHW的Tensor并归一化到0到1所以在transform之前不要再手动做归一化。第三topk返回的置信度直接是softmax之后的值显示成92.3%就好不要画蛇添足再去乘100。还有一个隐藏坑如果上传的是RGBA的PNG直接.convert(RGB)是安全的但如果是16位深度的TIFFPIL的默认行为可能让模型收到错误的数据范围。最简单的兜底方案是在异常处理时直接提示用户请上传JPG或PNG格式的RGB图片不要强行兼容所有格式。答辩现场的图片基本都是JPG不用过度设计。4.3 API设计与前端页面Flask的接口设计按够用、清晰来就好不需要上RESTful全套。两个路由就能撑起整个演示app.route(/, methods[GET]) def index(): return render_template(index.html) app.route(/predict, methods[POST]) def predict(): if file not in request.files: return jsonify({error: 未收到图片文件}), 400 file request.files[file] if file.filename : return jsonify({error: 请选择要上传的图片}), 400 # 保存临时文件并推理 img_path os.path.join(static/uploads, file.filename) file.save(img_path) try: label, confidence, all_probs predict_image(img_path, model, transform, device, class_names) return render_template( result.html, image_pathimg_path, labellabel, confidenceround(confidence * 100, 2), probabilitiesall_probs ) except Exception as e: return jsonify({error: f推理失败{str(e)}}), 500前端页面用Jinja2模板就好。上传页面就一个form记住一定要加enctypemultipart/form-data否则文件传不到后端form action/predict methodpost enctypemultipart/form-data input typefile namefile acceptimage/* required button typesubmit开始识别/button /form结果页面把result.html里对应的变量展示出来就行比如{{ label }}显示类别、{{ confidence }}显示置信度再把all_probs遍历成一个表格展示每个类别的概率分布。答辩演示时最好把类别概率分布图做得直观一点用一个简单的进度条或者带颜色的标签老师一眼就能看出模型对这张图把握有多大。4.4 性能与部署注意事项Flask自带的开发服务器足够应付答辩演示但有几个性能细节要注意。第一所有推理都要包在with torch.no_grad():里不要忘了否则会额外计算梯度又慢又费内存。第二如果用的是GPU可以设torch.cuda.synchronize()再计时这样推理耗时才准如果在CPU上演示一次ResNet-50的推理大概要几秒到十几秒要提前跟老师说明单张推理耗时这个指标。第三上传的图片要限制大小比如小于5MB不然一张几十MB的巨大影像传上来预处理阶段就可能卡死。关于运行稳定性的经验是答辩前一晚一定要用一套跟答辩现场相同的流程完整走一遍。把模型跑起来、用准备好的测试图片各测一遍、再测一遍故意传错误格式的图片确认异常提示是否友好。不要现场临时换模型文件更不要现场才开始下载依赖。如果你希望别人在答辩后能访问你的演示站可以把Flask服务放到一台常驻的机器上运行或者用waitress这类WSGI服务器做简单托管但这不是毕设的重点。有一个容易忽略的点weights目录下的best_model.pth可能很大如果你用的是Git做版本管理记得把weights文件夹加到.gitignore里免得提交几百MB的二进制文件。同时要在README里写清楚模型文件的下载方式和放哪个目录不然换一台电脑你都不知道这个项目能不能跑起来。5. 答辩前夜的深水区自问老师最可能追问的五个问题5.1 你的是RGB分类遥感影像不是有多个波段吗遥感影像的多光谱特性是答辩老师一定会碰的点因为很多人用的公开数据集是RGB影像但真正的遥感影像往往有近红外等多个波段。这个问题不是要刁难你而是看你对任务边界有没有清醒的认识。正确回应思路是承认当前方案基于RGB三通道公开数据集这是由数据源决定的然后说明扩展到多光谱的路径——把模型第一层卷积的输入通道从3改成4或更多由于预训练权重无法直接复用需要更小学习率从头适应或对多光谱数据做波段融合预处理。能讲出这条技术路线比硬撑着说RGB完全够用要专业得多。5.2 类别不均衡怎么处理如果训练集里建筑类有2000张而裸地只有200张模型天然偏向多数的类别少数类的recall会非常低。很多同学只看总体准确率觉得85%很高但一看混淆矩阵裸地的recall只有40%这就露馅了。所以答辩前一定要打印出混淆矩阵自己先盯一遍每个类别的情况。处理不均衡的手段按优先级排序一是给CrossEntropyLoss加类别权重权重与类别频率成反比二是对少数类做额外数据增强三是考虑Focal Loss它让模型更关注难分的样本四是在评价时报告F1和Kappa而不是只看accuracy。答辩时如果能从混淆矩阵中具体指出建筑和裸地之间最容易混淆因为它们的纹理特征相似说明你真的看过自己的实验结果这是加分项。5.3 深度学习对于遥感分类的可解释性深度学习是个黑箱是老生常谈但答辩老师真正想听的是你怎么证明模型是学到了地物特征而不是记住了训练集。这里有一个性价比很高的工具就是GradCAM它可以生成一张热力图标出模型在分类时主要关注的图像区域。实操很简单从torchcam等库中调用类激活图方法把某张测试图的注意力区域画出来叠加在原图上。比如模型把一块区域识别为建筑热力图应该集中在建筑屋顶结构上而不是落在旁边的树影上。这不仅是可视化也是诊断模型错误的手段如果热力图乱指说明模型可能学到了错误的关联就要检查数据和训练过程。答辩现场展示两三张GradCAM结果图立刻就能把可解释性这个问题答得很踏实。5.4 换城市、换传感器、换季节效果还会那么好吗这个问题的本质是域偏移domain shift。训练集来自某座城市某一时期的数据换到另一个城市、另一个传感器、或者同一城市不同季节的图像上数据分布都变了模型精度大概率会掉。要诚实承认这一点然后给出应对思路一种思路是数据层面在训练时加入更丰富的增强模拟不同传感器的风格差异另一种是让训练数据覆盖更多来源比如混合多个公开数据集一起训练更进阶的做法是引入域自适应方法让模型在特征层面对齐源域和目标域。这些方案不一定要在毕设里全部实现但能说出问题和解决方向已经体现了研究素养而不是那种我模型天下无敌的盲目自信。5.5 实验对比与消融怎么做才能让论文结论站得住答辩老师看实验部分时最反感的就是只有一个模型、只有一个准确率。一份站得住脚的研究性实验至少要有两个维度的对比第一个维度是不同模型之间的对比。VGG16、ResNet-18、ResNet-50放在同一个数据集、同一个训练配置下横向比较这是证明我的选型有依据的直接证据。有时间的话再加一个传统方法基线比如SVM加HOG特征用来突出深度学习的优势但这个不是必须。第二个维度是消融实验。依然用ResNet-50分别去掉迁移学习、去掉数据增强、不用加权损失看每个组件对最终指标有多大贡献。如果去掉迁移学习后准确率掉了8个百分点那就量化证明了迁移学习的必要性。做消融实验时除了模型组件的开关其他设置必须保持一致否则变量不单一结论就不严谨。所有实验要固定随机种子多次运行取均值标注标准差。这样老师问你的指标是不是偶然跑出来的你就可以直接回答我每组跑了三次表里报的是均值和方差。这句话的分量比任何花哨的图表都重。最后说一个我实际用过的答辩技巧答辩前把训练曲线和混淆矩阵打印成A4纸放在演示电脑旁边。这不是为了照本宣科而是当你被问到你这个模型为什么会把阴影识别成水体时可以指着混淆矩阵说你看这个误判率是8%主要集中在阴影和水体这两类它们的灰度分布非常接近……能用数据说话的人哪怕回答不够完美也会让老师觉得你是真正做过实验的。毕设做得好不好不在于模型刷了多少个点的准确率而在于你能不能把整个链路讲得自洽、透明、经得起追问。把前面这些环节走完整答辩那二十分钟你心里就有底了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询