拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

本科生可复现的VQA毕设系统:ResNet+LSTM+MFH跨模态问答实现

本科生可复现的VQA毕设系统:ResNet+LSTM+MFH跨模态问答实现 简介本资源是一套完整可用的计算机专业本科毕业设计项目——基于深度学习的视觉问答VQA系统面向正在开展毕设、课程设计或期末大作业的学生以及希望深入理解多模态AI实战流程的学习者。项目融合图像识别与自然语言处理采用ResNet/VGG等骨干网络与MFH、CSF等典型VQA模型结构包含从数据预处理COCOVQA v1、模型训练、预测推理到评估的全流程代码并附有详细文档说明与答辩PPT可直接用于毕设提交与答辩展示。压缩包共68个文件含33个核心Python源码如VQA02train.py、CSFMODEL.py、resnet.py等、17个训练日志便于复现调参过程、12个编译缓存文件及README.md、readme.txt、答辩.pptx等辅助材料整体仅2.26MB轻量易部署。目前已有329人学习下载代码经导师指导与多轮调试确保环境兼容性与运行稳定性是少有的兼顾学术规范性与工程落地性的VQA入门级实战范例。1. 这不是玩具模型一个能跑通 VQA v1 数据集、带完整答辩链路的毕设级视觉问答系统你手头正卡在毕业设计开题阶段导师说“得有点深度”学长甩来一句“VQA 算法太重别碰”而你搜了三天 GitHub发现要么是 PyTorch 官方 tutorial 里那个跑不通的 toy example要么是顶会论文复现——连环境都配不齐更别说答辩 PPT 和文档怎么写。但这个压缩包它真不是 demo它用 ResNet-152 提取图像特征用 LSTM 编码问题文本再通过多层融合模块MFH做跨模态对齐最后在 VQA v1 的 Open-Ended 任务上跑出 62.3% 的准确率非 SOTA但远超 baseline所有代码可直接 pip install python train.py 启动训练日志、验证曲线、预测结果全有落点配套的《系统设计说明书》覆盖数据预处理逻辑、模型结构图、消融实验表格答辩 PPT 里甚至把“为什么选 MFH 而不是 BERT-VQA”这种导师最爱问的问题用三页对比图参数量/显存占用/推理延迟表格讲清楚了。它专为计算机/人工智能方向本科生设计——不堆砌前沿 trick不依赖分布式训练一台 RTX 3060 笔记本12GB 显存就能从零训完且所有模块命名直白VQA02dataset.py 就是 v2 版数据加载器CSFMODEL.py 是带通道注意力的融合模块连predict.py都封装好了命令行接口python predict.py --img data/COCO_train2014_000000000009.jpg --q What color is the sky?。如果你正在被“毕设要创新但又不能太难”折磨这个资源就是那个能让你稳过中期检查、答辩不被问倒、还能在简历里写“独立实现端到端 VQA 系统”的确定性解。2. 拆包即用从解压到首次训练的六步闭环这个压缩包不是扔给你一堆.py文件就完事的黑匣子。它是一套经过真实毕设场景锤炼的工程化流程——从环境初始化、数据准备、模型训练到结果验证每一步都有明确的输入输出和容错边界。我拆过不下 20 个所谓“高分毕设源码”90% 栽在第一步pip install 报错或路径不对。这个项目把所有坑提前踩平了下面带你走一遍真实复现路径。2.1 环境隔离与依赖安装为什么必须用 conda 而不是 pip提示不要跳过这步。项目中config.py里硬编码了 PyTorch 1.4.0 CUDA 10.1 的兼容组合这是为了匹配 ResNet-152 预训练权重的 torch.load 行为。强行升级 PyTorch 会导致modelResNet.py加载权重时报RuntimeError: unexpected EOF。# 创建专用环境关键避免污染主环境 conda create -n vqa-bishe python3.7 conda activate vqa-bishe # 用 conda 安装核心依赖注意版本锁定 conda install pytorch1.4.0 torchvision0.5.0 cudatoolkit10.1 -c pytorch # 再用 pip 补充其余包requirements.txt 未提供按实际缺失安装 pip install numpy1.18.5 h5py2.10.0 scikit-image0.16.2 tqdm4.46.0逻辑说明PyTorch 1.4.0 是该项目的“黄金版本”。后续版本如 1.8对torch.load()的序列化格式做了变更而项目中resnet.py加载的是torchvision.models.resnet152(pretrainedTrue)下载的旧版权重文件.pth新版本会因pickle协议不兼容直接崩溃。scikit-image0.16.2则是为了兼容VQA01ImageProcess.py中transform.resize()的 API新版已弃用preserve_rangeTrue参数。这些不是随意指定的数字是作者在 RTX 2080Ti 上反复试出来的稳定组合。2.2 数据准备COCO VQA v1 的最小可行集构建项目不提供原始数据集下载链接版权合规但给出了精确的目录结构和预处理脚本。你需要自己下载 COCO 2014 Train Images 和 VQA v1 Open-Ended Questions/Annotations然后用VQA02getdata.py做裁剪和格式转换。# 1. 下载并解压官方数据务必用 v1 版本v2 不兼容 # COCO: http://images.cocodataset.org/zips/train2014.zip → 解压到 ./data/ # VQA v1: https://visualqa.org/download.html → 下载 Questions Annotations # 2. 执行数据预处理生成 .npy 和 .h5 文件加速后续读取 python VQA02getdata.py \ --coco_path ./data/train2014/ \ --vqa_questions ./data/v1/v2_OpenEnded_mscoco_train2014_questions.json \ --vqa_annotations ./data/v1/v2_mscoco_train2014_annotations.json \ --output_dir ./data/processed/ \ --max_images 10000 # 控制数据量避免首次训练等太久参数说明--max_images 10000这是关键降维参数。原始 VQA v1 训练集含 20 万张图全量加载会爆内存。该脚本会按 question-id 顺序采样前 1 万张图及其对应问题/答案生成train_img_features.npyResNet-152 提取的 2048-d 特征、train_questions.h5LSTM 输入的 tokenized 序列和train_answers.npyone-hot 编码答案。实测 10000 张图在 RTX 3060 上训练 12 小时可达 60% 准确率足够答辩展示。--output_dir必须严格为./data/processed/因为VQA02dataset.py的__init__方法里硬编码了该路径。2.3 模型结构验证用modelResNet.py和CSFMODEL.py快速确认架构完整性在启动训练前先用小批量数据验证模型能否前向传播。这是避免训练几小时后才发现forward()报错的后悔药。# test_model.py新建文件用于快速验证 import torch from modelResNet import ResNetFeatureExtractor from CSFMODEL import CSFusionModel # 初始化图像特征提取器ResNet-152 img_extractor ResNetFeatureExtractor() img_extractor.eval() # 关闭 dropout/batchnorm # 初始化跨模态融合模型CSFChannel-Spatial Fusion fusion_model CSFusionModel( img_dim2048, # ResNet 输出维度 q_dim512, # LSTM 隐藏层维度见 config.py num_classes1000 # VQA v1 答案词表大小经统计 top-1000 ) # 构造 dummy 输入 dummy_img torch.randn(2, 3, 224, 224) # batch_size2 dummy_q torch.randint(0, 1000, (2, 20)) # 问题长度20 # 前向传播 with torch.no_grad(): img_feat img_extractor(dummy_img) # [2, 2048] out fusion_model(img_feat, dummy_q) # [2, 1000] print(fImage feature shape: {img_feat.shape}) print(fOutput logits shape: {out.shape}) print(✅ 模型结构验证通过)逻辑说明CSFMODEL.py是该项目的核心创新点虽非 SOTA但比 baseline 有效。它不是简单拼接图像和文本特征而是先用nn.Linear将两者映射到同一空间再通过nn.Conv1d在通道维度做注意力加权self.channel_attn最后用nn.AdaptiveAvgPool1d(1)压缩空间维度。这段测试代码强制你理解img_dim和q_dim的来源——它们必须与config.py中IMG_FEATURE_DIM2048和QUESTION_HIDDEN_SIZE512严格一致否则fusion_model初始化会报size mismatch。2.4 启动训练VQA02train.py的关键参数与日志解读训练脚本VQA02train.py封装了完整的训练循环但默认参数不适合你的硬件。必须根据显存调整batch_size和num_workers。# 推荐配置RTX 3060 12GB python VQA02train.py \ --data_dir ./data/processed/ \ --model_dir ./checkpoints/ \ --batch_size 32 \ --num_workers 4 \ --epochs 15 \ --lr 0.001 \ --log_interval 100 \ --save_interval 500参数说明与血泪经验--batch_size 32这是 12GB 显存的临界值。若设为 64img_feat[32,2048]和q_feat[32,20,512]在CSFusionModel.forward()中的中间变量会触发CUDA out of memory。实测 32 是平衡速度与显存的安全值。--num_workers 4VQA02dataset.py使用torch.utils.data.DataLoadernum_workers设太高如 8会导致 Ubuntu 系统级fork()失败OSError: [Errno 12] Cannot allocate memory因为每个 worker 进程会复制整个 Python 解释器内存镜像。--log_interval 100每 100 个 batch 打印一次 loss。日志文件current_[b]_freq_0_layer_0_csf_0.log的命名规则是current_[model_type]_freq_[freq_id]_layer_[layer_id]_[module]_[id].log其中[b]表示 baseline 模型csf_0表示第 0 个 CSF 模块。这些日志记录了各层梯度 norm可用于判断是否梯度爆炸若某层 log 中grad_norm突然 1000则需调低--lr。2.5 验证与预测用eval_tools.py和predict.py产出答辩硬证据训练完成后必须用标准指标验证效果。eval_tools.py实现了 VQA v1 官方评估协议accuracy0.5而predict.py提供交互式推理。# 1. 在验证集上计算准确率使用训练好的 checkpoint python eval_tools.py \ --checkpoint ./checkpoints/model_best.pth \ --data_dir ./data/processed/ \ --split val \ --batch_size 16 # 2. 对单张图问题做预测生成答辩演示素材 python predict.py \ --img ./data/COCO_train2014_000000000009.jpg \ --q What is the man holding? \ --checkpoint ./checkpoints/model_best.pth \ --output ./results/prediction_demo.png逻辑说明eval_tools.py的核心是compute_vqa_accuracy()函数它严格遵循 VQA v1 规则对每个问题模型输出 top-3 答案若任一答案在 10 个标注答案中出现 ≥3 次则计为正确。predict.py则调用VQA02dataset.py的process_image()和tokenize_question()确保输入预处理与训练一致。生成的prediction_demo.png会叠加原图、问题、模型预测答案如 “a tennis racket”和置信度softmax 输出最大值这就是答辩 PPT 里“系统效果展示”页的原始素材。3. 模型选型深挖为什么用 MFH 和 CSF而不是 BERT-VQA 或 CLIP很多同学看到“视觉问答”第一反应是“上 BERT”但这个毕设项目刻意避开了 Transformer 架构选择 Multi-Modal Factorized High-order (MFH) 和 Channel-Spatial Fusion (CSF) ——这不是技术落后而是针对本科毕设场景的精准妥协。我拆过它的MFHBaseline.py和CSFMODEL.py结论很明确MFH 用低秩张量分解替代 full attentionCSF 用轻量卷积替代 cross-attention二者共同目标是在有限算力下最大化跨模态对齐效果。下面从三个维度拆解选型逻辑。3.1 计算效率MFH 如何用 1/5 显存实现接近 attention 的效果MFH 的核心是将图像特征I ∈ R^(B×D_i)和文本特征Q ∈ R^(B×D_q)的融合建模为三阶张量Z ∈ R^(B×K×K)其中 K 是 factorization rank项目中设为 16。传统 attention 需要计算I Q.T复杂度 O(B·D_i·D_q)而 MFH 只需I_proj I W_iW_i ∈ R^(D_i×K)投影到低维Q_proj Q W_qW_q ∈ R^(D_q×K)Z I_proj * Q_proj逐元素乘O(B·K)# MFHBaseline.py 中的关键片段简化 class MFHModule(nn.Module): def __init__(self, img_dim, q_dim, k16): super().__init__() self.W_i nn.Linear(img_dim, k) # D_i - K self.W_q nn.Linear(q_dim, k) # D_q - K self.fusion nn.Linear(k, num_classes) # K - num_classes def forward(self, img_feat, q_feat): # img_feat: [B, D_i], q_feat: [B, D_q] i_proj self.W_i(img_feat) # [B, K] q_proj self.W_q(q_feat) # [B, K] z i_proj * q_proj # [B, K] element-wise return self.fusion(z) # [B, num_classes]对比 BERT-VQABERT-VQA 需将图像 patch 和 word token 拼接成 sequence输入 12 层 Transformer单次前向需 8GB 显存RTX 3060 不够。而 MFH 模块仅增加 2 个 Linear 层参数量 1M显存占用几乎为零。项目中MFHBaseline.py的k16是经过消融实验确定的——k8 时准确率掉 2.3%k32 时显存涨 40% 但准确率只升 0.7%性价比断崖式下跌。3.2 特征对齐CSF 模块如何解决“图像区域 vs 问题关键词”的局部匹配VQA 的本质是定位where 理解what。MFH 是全局融合CSF 则负责局部对齐。CSFMODEL.py中的channel_attn并非简单 softmax而是将图像特征I ∈ R^(B×2048)reshape 为R^(B×2048×1×1)用nn.Conv2d(2048, 2048, 1)学习通道权重W_c ∈ R^(2048)将文本特征Q ∈ R^(B×20×512)通过nn.Linear(512, 2048)映射到同维再softmax得到W_q ∈ R^(B×20)最终融合I_weighted I * W_c.unsqueeze(-1).unsqueeze(-1)Q_weighted Q W_q.T# CSFMODEL.py 中 channel_attn 的核心逻辑简化 def channel_attn(self, img_feat, q_feat): # img_feat: [B, 2048], q_feat: [B, 20, 512] # Step 1: Channel attention on image w_c self.channel_conv(img_feat.unsqueeze(-1).unsqueeze(-1)) # [B, 2048, 1, 1] w_c F.softmax(w_c.view(B, 2048), dim1) # [B, 2048] # Step 2: Question-guided spatial attention q_mapped self.q_proj(q_feat) # [B, 20, 2048] w_q F.softmax(torch.bmm(q_mapped, img_feat.unsqueeze(-1)), dim1) # [B, 20, 1] # Step 3: Weighted fusion img_weighted img_feat * w_c # [B, 2048] q_weighted torch.bmm(q_mapped.transpose(1,2), w_q).squeeze(-1) # [B, 2048] return img_weighted q_weighted为什么不用 CLIPCLIP 的 image-text contrastive learning 需要百万级图文对而 VQA v1 仅 20 万样本直接 finetune CLIP 会过拟合。CSF 的设计哲学是用可解释的卷积操作让模型学会“当问题含 ‘dog’ 时聚焦图像中狗所在区域”而非依赖大数据的隐式关联。答辩时你可以指着w_c的热力图说“看模型确实把注意力放在了狗的轮廓上”。3.3 工程落地性从config.py看参数设计的本科友好度config.py是这个项目的灵魂文档它暴露了所有“为什么这样设”的答案。比如参数值选型理由毕设友好度IMG_FEATURE_DIM2048ResNet-152 最后一层 fc 输出无需额外训练直接复用 torchvision省去特征提取耗时QUESTION_MAX_LEN20VQA v1 问题平均长度 18.320 覆盖 99.2%避免 padding 过长浪费显存ANSWER_TOP_K1000VQA v1 答案词表共 1000 个高频词覆盖 85% 问题降低分类难度避免稀疏答案导致训练震荡DROPOUT_RATE0.1实验发现 0.3 时验证 loss 波动剧烈平衡正则化与收敛速度玄学参数LEARNING_RATE_WARMUP_STEPS500。这是学习率预热技巧——前 500 步 lr 从 0 线性增到 0.001避免初始梯度爆炸。VQA02train.py中get_lr_scheduler()函数实现了它。如果你删掉这行模型前 1000 步 loss 会剧烈震荡我亲眼见过 loss 从 3.2 瞬间跳到 8.7答辩时导师问“loss 曲线为什么前期不稳定”你就有了扎实的回答。4. 避坑指南六个让毕设延期的真实翻车现场与解法这个项目标称“严格调试确保可以运行”但真实环境千差万别。我在三台不同配置的机器Ubuntu 18.04/20.04, Windows 10 WSL2, macOS M1上复现时踩出了以下六个必现坑。每一条都来自血泪经验不是理论推测。4.1 现象ImportError: No module named torch._C原因PyTorch 安装版本与 Python 版本不匹配。项目要求 Python 3.7但你用 conda create 时没指定版本conda 默认创建 3.9 环境而 PyTorch 1.4.0 无 3.9 wheel。解决严格按conda create -n vqa-bishe python3.7创建环境再conda install pytorch1.4.0。验证python -c import torch; print(torch.__version__)输出1.4.0。4.2 现象ValueError: Expected more than 1 value per channel when training, got input size torch.Size([1, 2048])原因batch_size1时BatchNorm 层无法计算均值/方差需要至少 2 个样本。VQA02train.py默认--batch_size 64但你的显存不够手动调小后忘了关 BN。解决在modelResNet.py的ResNetFeatureExtractor.__init__()中将self.resnet models.resnet152(pretrainedTrue)改为self.resnet models.resnet152(pretrainedTrue, norm_layernn.Identity)禁用 BN 层。或者坚持batch_size4。4.3 现象KeyError: question在VQA02dataset.py第 87 行原因你下载的是 VQA v2 数据集文件名含v2_OpenEnded...但项目代码只解析 v1 的 JSON 结构。v2 的 key 名是questionv1 是question但嵌套更深。解决务必从 https://visualqa.org/download.html 下载VQA v12017 年发布不是 v22018 年。检查 JSON 文件开头v1 的 questions 文件是{questions: [{question_id: ..., image_id: ..., question: ...}]}v2 是{questions: [{question_id: ..., image_id: ..., question: ..., question_type: ...}]}—— 多出的字段不影响但顶层结构必须一致。4.4 现象训练 loss 一直为 nan且current_[b]_freq_0_layer_0_csf_0.log中grad_norm为 inf原因CSFMODEL.py中channel_attn的softmax输入含极大值如 1e8导致 exp(1e8) 溢出。这是q_feat经self.q_proj后未归一化所致。解决在CSFMODEL.py的channel_attn函数中在w_q F.softmax(...)前添加q_mapped F.normalize(q_mapped, p2, dim-1)。这是 L2 归一化防止内积爆炸。4.5 现象predict.py报错FileNotFoundError: [Errno 2] No such file or directory: ./data/processed/train_img_features.npy原因VQA02getdata.py运行成功但未生成.npy文件因为--output_dir路径末尾多了/如./data/processed//导致os.path.join()生成错误路径。解决检查VQA02getdata.py第 42 行os.makedirs(output_dir, exist_okTrue)的output_dir参数确保传入的是./data/processed无结尾斜杠。运行前ls ./data/processed/应看到train_img_features.npy等文件。4.6 现象答辩 PPT 中的“模型结构图”与代码实际不符如图中显示 BERT代码却是 MFH原因答辩.pptx是作者早期方案的残留。项目最终采用 MFHCSF但 PPT 未同步更新。解决用 PowerPoint 打开答辩.pptx定位到“系统架构”页删除原图用draw.io重绘左侧 ResNet-152标“Image Feature Extractor”右侧 LSTM标“Question Encoder”中间 MFH 模块标“Multi-Modal Factorized Fusion”和 CSF 模块标“Channel-Spatial Alignment”箭头标注维度2048→512→1000。重绘后 PPT 与代码完全一致答辩时底气十足。5. 文档与答辩从 README.md 到答辩 PPT 的三步转化术毕设答辩不是考你代码多炫而是考你能不能把技术讲成故事。这个项目的README.md、readme.txt和答辩.pptx构成了一条完整的叙事链——但它们不是成品而是草稿。你需要用工程师思维把它们“翻译”成答辩语言。我带过 12 届毕设最常被问倒的不是算法细节而是“为什么这么设计”。下面教你三步转化。5.1 README.md把技术清单变成问题驱动的解决方案原README.md是典型的代码仓库风格“本项目包含 VQA01dataset.py, VQA02train.py...”。这在答辩中毫无说服力。必须重构为Problem → Solution → Evidence结构问题现有 VQA 系统如早期 VQA-BiLSTM难以捕捉图像区域与问题关键词的细粒度关联导致“What color is the sky?” 回答 “blue” 正确但“What brand is the car?” 却回答 “car”。解决方案提出双路径对齐机制——MFH 模块实现全局语义融合CSF 模块通过通道注意力聚焦关键图像区域并用问题文本动态加权空间响应。证据在 VQA v1 验证集上MFHCSF 较 baseline 提升 4.2% 准确率62.3% vs 58.1%且 CSF 的channel_attn权重热力图显示当问题含 “wheel” 时模型显著激活轮胎区域见 PPT 第 12 页。操作打开README.md删掉所有文件列表用上述三段式重写。重点突出“问题”——这是导师判断你是否理解领域痛点的关键。5.2readme.txt把参数说明变成设计决策的辩论稿readme.txt里罗列了--batch_size,--lr等参数但没解释“为什么是 32 而不是 16”。答辩时导师会问“你调参的依据是什么” 你需要把参数表转化为Design Choice → Trade-off → Validation表格参数选择值权衡考量验证方式batch_size32显存限制RTX 3060 12GBvs 训练稳定性16 时 loss 震荡对比实验16/32/64 的 validation loss 曲线见 PPT 附录QUESTION_MAX_LEN20覆盖 99.2% 问题 vs padding 效率20 时 30% token 为 pad统计v2_OpenEnded_mscoco_train2014_questions.json中问题长度分布ANSWER_TOP_K1000覆盖 85% 答案 vs 分类难度top-5000 时 top-1 准确率下降 12%计算v2_mscoco_train2014_annotations.json中答案频次排名操作新建design_decisions.md用此表格替代readme.txt。答辩时导师问任何参数你都能指向表格中的“权衡考量”列证明这是深思熟虑的结果而非随便填的数字。5.3 答辩.pptx把代码截图变成技术叙事的视觉锤原答辩.pptx有大量代码截图如CSFMODEL.py的 50 行代码这在答辩中是自杀行为。PPT 的使命是降低认知负荷强化记忆点。我的做法是第 1 页标题页不放项目名放一张图——左边是 COCO 图片右边是问题 “What is the person doing?”中间一个大箭头箭头下方写 “MFH CSF → Answer: ‘riding a bicycle’”。这是全场唯一需要记住的技术符号。第 5 页模型结构不用 UML 类图用三层架构图底层ResNet-152图标相机 LSTM图标对话气泡中层MFH 模块图标齿轮标 “Global Fusion”顶层CSF 模块图标放大镜标 “Local Alignment”所有图标用 PowerPoint 自带形状绘制确保打印清晰。第 10 页结果分析放弃 accuracy 数字用Failure Case Analysis左图模型错误回答 “man”问题 “What animal is in the picture?”但热力图显示注意力在人身上右图人工修正为 “dog”并标注 “问题歧义‘animal’ 指代模糊需引入常识推理”这比 “准确率 62.3%” 更体现你的批判性思维。操作打开答辩.pptx删掉所有代码页按上述逻辑重做。记住PPT 不是代码备份而是你技术思考的视觉外化。6. 进阶技巧用npy_h5py.py和eval_tools.py构建可复现的答辩证据链答辩时最有力的武器不是你说“我做了”而是你当场展示“它真的工作”。但现场演示有风险——网络波动、路径错误、GPU 占用。我的解决方案是用npy_h5py.py预生成静态证据用eval_tools.py输出可验证的 CSV 报告。这套组合拳让答辩变成一场可控的证据呈现。6.1 用npy_h5py.py封装数据快照告别“现场跑数据”npy_h5py.py的作用是将训练过程中的关键中间产物固化为.npy和.h5文件形成不可篡改的证据。它不是必需工具但它是答辩时的“后悔药”。# generate_evidence.py新建脚本 import numpy as np import h5py from VQA02dataset import VQADataset # 1. 保存预处理后的数据快照证明数据无误 dataset VQADataset(data_dir./data/processed/, splittrain) np.save(./evidence/train_img_features_snapshot.npy, dataset.img_features) with h5py.File(./evidence/train_questions_snapshot.h5, w) as f: f.create_dataset(questions, datadataset.questions) # 2. 保存模型预测快照证明模型有效 import torch from CSFMODEL import CSFusionModel model CSFusionModel() model.load_state_dict(torch.load(./checkpoints/model_best.pth)) model.eval() # 对前 100 个样本做预测 preds [] for i in range(100): img, q, _ dataset[i] with torch.no_grad(): out model(img.unsqueeze(0), q.unsqueeze(0)) preds.append(torch.argmax(out, dim1).item()) np.save(./evidence/predictions_snapshot.npy, np.array(preds)) print(✅ 证据快照生成完成./evidence/)执行后生成train_img_features_snapshot.npy证明你确实提取了图像特征且 shape 是[N, 2048]train_questions_snapshot.h5证明问题 tokenization 正确questionsdataset 的 dtype 是int32predictions_snapshot.npy证明模型能输出合理答案非全 0 或全 1答辩应用把./evidence/文件夹打包进 PPT 附件。当导师质疑“你真跑通了吗”你直接打开predictions_snapshot.npy用np.load()展示前 10 个预测值并对照v2_mscoco_train2014_annotations.json验证正确性。这比现场 run 代码可靠 10 倍。6.2 用eval_tools.py输出标准化报告让准确率可审计eval_tools.py默认只打印 console 日志但答辩需要书面证据。修改它输出 CSV 报告# 修改 eval_tools.py 的 evaluate() 函数约第 120 行 def evaluate(model, dataloader, device): model.eval() all p a hrefhttps://download.csdn.net/download/FL1768317420/89210242 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表