块:用于视觉问答和视觉关系检测的双线性超对角融合

block.bootstrap.pytorch的Python项目详细描述


块:用于vqa和vrd的双线性超对角融合

在机器学习中,一个重要的问题是"如何在同一空间融合两种模式"。 例如,在视觉问答中,必须将图像和问题嵌入到同一个双模空间中。这种多模嵌入是后一种分类,以提供答案。

我们引入一个新的模块(块)来将两个表示融合在一起。首先,我们的实验证明,它比任何可用的任务融合都要好。其次,我们对张量复杂性的概念进行了理论分析。有关更多详细信息,请参见我们的aaai 2019年论文海报

在这个回购协议中,我们通过pip安装使我们的块融合可用,包括来自最新技术的几个强大的融合(mlb、mutan、mcb、mfb、mfh等)。此外,我们还提供了预先训练的模型和复制实验所需的所有代码。

摘要

安装

<H3>1。蟒蛇3&anaconda

我们不支持Python2。我们建议您在安装python 3时使用蟒蛇。然后,您可以创建一个环境。

<H3>2。作为独立项目
conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
<H3>3。下载数据集

下载批注、图像和功能对于VRD实验:

bash block/datasets/scripts/download_vrd.sh

下载vqa实验的注释、图像和功能:

bash block/datasets/scripts/download_vqa2.sh
bash block/datasets/scripts/download_vgenome.sh
bash block/datasets/scripts/download_tdiuc.sh

注意:这些特征是从预先训练过的使用caffe的快速rcnn中提取出来的。我们暂时不提供用于预训练或提取功能的代码。

(2)。作为一个python库)

通过导入python模块,您可以以简单的方式访问每个融合、数据集和模型:

importtorchfromblockimportfusionsmm=fusions.Block([100,100],300)inputs=[torch.randn(10,100),torch.randn(10,100)]out=mm(inputs)# torch.Size([10,300])# ...fusions.LinearSumfusions.ConcatMLPfusions.MLBfusions.Mutanfusions.Tuckerfusions.BlockTuckerfusions.MFBfusions.MFHfusions.MCB# ...fromblock.datasets.vqa2importVQA2fromblock.datasets.tdiucimportTDIUCfromblock.datasets.vgimportVGfromblock.datasets.vrdimportVRD# ...fromblock.models.networks.vqa_netimportVQANetfromblock.models.networks.vrd_netimportVRDNet# ...

要做到这一点,您可以使用pip:

pip install block.bootstrap.pytorch

或从源安装:

git clone https://github.com/Cadene/block.bootstrap.pytorch.git
python setup.py install

快速启动

A型列车

文件加载yaml文件中包含的选项,创建相应的实验目录并开始训练过程。例如,您可以通过运行:

python -m bootstrap.run -o block/options/vrd/block.yaml

然后,将在logs/vrd/block中创建几个文件:

  • 选项。yaml(选项副本)
  • logs.txt(打印历史)
  • logs.json(批次和时间段统计)
  • 视图.html(学习曲线)
  • ckpt_last_engine.pth.tar(上一个纪元的检查点)
  • ckpt_last_model.pth.tar
  • ckpt_last_optimizer.pth.tar
  • ckpt_best_eval_epoch.predicate.r_50_engine.pth.tar(最佳纪元的检查点)
  • ckpt_best_eval_epoch.predicate.r_50_model.pth.tar
  • ckpt_best_eval_epoch.predicate.r_50_optimizer.pth.tar

选项目录中有很多选项

评估模型

在培训过程结束时,可以在测试集中评估模型。在本例中,从实验目录加载选项,恢复验证集上的最佳检查点,并开始对测试集而不是验证集进行评估。在设置时跳过训练集(train_split为空)。由于--misc.logs_name,日志将写入新的logs_predicate.txtlogs_predicate.json文件中,而不是附加到logs.txtlogs.json文件中。

python -m bootstrap.run \
-o logs/vrd/block/options.yaml \
--exp.resume best_eval_epoch.predicate.R_50 \
--dataset.train_split \
--dataset.eval_split test \
--misc.logs_name predicate

再现结果

VRD数据集

在VRD上训练和评估
  1. 列车组上的列车阻塞,在Valset上提前停车
  2. 评估测试集上的最佳检查点(谓词预测)
  3. 评估测试集上的最佳检查点(关系和短语检测)
python -m bootstrap.run \
-o block/options/vrd/block.yaml \
--exp.dir logs/vrd/block

python -m bootstrap.run \
-o logs/vrd/block/options.yaml \
--dataset.train_split \
--dataset.eval_split test \
--exp.resume best_eval_epoch.predicate.R_50 \
--misc.logs_name predicate

python -m bootstrap.run \
-o logs/vrd/block/options.yaml \
--dataset.train_split \
--dataset.eval_split test \
--dataset.mode rel_phrase \
--model.metric.name vrd_rel_phrase \
--exp.resume best_eval_epoch.predicate.R_50 \
--misc.logs_name rel_phrase

注意:您可以在终端中一次复制过去的三个命令,以便无缝地逐个运行。

注意:块不是唯一可用的选项。您可以在这里找到其他几个

注意:学习曲线可以在实验方向查看(logs/vrd/block/view.html)。有一个例子此处

注意:在我们的文章中,我们报告了负采样率为0.5的结果。在谓词预测中,使用0.0的比率可以获得更好的结果。在短语检测和关系检测中,以0.8的比率可以获得更好的结果。您可以通过这样做来更改比率:

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
0

VRD比较实验

最后,您可以比较valset或testset度量的实验:

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
1

示例:

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
2

vqa2数据集

培训和评估(train/val)

我们使用这个简单的设置来调整valset上的超参数。

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
3

培训和评估(培训+VAL/VAL/测试)

这个较重的设置允许我们在95%的train和val集合的连接上训练一个模型,并在5%的rest上对其进行评估。然后提取测试集上最佳检查点的预测。最后,我们在evalai网站上提交一个json文件。

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
4

培训和评估(train+val+vg/val/test)

同样,但我们从VisualGenome数据集中添加对。

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
5

对valset的比较实验

您可以通过在VALSET上显示实验的最佳指标来进行比较。

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
6

提交evalai预测

无法自动计算测试集上的精度。您需要在evalai平台上提交json文件。测试集上的求值步骤创建json文件,该文件包含对完整测试集上模型的预测。例如:logs/vqa2/block_trainval_vg/results/test/epoch,19/opened_mscoo_test2015_model_results.json。要获得testdev或测试集的准确性,必须提交此文件。

tdiuc数据集

培训和评估(培训/考核/测试)

整个训练集分为一个训练集和一个valset。在训练结束时,我们评估测试集上的最佳检查点。TDIUC指标在每个历元结束时计算和显示。它们还存储在logs.jsonlogs\u test.json

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
7

比较实验

您可以通过在valset或testset上显示它们的最佳度量来比较实验。

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
8

预训练模型

注意:这些预训练模型已经使用Pythorc1.0进行了训练,以确保我们的结果在此版本中是可重复的。我们还使用了一种更有效的学习率调度策略,该策略的结果稍好一些。

VRD

下载

conda create --name block python=3
source activate block
git clone --recursive https://github.com/Cadene/block.bootstrap.pytorch.git
cd block.bootstrap.pytorch
pip install -r requirements.txt
9

结果python-m block.compare_vrd_test-d logs/vrd/block

  • 谓词r_50:86.3708
  • 谓词r_u:92.4588
  • 短语50:25.4779
  • 短语100:29.7198
  • 相对湿度50:18.0806
  • 相对湿度100:21.1181

VQA2

下载闭塞列车/val

bash block/datasets/scripts/download_vrd.sh
0

结果val(python-m block.compare_vqa2_val-d logs/vqa2/block):

  • 总体(oe):63.6
  • 精度1:54.4254

下载闭塞列车+VAL/VAL/TEST

bash block/datasets/scripts/download_vrd.sh
1

结果测试偏差(evalai):

  • 总体:66.74
  • 是/否:83.73
  • 编号:46.51
  • 其他:56.84

下载闭塞列车+val+vg/val/test

bash block/datasets/scripts/download_vrd.sh
2

结果测试偏差(evalai):

  • 总体:67.41
  • 是/否:83.89
  • 编号:46.22
  • 其他:58.18

TDiuc

下载闭塞列车+VAL/VAL/TEST

bash block/datasets/scripts/download_vrd.sh
3

结果val(python-m block.compare\u tdiuc-val-d logs/tdiuc/block):

  • 精度1:88.0195
  • 账号:72.2555
  • 会计科目:59.9484
  • 符合标准:60.9635
  • 符合标准:44.7724
<P>结果测试(python-m block.compare\u tdiuc\u test-d logs/tdiuc/block):

  • 精度1:86.3242
  • 空调:72.4447
  • 空调温度:66.15
  • 符合标准:58.5728
  • 符合标准:38.8279

熔合

阻止

fusion=fusions.block([100100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于所有d_c张量的输出维数之和(默认值:1600
  • chunks:块对角张量中的块数。等于前面方程式中的c(默认值:20
  • :d~c张量模3切片矩阵秩的上界(默认值:15
  • shared:boolean,指定是否要共享输入单模态投影的值(默认值:false
  • 退出输入:输入投影后的退出率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:输出线性后的辍学率(默认值:0.
  • pos_norm:字符串,指定是否应在每个块输出或每个输出的连接上执行带符号平方根二级规范化。接受值:"before_cat"和"after_cat"。(默认值:'在'u cat'之前

参考文献:block:用于视觉问答和视觉关系检测的双线性超对角融合,*Hedi Ben Younes,Rémi Cadene,Nicolas Thome,Matthieu Cord*

代码

线性

fusion=fusions.linearsum([100,100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸(默认值:1200
  • activ_input:在求和之前,遵循单模态投影的激活函数的名称(默认值:relu
  • activ_output:输出投影后的激活函数的名称(默认值:relu
  • normalize:布尔值,指定是否应用带符号的平方根-l2规范化(默认值:false
  • 辍学率输入:在激活输入之后的辍学率(默认值:0.
  • 辍学率:在输出线性(de)之前的辍学率故障:0。
  • 辍学率输出:活动输出后的辍学率(默认值:0.

代码

浓度

fusion=fusions.concatmlp([100,100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • 尺寸:隐藏尺寸列表(默认值:[500500]
  • 激活:网络激活函数的字符串名称,应用于每一层,但最后一层(默认值:'relu'
  • 辍学率:辍学率,应用于每一层,但最后一层(默认值:0.

代码

MLB

fusion=fusions.mlb([100100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸(默认值:1200
  • activ_input:在元素产品之前,遵循单模态投影的激活函数的名称(默认值:'relu'
  • activ_output:输出投影后的激活函数的名称(默认值:'relu'
  • normalize:布尔值,指定是否应用带符号的平方根-l2规范化(默认值:false
  • 辍学率输入:在激活输入之后的辍学率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:活动输出后的辍学率(默认值:0.

参考文献:用于低等级双线性池的Hadamard产品Jin Hwa Kim,Kyong Woon,Woosang Lim,Jeonghee Kim,Jung Woo Ha,Byoung Tak Zhang

代码

突变体

fusion=fusions.mutan([100,100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于d张量的输出维数(默认值:1600
  • :d张量的模式3切片矩阵秩的上界(默认值:15
  • shared:boolean,指定是否要共享输入单模态投影的值(默认值:false
  • normalize:布尔值,指定是否应用带符号的平方根-l2规范化(默认值:false
  • 退出输入:输入投影后的退出率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:输出线性后的辍学率(默认值:0.

参考文献:mutan:用于视觉问答的多模态塔克融合Hedi Ben Younes*,Rémi Cadene*,Nicolas Thome,Matthieu Cord

代码

塔克

该模块对应于〈code〉mutan〈code〉,不受d张量第三模切片的低秩约束。〈p〉。

fusion=fusions.tucker([100,100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于d张量的输出维数(默认值:1600
  • shared:boolean,指定是否要共享输入单模态投影的值(默认值:false
  • normalize:布尔值,指定是否应用带符号的平方根-l2规范化(默认值:false
  • 退出输入:输入投影后的退出率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:输出线性后的辍学率(默认值:0.

参考文献:mutan:用于视觉问答的多模态塔克融合Hedi Ben Younes*,Rémi Cadene*,Nicolas Thome,Matthieu Cord

代码

布洛克塔克

该模块对应于而不受第三模d-c张量切片的低秩约束

fusion=fusions.blocktucker([100100],300)

参数:

  • 输入尺寸:包含每个输入向量的维数的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于所有d_c张量的输出维数之和(默认值:1600
  • chunks:块对角张量中的块数。等于前面方程式中的c(默认值:20
  • shared:boolean,指定是否要共享输入单模态投影的值(默认值:false
  • 退出输入:输入投影后的退出率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:输出线性后的辍学率(默认值:0.
  • pos_norm:字符串,指定是否应在每个块输出或每个输出的连接上执行带符号平方根二级规范化。接受值:"before_cat"和"after_cat"。(默认值:'在'u cat'之前

参考文献:block:用于视觉问答和视觉关系检测的双线性超对角融合,*Hedi Ben Younes,Rémi Cadene,Nicolas Thome,Matthieu Cord*

代码

MFB

fusion=fusions.mfb([100100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于mfb层的输出维度(默认值:1200
  • 因子:mfb因子(默认值:2
  • activ_input:在元素产品之前,遵循单模态投影的激活函数的名称(默认值:'relu'
  • activ_output:输出投影后的激活函数的名称(默认值:'relu'
  • normalize:布尔值,指定是否应用带符号的平方根-l2规范化(默认值:false
  • 辍学率输入:在激活输入之后的辍学率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:活动输出后的辍学率(默认值:0.

参考文献:多模态分解双线性池与联合注意学习,用于视觉问答,*周宇,于军,樊建平,陶大成*

代码

MFH

fusion=fusions.mfh([100100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于mfh层的输出维度(默认值:1200
  • 因子:mfb因子(默认值:2
  • activ_input:在元素产品之前,遵循单模态投影的激活函数的名称(默认值:'relu'
  • activ_output:输出投影后的激活函数的名称(默认值:'relu'
  • normalize:布尔值,指定是否应用带符号的平方根-l2规范化(默认值:false
  • 辍学率输入:在激活输入之后的辍学率(默认值:0.
  • 辍学率:在输出线性之前的辍学率(默认值:0.
  • 辍学率输出:活动输出后的辍学率(默认值:0.

参考文献:beyond bilinar:generalized multi-modal factorized high-order pooling for visual question answering

代码

McB

< P>\不适用于Pythorch 1.0-适用于Pythorch 0.3和0.4

fusion=fusions.mcb([100100],300)

参数:

  • input_dims:包含每个输入向量的维度的列表
  • 输出尺寸:所需的输出尺寸
  • mm_dim:多模态空间的尺寸。这里,它等于MCB层的输出维度(默认值:16000
  • activ_output:输出投影后的激活函数的名称(默认值:'relu'
  • 辍学率输出:活动输出后的辍学率(默认值:0.

参考文献:用于视觉问答和视觉接地的多模式紧凑双线性池Akira Fukui,Dong Huk Park,Daylen Yang,Anna Rohrbach,Trevor Darrell,Marcus Rohrbach

代码

有用的命令

使用TensorBoard而不是Plotly

不是创建一个view.html文件,而是创建一个tensorboard文件:

bash block/datasets/scripts/download_vrd.sh
4
bash block/datasets/scripts/download_vrd.sh
5

通过更新yaml文件,您可以同时使用plotly和tensorboard,如此文件

使用特定的GPU

对于特定的实验:

bash block/datasets/scripts/download_vrd.sh
6

对于当前终端会话:

bash block/datasets/scripts/download_vrd.sh
7

覆盖选项

pytorch框架使覆盖超参数变得容易。在本例中,我们使用非缺省学习率运行一个实验。因此,我还覆盖了实验目录路径:

bash block/datasets/scripts/download_vrd.sh
8

恢复训练

如果出现问题,可以通过在覆盖exp.resume选项(默认为none)的同时从实验目录中指定选项文件来轻松恢复上一个纪元:

bash block/datasets/scripts/download_vrd.sh
9

Web API

bash block/datasets/scripts/download_vqa2.sh
bash block/datasets/scripts/download_vgenome.sh
bash block/datasets/scripts/download_tdiuc.sh
0

提取您自己的图像功能

bash block/datasets/scripts/download_vqa2.sh
bash block/datasets/scripts/download_vgenome.sh
bash block/datasets/scripts/download_tdiuc.sh
0

引文

bash block/datasets/scripts/download_vqa2.sh
bash block/datasets/scripts/download_vgenome.sh
bash block/datasets/scripts/download_tdiuc.sh
2

海报

作者

此代码由Hedi Ben Younes(Sorbonne Heuritech)、Remi Cadene(Sorbonne)、Matthieu Cord(Sorbonne)和="http://cedric.cnam.fr/%7ethomen/" rel="nofollow">尼古拉斯·汤姆(CNAM)。

确认

特别感谢本研究项目中使用的数据集:vqa2、tdiuc、visualgenome和vrd。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javapojo到org。布森。文件,反之亦然   java突然增加了G1老一代的承诺内存,减少了Eden的大小   java为什么对多个RXJava观察对象不执行并行执行?   java中的枚举是故障安全的吗?如果是,怎么做?   java是等待字符串变为相等的正确方法   java CodeAbbey挑战14个数据输入问题?   在java中的任意位置插入。util。列表   java替换html中的值   java需要帮助破译一个小堆栈跟踪:我使用的是哪种WS?   java Guice依赖项注入器空指针异常   java如何在3D引擎中实现视图剪裁平面?   JavaEclipseRCP:操作与命令需要更新   java如何使用XPAGES DesignerFacesServlet显示泰语字母(以及另一个亚洲/阿拉伯字母)   java装饰器模式问题   java我对空间复杂性的分析正确吗?   不显示java OpenGL ES 2纹理   使用java问题中的wc命令计算行数   java为什么空指针异常取决于条件的顺序?   Java日期在同一天或同一个月   java在使用lambda表达式时在变量中存储一些值