DRML(2016-CVPR)重现过程记录---(4)问题与反思

来源:互联网 发布:我的淘宝流量暴增 编辑:程序博客网 时间:2024/06/06 00:42

我目前自己做的这个DRML没有达到作者说的效果,这篇博文记录我现在的结果和一些思考。


目前训练的结果是,整个模型震荡十分严重,训练和测试的loss曲线如下图所示




这让我很不能理解。


反思可能的问题:

1,训练集与测试集的选取问题

Disfa plus数据集一共有9个人的视频,我选择最后2人的作为测试集,前面7人的作为训练集。

会不会可能是这样的呢:应该把所有人的视频帧图片都放到一起,随机选择作为训练集和测试集?

把所有图片混合随机选测试集和训练集的一个重大问题在于:数据集是视频帧图片,同一个人前后的视频帧图片太过于相似。那么很有可能出现一种情况:对于某一张测试集的图片,很有可能存在一些跟它几乎一模一样的训练图片,那么这样的训练很可能会使神经网络倾向于记住测试集的图片而不是学习到AU特征,这种训练方案是一种自欺欺人的行为


(2017.5.9补充回答:训练集和测试集的选取问题我邮件询问了github上另一位实现DRML的学生,他说我把7个人的数据作为训练集,另外2个人的数据作为测试集,这种方法是正确的)


2,文章与代码有一些不相符的地方,也有可能是我理解错误

第一处是文章在3.1中讲ground truth Y时,说可以取-1,1,0,但是我的理解是,对于这12种AU而言,每一种AU要么存在要么不存在,肯定是只有两种状态的,不可能存在第三种状态啊,所以应该只有-1 和1两种状态才对啊

第二处是文章中给出的loss函数表达式跟作者源代码给出的表达式有一些不一样。如下图


左边是caffe自带的SigmoidCrossEntropyLossLayer,右边是作者提供的MultiSigmoidCrossEntropyLossLayer层,对比一下可以看看作者改了哪些内容。

而作者给出的loss计算表达式是这样的

而sigmoid交叉熵函数loss表达式(参考http://blog.csdn.net/u012162613/article/details/44239919)是这样的:


所以sigmoid交叉熵函数loss只有一个循环,而作者提出的MultiSigmoidCrossEntropyLoss应该有2层循环的,但是看代码并没有发现第二层循环在哪里。


(2017.5.9补回答充:后来张君鹏帮我看了代码,说其实在计算count时就已经有了2层循环了,这里的代码没有问题。)


3,作者虽然提供了训练网络以及loss函数,但是没有指明测试方案,没有设计测试层(比如我们平时用的最后一层softmaxloss层用于训练,对应的就会有soft max层直接输出概率结果,所以训练时网络中softmaxloss层作为最后一层,而在测试时则会改成softmax层)。根据作者文章中的表述,网络架构如下图所示:


在最后一层MultiSigmoidCrossEntropyLoss层之前,是三个全连接层,而最后一个全连接层的输出作者在图上标的是:Output AUs,数量又刚好跟检测的AU数目相同,是12个,所以我的感觉是这最后一个全连接层的输出就是预测的结果,也就是这12个AU每个AU检测的结果(姑且认为是概率吧)。

我用我训练得到的模型测试一张图片,得到的结果是不管输入是什么,这十二个AU输出都是相同的。

我的测试方案是:


修改DRML.prototxt为deply_test.prototxt,只修改两部分,去掉最后一层MultiSigmoidCrossEntropyLoss,以及,最开始的部分改为输入单张图片。如下图所示:


测试代码直接采用caffe自带的classification.cpp,只是把其中的标签数目从5改成了12(因为该文章要测12个AU是否存在)罢了。



实际测试的结果不管我的输入是什么,出来的输出都是一模一样。



已邮件联系第一作者zhao,我实在不知道该怎么继续实现了。。。



0 0