块:用于视觉问答和视觉关系检测的双线性超对角融合
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.txt
和logs_predicate.json
文件中,而不是附加到logs.txt
和logs.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上训练和评估
- 列车组上的列车阻塞,在Valset上提前停车
- 评估测试集上的最佳检查点(谓词预测)
- 评估测试集上的最佳检查点(关系和短语检测)
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
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.json
和logs\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
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.4fusion=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。