先附上论文地址
论文背景介绍,如果是熟悉多视图学习的可以跳过。
多视图学习通过充分利用互补视图来进一步改进各种计算机视觉应用的性能,不同视图之间的深入交互信息以及融合。多视图是指对象的多种不同表示形式,并全面地描述了对象的所有信息。在实际应用中,许多对象具有一组以多种视图形式呈现的不同且互补的表示形式。(简单点比喻,一张RGB图片3个通道都能认为是3个视图。)
一种比较原始直接的做法就是把多个视图数据拼成一个文件然后计算。这样做有两个缺点:
除了上面原始的做法之外,还有人提出了投影变换的方法。对于一对(2个)视图,学习两个投影矩阵使两个视图投影后结果互相关性最大,或者以通过最大化所有成对视图的总相关性来获得多个变换。比起直接拼接该方法利用了视图间的相互信息,然而它是无监督的,可能导致获得的转换不利于分类。
针对上述投影无监督的缺点就有人提出了一个改进方向,就是利用LDA(线性判别,可以当做二分类模型,也可以认为是把数据降维到class_num-1
维的降维方法)的方法学习线性变换来找到可区分的公共空间。但是,这些基于LDA的方法在某些具有挑战性的方案中无法捕获某些微妙但重要的结构。
研究表明利用更灵活的深度神经网络来学习非线性表示可以实现更高的性能。用深层的神经网络来学习这个投影变换。有深度LDA的,也有共同训练多个网络以让它们相似的,还有借用VAE架构,让视图之间的重构结果相似,以及利用核方法的。
该文章的创新思想为:
不同视图的原始数据可能不同维度(尺寸),我们用不同的神经网络提取特征的同时可以把他们放到同一维度。也就是模型结构的开头部分。
经过预处理之后,假设每个视图的数据都变成d维了。对于两个不同的视图 v v v和 v ~ \tilde{v} v~产生一个dxd大小的矩阵X当作两者的互信息矩阵。E代表期望
那么对于每个视图,都会产生M-1个互信息矩阵。示例中4个视图,所以每个视图产生3个矩阵。
然后我们用同一个网络(下图的 φ \varphi φ)处理这些互信息矩阵,把每个矩阵从dxd压缩到d维。那么一个视图M-1个互信息矩阵就合起来变成了一个M-1 X d
大小的矩阵了,把这个矩阵当作一个视图和其他所有视图的互信息。
把预处理的视图信息和互信息矩阵拼接起来,作为最后的一个输入。
然后用一个共同的两层fc层的网络映射到class_num
维度当作输出。(注意有多个视图,所以会有多个label输出结果)
多个视图就会有多个视图的输出,代表着有多个损失,那么到底选择什么当作总体损失去优化呢?文章采取了如下一个方法把多个损失带权融合,注意是带上指数 γ \gamma γ>1的,进一步调整权重。
模型涉及的3个网络(预处理,互信息,融合输出)都可以反向传播计算。
需要考虑的是损失融合的权重 α \alpha α怎么调整。通过解带约束的最优化问题,得
L L L为对应视图得交叉熵损失。先求出这些损失,再更新对应得权重进行融合。
作者在六个数据集上进行对比试验,对比模型为SVMcon、DeepLDA、MvDA、DCCA、DCCAE、GradKCCA、MvNNcor本文模型均取得最好结果。同时作者也进行了网络结构删减和参数调整得实验(用来输入得两层fc网络中间隐节点, γ \gamma γ取值等)详细可以去看原文。
值得一提的是作者进行另外一个实验,利用几个经典的CNN网络架构提取同一图片的不同特征当作不同视图数据处理也得到了不错的结果。
作者给出了源码,大家可以直接前往下载,代码不长,结构也比较精简,这里重要记录一下复现过程得一些问题。
文章做实验的六组数据比较大,作者就没有传到github上,但是在/mvdata文件夹中作者附上了两个百度网盘链接,大家可以下载前往下载,一个是AWA数据,一个是其余5个数据。
作者在dataset
文件夹里面写好6个数据集的读取,在MvNNcor_Test.py
里面引用了哪些函数可以根据输入的参数选取读取的数据集,但是MvNNcor_Train.py
只有引用了一个AWA的,其他的需要大家手动添加并且根据输入自动选择不同的dataset方法。
作者给出了样例
python MvNNcor_Train.py --dataset_dir=./mvdata/AWA/Features --data_name=AWA --num_classes=50 --num_view=6 --gamma=6.0
作者样例为
python MvNNcor_Test.py --dataset_dir=./mvdata/AWA/Features --data_name=AWA --resume=./results/.../model_best.pth.tar --num_classes=50 --num_view=6 --gamma=6.0
其他和训练一样,就是resume
参数需要一下,就是训练完的最优模型存储位置。train后会自动保存,路径为./result/MvNNcor_+ data_name + epochs + gamma/model_best.pth.tar
,比如样例中AWA数据训练完之后的存储位置就是./result/MvNNcor_AWA_100_6.0/model_best.pth.tar
具体大家可以训练完之后查看一下目录。