《Stacked Attention Networks for Image Question Answering》论文解读与实验

这是去年10月份,自己看的第一篇关于VQA的论文,由于课程内容需要,对论文内容理解得还算深入,并在github上找了一些代码来实验。下面直接开始~

1. 实验目的

        完成一项视觉问答(VQA)的任务,即给定一张图像,和一个问题,构建一个网络模型使之能够根据图像内容回答问题。

2. 实验环境

处理器:Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz   3.19 GHz;

GPU:GeForce GTX 1070Ti,版本456.71,NVIDIA CUDA 11.1.96 driver;

Python 3.9.7;

程序所需依赖包在附件代码的requirements.txt文件中。

3. 实验方法

        本实验主要完成了对文献[1]的复现,该文献提出了堆叠注意力网络SANs,SANs模型是使用注意力机制完成VQA任务的经典模型。

        SANs模型使用问题的语义表达搜索图像中与问题相关的区域来预测答案。图像的全局特征通常包含大量冗余的、与问题无关的特征,使用图像的全局特征来预测问题的答案反而会使准确率下降,因此就引入了注意力机制,希望模型只注意到图像中与问题相关的局部区域,再使用局部的图像特征进行预测;根据图像回答问题通常是一个多步推理的过程,因此这里使用了多层的注意力以模拟多步推理的过程,越高的注意力层主要到的区域与问题的相关性越高。如图3.1所示,输入问题是“What are sitting in the basket on a bicycle?”,注意力层可视化效果中的明亮区域就是注意到的图像区域,在第一个注意力层中,模型注意到了三个区域,而第二个注意力层,模型锁定了一个目标区域,并根据这个目标区域进行答案预测。

图3.1  训练好的多层注意力可视化

         一个SANs模型主要包含三个组成部分:一个用于提取高层图像特征的CNN,一个用于提取问题的语义特征的LSTM,一个用于定位目标图像区域和实现多步推理堆叠注意力网络,如图3.2所示。SANs首先使用问题特征查询第一个视觉注意力层中的图像区域,然后将问题向量和检索到的图像特征组合成一个细化的查询向量,在第二个注意力层中再次查询图像区域。越高层的注意力能提供更清晰的注意力分布,与答案相关性更高。

图3.2  SANs结构图

 3.1 图像模型

 3.2 问题模型

3.3 堆叠注意力网络 

图3.4 SANs模型结构框图即中间数据维度信息

 4. 实验结果

        github上有很多关于这篇文章的复现代码,原论文作者提供的代码用的Python 2.7,深度学习框架为Theano,有点老了,所以没多参考。之前看过一篇博客说,目前的这些代码多少都存在一点问题,我也尝试过一些代码发现的确如此...所以我最终参考的是这一篇,简洁明了。但作者好像并没有完成注意力可视化部分的代码,在自然语言处理部分存在些小瑕疵(没记错的话,在测试阶段没有把所有字母转小写,导致训练和测试的语言部分处理不相同,效果会很差)。我在实验过程中,对以上这些内容进行了一些补充和修改,工作不大也就没有上传github了,感兴趣的朋友网盘(提取码:SANs)自取哈!仅供参考。

        实验程序置于附件文件的mySAN文件夹中,其中train.py为训练程序、test.py为测试程序、data_loader.py为加载数据集的程序、model.py为搭建SANs模型的程序、plotter.py为绘制loss和accuracy随迭代轮数变化的程序,mySAN/utilities中是数据预处理程序。

        实验中使用的数据集是来自VQA: Visual Question AnsweringVQA v2数据集,其数据集内容如图4.1所示。VQA v2数据集中的问题类型大概可以分类以下四类:对象、数字、颜色和位置。

 图4.1 VQA v2数据集信息

        下载数据集后,其在本地存储地址如图4.2所示。

 图4.2 数据集在本地存储地址

        在数据预处理的过程中,注意修改代码中文件的路径。先运行mySAN/utilities/resize_images.py文件,将所有的图片resize成224*224*3的大小,此时将生成一个resized_images文件夹,文件夹下为resize后的训练集、验证集和测试集的图片;然后运行mySAN/utilities/make_vacabs_for_questions_answers.py文件,将生成vocab_answers.txt和vocab_questions.txt文件,前者统计了训练集中答案频次最高的前1000个答案(频次占所有答案的82.67%),后者统计了训练集中的问题中包含的所有词汇;最后运行mySAN/utilities/build_vqa_inputs.py文件,将生成5个.npy文件,用于后续训练网络时方便文件读取。数据预处理完成后,数据集所在文件夹更新情况如图4.3所示。

 图4.3 预处理后的数据集

        数据预处理完成后,运行train.py进行训练,注意修改图4.4中--input_dir,即数据集的路径。图4.4中的--log_dir和--model_dir分别为保存每一轮训练日志和训练得到的模型的文件夹路径。

        

 图4.4 train.py相关参数解释

        本次实验设置的batch_size=64,epoch=19,Adam优化器学习率lr=0.001,损失函数为交叉熵损失函数,图像模型中使用的CNN为训练好的VGG16_bn最后一个池化层前面所有的层、注意力部分使用两层注意力网络,每一轮训练完成后使用验证集进行测试(测试集没有标签),测试时不更新参数。每一轮训练和测试结果置于附件文件的other/myVQA2_logs_epoch_20文件夹内,训练得到的性能最好的模型为best_model.pt

        直接运行plotter.py文件即可查看我们训练过程中,损失函数和accuracy随训练轮数变化的过程,结果如图4.5所示。

图4.5 损失和accuracy随训练轮数的变化

        在test.py文件的主函数部分对于四种类型的问题已经提供了预选的图像和问题,可直接运行查看注意力可视化效果以及预测结果,测试过程中需要使用到的图像在附件文件的other/pic文件夹内。图4.6为训练好的模型对这四类问题(第二层)注意力可视化情况和预测结果的示例。

(a) What kind of animal is this? (Object)

 

 (b) What color is the bus? (Color)

 

 (c) Where is the dog laying? (Location)

 

 (d) How many vehicles can be seen? (Number)

 图4.6 四种类型问题的原图、第二层注意力可视化、结果预测

        本次实验在VQA v2数据集上训练19轮后,准确率可以达到58.7%,文献作者在VQA v1数据集上准确率为57.3%。根据可视化结果可知,注意力机制的引入确实发挥了作用,可以使模型注意到与问题相关的图像区域,从而进行答案预测。

        除此之外,我们还随机抽取了一些样本,查看预测错误的情况,发现预测错误的情况大体可以分为四类:注意力区域错误,如图4.7(a)所示,此种情况下,模型基本不能正确进行答案预测;注意力区域正确,预测错误,如图4.7(b)所示,此种情况与数据集中数据分布情况不均衡相关(如关于颜色的标签中蓝色标签很多);预测的答案与标签不同,但是合理,如图4.7(c)所示;数据集本身错误,如图4.7(d)所示。

 

 (a) What is the woman holding? (microphone)

 

 (b) What color is the tennis player's cloth? (white)

 

 (c) Where is the man? (ocean)

 

 (d) What color is the couch? (brown)

 5. 遇到问题及解决思路

         刚开始实验时对于图像模型部分使用的CNN网络为VGG19,在测试时发现对于输入的所有图像和问题,注意力都失效,模型中的pi的值全部相同。试过自定义参数初始化等方法,都没解决这个问题,后来参考github上其他网友的代码,发现有人使用的VGG16_bn网络,后来将图像模型进行修改后,pi的确能根据图像和问题有不同的分布,可视化效果也符合预期,于是猜测原先构建的图像模型可能在训练时发生了梯度爆炸的问题。

        之前训练的有一版模型,效果特别差,模型甚至不能区分问的问题是什么类型的,比如说问“What color…”,模型预测结果可能会包含Number或者是Object,准确率很低。通过调试发现在数据预处理时过于粗糙,没有对问题字符串做统一的处理,导致模型没有有效学习到问题类型,后来修改数据预处理的代码后,模型能学习到“What color…”、“How many…”等体现问题类型的关键词和短语。但是目前数据预处理代码还是略显粗糙,还没有去除标点符号等特殊字符,也没有将缩写形式进行转化,如is’not转为is not,这可能会影响到模型的训练效果,这也是此实验可以继续优化的方向。

 参考文献

  1. Z. Yang, X. He, J. Gao, L. Deng and A. Smola, "Stacked Attention Networks for Image Question Answering," 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016, pp. 21-29, doi: 10.1109/CVPR.2016.10.

 附件代码

链接:https://pan.baidu.com/s/1oflExQdp6OInbJicRnnNMA 
提取码:SANs

猜你喜欢

转载自blog.csdn.net/qq_40481602/article/details/125094929