如何使用自有数据集在GitHub开源VQA模型上完成训练与测试
vqa-mcb仓库环境配置、自有数据集训练及模型调用操作指引
Prerequisites章节落地操作
这个仓库是2016年的老项目,别用最新版依赖硬套,按下面的顺序对齐就行:
- 系统与GPU依赖:必须匹配CUDA 7.5、cuDNN v5版本,高版本CUDA会直接导致子目录里的定制Caffe编译失败,GPU驱动版本选对应支持CUDA7.5的即可,不用追新。
- Python环境:单独建Python2.7的虚拟环境,别用Python3,项目没有做Python3适配。依赖的numpy、scipy、scikit-image、h5py、nltk全装对应Python2.7的稳定版,别装最新迭代的版本,避免接口不兼容。
- 框架依赖:不要用官方源的Caffe,直接编译仓库内
caffe/子目录下的定制修改版Caffe,编译前修改Makefile.config里的CUDA本地路径、Python路径,按常规Caffe编译步骤执行make all -j8、make pycaffe就行,编译完跑下Caffe自带的测试样例确认编译成功。 - 前置资源:先把官方要求的预训练词向量、VQA基准数据集、预训练模型权重按README指定的目录结构放好,先跑通官方提供的默认训练、测试脚本,确认整个环境跑通没有报错,再开始换自有数据集,别一开始就改数据,出了问题找不到原因。
自有数据集训练、测试适配步骤
- 数据格式转换:所有数据对齐官方VQA的格式规范
- 问题数据存为JSON结构,每条样本必须包含
question_id(全局唯一数字ID)、image_id(和图像特征一一对应的ID)、question(原始问题文本)三个字段 - 答案标注存为JSON结构,每条样本对应
question_id、image_id字段,答案部分如果要对齐官方评估逻辑最好每条问题配10条独立人工标注答案,单答案也可以跑,只是评估指标计算会和官方结果有差异 - 图像不要直接喂原始图,用仓库自带的特征提取脚本,把自有数据集的所有图像抽成和官方输入一致维度的fc7特征,存为h5格式
- 问题数据存为JSON结构,每条样本必须包含
- 配置修改:找到项目里的数据加载配置项,把默认的官方数据集路径、特征路径全部替换成你处理好的自有数据路径;如果你的数据集答案类别和官方VQA的1000类答案不一致,重新生成答案到数字ID的映射字典,替换掉原项目里的映射文件。
- 训练和测试:直接执行根目录下的训练脚本
python train.py就行,要改batch size、学习率、训练轮次这些超参直接改脚本开头的参数定义,不用动核心模型逻辑;测试执行python test.py,预测结果会自动输出到你指定的结果目录。
自有代码调用训练好模型的方法
- 先把你训练完成生成的
.caffemodel权重文件、推理用的deploy网络结构prototxt文件的本地路径记好。 - 自己的代码里先把项目内编译好的Caffe Python接口路径加到系统路径里,避免导包失败:
import sys sys.path.append('/your/local/path/to/vqa-mcb/caffe/python') import caffe
- 加载模型时固定使用测试模式,不要开训练模式:
net = caffe.Net('/your/local/path/to/deploy.prototxt', '/your/local/path/to/trained_model.caffemodel', caffe.TEST) - 推理时严格对齐训练阶段的预处理逻辑:问题文本转成固定长度的词索引序列,图像用提前提取好的对应特征,分别传入网络对应的输入blob,调用
net.forward()拿到分类输出的logits,取概率最大的类别ID,再通过之前生成的ID到答案的映射字典转成自然语言答案即可。
内容的提问来源于stack exchange,提问作者Lucy Cai
相关产品推荐
相关产品推荐

