Skip to content

一个rerank想法

limiao edited this page Nov 7, 2017 · 2 revisions

前言

原来的rerank方法是要在训练集基础上生成一些good caption和bad caption的pairs,一方面我有些怀疑利用这些提前生成的pair是否能很好的指导训练,另一方面这使得训练和测试阶段差别比较大,我想到了之前做的句法树rerank的方法,感觉可以比较好的解决这两个问题。

方法详述

数据

这个方法需要的数据集和之前的ranker有所不同,我想可以生成这样的tfrecords,每个数据样本包含的数据如下:

  1. image_data: 图像数据
  2. proposed captions: 一个数组,包含各个模型产生的候选captions(可能需要pad)
  3. proposed caption length: 一个数组,包含上述captions的长度
  4. proposed caption scores: 一个数组,包含上述captions的分数(通过和reference计算得到的BLEU, CIDER等分数或者加权平均值)
  5. ground truth captions: 包含标准答案的captions数组(可能需要pad)
  6. ground truth caption length: 标准答案captions的长度 其中5,6项为可选数据,可以有也可以没有,主要看方法里是否需要;1,2,3为训练和测试时都需要的数据,4是训练时需要的数据。

方法

基本可以按照目前的ranker_model框架,只是数据读取方面需要变化,经过数据读取之后,生成如下的tensor:

  1. images: batch_size x image size
  2. proposed captions: batch_size x caption_num x max_seq_length
  3. length: batch_size x caption_num
  4. gt_scores: batch_size x caption_num if train else None

然后开始进行处理:

  • 根据image_model, text_model 和 match_model ,计算各个caption的得分 score
  • 如果是测试阶段,直接输出得分最高的caption(结束)
  • 如果是训练阶段:
  1. 选择gt_scores得分最高caption作为good_caption (这里也可以选择ground truth caption作为good caption,但是不一定好)
  2. 选择模型输出score得分最高的caption作为 candidate_caption (为了增加训练效率,也可以选择得分最高的top_k个captions,那么下面的loss计算就是k个candidate caption的loss之和)
  3. if candidate_caption == good_caption: loss = 0
  4. else loss = max(0, 1 - (score(good_caption) - score(candidate_caption)))