新闻详情

新闻详情

首页 / 资讯中心 / 详情

ViT图像去雾:源码跑通与loss landscape参数调优

发布时间:2026/10/2 2:40:08来源:尧图网络
ViT图像去雾:源码跑通与loss landscape参数调优
简介面向图像去雾与视觉Transformer应用研究的完整Python项目涵盖算法源码、训练配置与项目文档。资源以ViT网络为核心实现去雾模型适合计算机视觉方向的研究者、算法工程师以及深度学习入门者参考学习可用于算法复现、对比实验、课程设计与科研探索无论是科研实验还是工程落地都能从中获得参考。压缩包共三百四十个文件其中二百零四个Python源码文件覆盖网络结构、训练脚本与评估工具十六个YAML文件用于参数配置九个Notebook提供交互式分析png与gif展示去雾效果对比csv存放损失景观等实验指标md与txt给出使用说明及训练指引整体大小约一百五十六点三八MB目录分类清晰便于按需查阅。已有一千四百四十四人下载学习。项目提供按数据集划分的预训练权重以及option.py参数设置说明训练样本patch大小默认128等关键选项均有注释数据记录涵盖CIFAR-10/100下ResNet、ViT等模型的损失景观与扰动对比便于复现实验、分析不同架构在去雾任务中的表现并深入理解训练动态。1. Vision Transformer图像去雾先跑通它再谈Transformer为什么在去雾上更稳把Vision Transformer用在图像去雾上我前后试了三个版本最后让我决定把这套python源码包完整跑一遍的是它附带的loss landscape数据。图像去雾任务里CNN模型训练到后期loss曲线经常卡在平台期换ViT之后收敛行为确实不一样但以前我只能凭训练曲线去猜。这份基于Vision Transformer的图像去雾算法源码把CIFAR-10和CIFAR-100上的ViT与ResNet/AlexNet对照数据整理成了CSV我可以直接复现训练、看loss landscape再对比自己的实验。对新手来说zip里带了预训练权重和option.py参数文件照着说明文档就能把去雾模型跑起来对熟手来说它最大的价值是省掉了搭对比实验的时间能直接在这套源码上改patch size、换预训练路径验证思路。2. 源码结构梳理与option.py训练前先把参数对齐2.1 文件布局与三个关键模块把zip解压之后我的习惯是先不看说明文档直接看目录结构。这个项目从命名上就能猜个大概My_best_model放预训练权重loss_landscape下放着一批CSV分析数据剩下的就是训练和推理入口。常见做法是下面这种布局项目根目录/ ├── option.py # 全部超参数入口 ├── train.py # 训练脚本 ├── test.py # 测试/评估脚本 ├── My_best_model/ # 预训练权重目录 ├── loss_landscape/ # loss landscape数据 └── README.md # 使用说明文档我把option.py放在第一个要看的位置原因是整个项目的训练参数都集中在这个文件里。源码说明里写了同样的话训练所有参数设置在option.py文件中。这就意味着你不需要翻遍train.py去找硬编码的超参数改配置只动一个文件。三个文件的分工大致是这样option.py定义argparse参数包括补丁大小、预训练权重路径、数据集划分标记train.py读取option.py解析出的参数加载模型和数据后执行训练循环test.py加载训练好的权重做推理计算PSNR和SSIM这类指标。跑项目之前我建议先执行一次python option.py看它打印出来的默认参数是否符合你的环境。2.2 option.py里的关键参数与默认值下面这段代码是这个项目option.py里最核心的参数结构整理成可以直接对照的版本import argparse def parse_args(): parser argparse.ArgumentParser(descriptionViT Image Dehazing) # 训练样本的补丁大小默认128 parser.add_argument(--train_ps, typeint, default128, helppatch size of training samples, default 128) # 预训练权重路径可指定My_best_model下的权重 parser.add_argument(--pretrain_weights, typestr, default, helppath to pretrained weights) # 数据集划分标记比如cifar10或cifar100 parser.add_argument(--data_flag, typestr, defaultcifar100, choices[cifar10, cifar100], helpdataset split flag) # 训练轮数 parser.add_argument(--epochs, typeint, default200, helpnumber of training epochs) # 批次大小 parser.add_argument(--batch_size, typeint, default8, helpbatch size for training) return parser.parse_args()这里最核心的参数是--train_ps。它表示输入到模型中的补丁大小默认128也就是说模型会从雾图里随机裁剪出128×128的子图参与训练。补丁大小直接决定显存占用、注意力矩阵的计算量还有模型能感知到的上下文范围后面第5章我会专门讲怎么调整它。--pretrain_weights默认是空字符串表示从头开始训练如果指定了My_best_model下面的某个权重文件训练脚本会先加载该权重再继续训练。--data_flag决定了用哪一套数据集划分因为项目里不同数据集对应的预训练权重是分开存放的cifar100的权重就不要用在cifar10的划分上。2.3 训练脚本的调用链从argparse到模型初始化train.py里最关键的逻辑是下面这段流程按常见实现方式还原一下def main(): args parse_args() # 1. 按patch size和data_flag加载数据 train_loader, val_loader build_dataloader( patch_sizeargs.train_ps, data_flagargs.data_flag ) # 2. 初始化模型img_size跟随train_ps model ViTDehaze(img_sizeargs.train_ps) # 3. 如果有预训练权重则加载 if args.pretrain_weights: model.load_state_dict(torch.load(args.pretrain_weights)) # 4. 训练循环 for epoch in range(args.epochs): train_one_epoch(model, train_loader) validate(model, val_loader)这段代码把训练流程理得很清楚先用--train_ps决定输入分辨率然后初始化模型再判断是否加载预训练权重。如果你想验证不同补丁大小的效果只需要改option.py里的--train_ps模型输入尺寸会自动跟着变不需要动模型定义。这里有个细节值得注意ViT跟CNN不同它的位置编码是跟输入分辨率绑定的。如果你把--train_ps从128改成64模型需要重新初始化位置编码不能直接拿128训练好的权重微调否则会报shape不匹配的错误。这是ViT绕不开的约束跟CNN的FC层调整完全是两码事我在第4章会专门讲这个坑的解决办法。3. 训练与推理实操命令行、预训练权重与loss landscape数据3.1 从头训练一条命令跑通使用说明里明确写了训练参数都集中在option.py所以启动训练的命令很简单。假设要在CIFAR-100划分上从头训练python train.py --data_flag cifar100 --train_ps 128 --epochs 200 --batch_size 8这条命令里--data_flag指定数据集划分--train_ps决定补丁大小--epochs是训练轮数--batch_size控制单次前向传播的图片数量。如果你的显存不够优先减小--train_ps而不是--batch_size因为补丁大小影响的是模型输入分辨率对特征质量的影响比batch size更直接。如果你只想验证流程能不能跑通可以临时把--epochs改成5几分钟内就能看到训练日志输出确认数据加载和模型前向都没有报错后再改回完整训练轮数。3.2 用预训练权重继续训练或微调项目里预训练权重按数据集划分存放也就是说CIFAR-10和CIFAR-100各自有独立的权重。继续训练的写法是python train.py --pretrain_weights ./My_best_model/cifar100_vit_ti_9857b21357_x1.pth --data_flag cifar100注意两条约束。第一--data_flag必须跟预训练权重对应比如权重是基于CIFAR-100训练的就不要在CIFAR-10划分上继续训练这个对应关系在说明文档里反复强调过。第二--train_ps最好跟预训练时保持一致因为ViT的位置编码和patch embedding维度在训练时已经固定改了尺寸就加载不上。加载权重失败的报错通常长这样RuntimeError: Error(s) in loading state_dict for ViTDehaze: size mismatch背后就是位置编码或分类头的shape对不上。这种情况不要硬解直接检查--data_flag和--train_ps是否跟预训练配置一致。3.3 loss landscape的CSV文件怎么看zip里最值得研究的是那批loss landscape CSV文件文件名格式很有规律cifar100_vit_ti_9857b21357_x1_losslandscape.csv cifar100_resnet_dnn_50_losslandscape.csv cifar10_alexnet_dnn_corrupted.csv从文件名能直接读出实验信息前半段是数据集cifar100或cifar10中间是模型名vit_ti代表ViT Tinyresnet_dnn_50是ResNet-50alexnet_dnn是AlexNetcorrupted表示数据被噪声或腐蚀扰动过。这类CSV的常规结构是每行记录一组坐标和对应的loss值列名一般是类似x、y、loss的形式。读CSV的代码很简单import pandas as pd df pd.read_csv(cifar100_vit_ti_9857b21357_x1_losslandscape.csv) print(df.columns) print(df.head(3))loss landscape反映的是模型在权重空间某个平面上的损失函数地形。如果等高线图画出来是一片平滑的盆地说明模型优化稳定性好如果出现大量尖峰和断裂说明模型对权重扰动敏感。项目把ViT和CNN的landscape数据放在一起正好可以直接对比两种架构在去雾任务上的优化特性。这里给一个判断技巧看landscape数据时不要只盯着loss均值要关注loss对坐标扰动的敏感度。用最大值和方差来衡量如果ViT的最大loss明显低于ResNet说明ViT的极小值更稳定这在第6章我会展开讲具体做法。4. 避坑指南跑通这个项目时最容易踩的五个坑4.1 显存溢出现象训练刚开始没几步就报CUDA out of memory。原因--train_ps默认是128模型输入是一整张128×128的补丁加上ViT多头注意力模块的中间缓存显存占用比同分辨率CNN高不少。如果显卡显存不到8GB默认配置基本跑不动。解决优先把--train_ps改成64或32同时把--batch_size降到4或2。经验是显存不够时先动补丁大小因为补丁大小每减一半特征图分辨率和注意力矩阵尺寸都跟着降显存收益比减batch size更明显。另外检查一下PyTorch和CUDA版本是否匹配有时候是环境问题放大了显存开销。4.2 预训练权重加载报错现象size mismatch for pos_embedding或者直接报missing keys。原因ViT的位置编码维度跟训练时补丁大小绑定。用--train_ps 128训练好的权重换到--train_ps 64上加载position embedding的序列长度就对不上这是最常见的加载失败原因。解决加载权重前先检查--data_flag和--train_ps是否跟预训练时一致。如果非要用不同补丁大小需要写插值逻辑把位置编码缩放成目标长度import torch.nn.functional as F pos_embed model.pos_embed # 原始形状 [1, N, C] new_pos_embed F.interpolate( pos_embed.permute(0, 2, 1).unsqueeze(0), size(new_seq_len,), modebilinear ).squeeze(0).permute(0, 2, 1)注意这段插值只是应急方案。对于图像去雾任务我更建议按原训练配置走不要为了省显存改补丁大小导致预训练权重失效那样反而浪费时间。4.3 训练loss不下降现象训练到第20轮loss还在高位徘徊没有明显下行趋势。原因大多数情况是学习率设置过大或过小。ViT的优化对学习率比较敏感很多人把CNN的训练习惯直接搬过来不设warmup也不按ViT的常用区间去配学习率很容易翻车。解决把线性warmup加上前5轮从0线性升温到目标学习率观察loss是否开始下降。如果还是不动把学习率降一个数量级再跑10轮。去雾任务里ViT的适用学习率区间一般是1e-4到3e-4配合AdamW的weight_decay设0.05收敛会更稳定。4.4 训练集和测试集PSNR差距过大现象训练集PSNR已经到32dB测试集只有24dB差距明显不合理。原因最常见的是数据集划分没对齐。这个项目的预训练权重和数据集标记是绑定的如果你用了--data_flag cifar100训练却在CIFAR-10的数据上测试指标自然对不上。另一个原因是测试时用了随机裁剪的补丁而不是整图推理补丁边缘的padding会压低PSNR。解决训练、验证、测试全程保持同一个--data_flag。测试时按原图直接推理不要用训练阶段的随机裁剪逻辑这样可以排除边缘效应对指标的影响。4.5 loss landscape数据画出来有大量毛刺现象用CSV画等高线图发现图上到处是尖刺平滑区域很少。原因CSV记录的是不同扰动方向上的loss采样点如果直接按普通散点图绘制没有做网格化或插值平滑就会显得很毛躁。这不是数据质量问题是可视化方式不对。解决用contourf配合griddata做插值先把(x, y)坐标网格化再把loss映射到网格最后画等高线。这样出来的图才符合论文里loss landscape的形态也便于和项目里的其他模型数据放在一起对比。5. 参数调优补丁大小、学习率和数据集划分怎么组合5.1 补丁大小128、64、32的真实差异这个项目的--train_ps默认是128但实际工程里不是越大越好。补丁大小决定了模型每次能看到的图像范围。对去雾任务来说雾的分布是全局性的补丁太小会丢失上下文信息导致去雾不彻底补丁太大则显存压力大训练速度慢。我一般会在三个档位做对比补丁大小显存占用训练速度去雾效果128高慢细节保留好适合最终模型64中中效果可接受适合快速调参32低快全局信息不足效果明显下降如果只想验证代码流程能不能跑通用32就够想得到能落地的指标老老实实用128训练。我踩过的坑是中途从64切到128结果预训练权重的位置编码直接报错所以补丁大小最好在第一次训练前就定下来后续不再改动。5.2 学习率与warmup的配合策略ViT家族模型相对CNN来说对学习率更敏感。我在这个项目上习惯用余弦退火加线性warmupoptimizer torch.optim.AdamW(model.parameters(), lr2e-4, weight_decay0.05) def lr_lambda(epoch): if epoch warmup_epochs: return (epoch 1) / warmup_epochs else: progress (epoch - warmup_epochs) / (total_epochs - warmup_epochs) return 0.5 * (1 math.cos(math.pi * progress))这里warmup_epochs一般设5total_epochs设200。AdamW的weight_decay设0.05是比较稳妥的选择对ViT的收敛稳定性和最终指标都有帮助。如果换成SGD学习率要对应调低到1e-3以下否则loss容易发散。实操验证方法每5轮打印一次loss前20轮正常情况下应该平滑下降。如果出现振荡先把学习率除以10如果下降太慢把warmup加长到10轮。不要同时调多个超参数一次只动一个变量不然出了问题很难定位。5.3 数据集划分与预训练权重的对应关系说明文档里标注过My_best_model文件夹下的权重是按数据集划分分别存放的。cifar100的权重不要用在cifar10的实验中否则跨数据域的分布差异会让迁移效果很差PSNR掉2到3个点是常见现象。建议把数据集和权重的关系整理成一张对照表data_flag预训练权重文件适用场景cifar100cifar100_vit_ti_9857b21357_x1.pthViT基线训练与评估cifar100cifar100_resnet_dnn_50_losslandscape.csvCNN基线对比分析cifar10cifar10_alexnet_dnn_corrupted.csv噪声扰动下的鲁棒性测试这个对应关系不需要额外维护源码包里已经用文件名区分了你只需要在训练命令里把--data_flag和--pretrain_weights对齐即可。如果以后自己训练了新权重命名也建议保持相同规律方便后续实验管理和结果对比。6. 用loss landscape CSV快速判断模型稳定性的一招loss landscape这组CSV在项目里看起来像副产品但对做模型的人来说它是评估ViT和CNN差异的最好入口。我的用法是每次训练结束从loss_landscape目录里挑出对应模型的CSV写一段脚本把数据投影到二维平面算出几个比较直观的稳定性指标。具体做法是把相同数据集下ResNet和ViT的CSV都读出来用网格插值后分别计算loss的均值、最大值和方差import pandas as pd import numpy as np from scipy.interpolate import griddata def landscape_stats(csv_path): df pd.read_csv(csv_path) x df[x].values y df[y].values z df[loss].values return np.mean(z), np.max(z), np.std(z) for model in [cifar100_vit_ti_9857b21357_x1_losslandscape.csv, cifar100_resnet_dnn_50_losslandscape.csv]: mean, max_z, std landscape_stats(model) print(f{model}: mean{mean:.3f}, max{max_z:.3f}, std{std:.3f})三个指标各有用途std代表loss对权重扰动的波动程度std越小说明优化路径越平坦max代表最坏情况下的损失max过大说明模型在某些方向上很脆弱遇到数据扰动容易崩mean是整体水平用来跟训练曲线对上。在我跑过的数据里ViT的std通常比ResNet低一截这说明ViT的优化盆地更宽对应去雾效果在测试集上更稳定不容易因为权重微调出现大的指标波动。我现在的习惯是每次模型迭代完必做两个动作第一用loss landscape CSV算出std和max如果比上一版高就直接回退第二把CSV画成等高线图确认没有明显的尖峰区域。从那以后我再也不单靠训练曲线判断模型好坏而是用这组数值说话。希望这个习惯能帮到你少走一点我当初的弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

GPT-6与Opus 5.5双模型调用:用AI网关统一协议、路由与成本 2026/10/2 3:33:22

GPT-6与Opus 5.5双模型调用:用AI网关统一协议、路由与成本

1. 两个新模型同时上线,为什么“调用方式”反而成了最该先想清楚的事GPT-6 价格腰斩、Opus 5.5 上线,这两件事凑在一起,最直接的结果不是“哪个模型更强”的争论,而是一个很现实的问题:同一套业务代码,怎么…

阅读更多 →
Qwen-Image-2.1信息图提示词实战:学术海报、科普卡与时间轴模板 2026/10/2 3:33:09

Qwen-Image-2.1信息图提示词实战:学术海报、科普卡与时间轴模板

1. 为什么信息图提示词值得单独拎出来讲做视觉内容的人都有一个共识:信息图是文生图模型最难啃的骨头之一。原因不复杂——普通插画只要“好看”就行,而信息图要同时满足三个硬指标:信息层级清晰、版式结构合理、视觉风格统一。这三个指标里任…

阅读更多 →
零代码搭建AI-Agent实战:从入门到可复用方法论 2026/10/2 3:33:09

零代码搭建AI-Agent实战:从入门到可复用方法论

1. 为什么“零代码”是AI-Agent落地的第一道门槛1.1 从“写代码”到“搭积木”的思维转变很多人第一次听到“AI-Agent”这个词,脑子里浮现的是一堆Python脚本、API调用、向量数据库和复杂的编排逻辑。这种印象没错,但那是“开发视角”的Agent。如果你不是…

阅读更多 →
YOLO闭眼疲劳检测:4类细粒度标注与双任务联合建模实战 2026/10/2 3:33:09

YOLO闭眼疲劳检测:4类细粒度标注与双任务联合建模实战

简介:本资源是面向计算机视觉初学者与YOLO系列算法实践者的闭眼疲劳检测专用数据集,专为驾驶员状态识别、智能座舱监控等实际场景设计,支持从YOLOv5到YOLOv11全版本模型训练与验证。数据集共5163张高质量图像,已按标准划分并附带完…

阅读更多 →
基于Python的B站数据分析可视化系统设计与实现 2026/10/2 3:33:09

基于Python的B站数据分析可视化系统设计与实现

去年年底一个做自媒体的朋友找我诉苦,说他在B站发了小半年视频,后台看了无数遍,除了播放量涨涨跌跌,根本不知道问题出在哪。我随口问了句"你分析过竞品分区和发布时间的影响吗",他愣了半天。这个场景我印象很…

阅读更多 →
OfficeCLI morph-ppt 风格索引实战:52 套视觉风格的查表选型与落地指南 2026/10/2 3:33:09

OfficeCLI morph-ppt 风格索引实战:52 套视觉风格的查表选型与落地指南

CLIAI 应用MCP 服务 【免费下载链接】OfficeCLI OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-source, single binary, no Office installation required. 项目地址…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉