-
Notifications
You must be signed in to change notification settings - Fork 4
一个rerank想法
limiao edited this page Nov 7, 2017
·
2 revisions
原来的rerank方法是要在训练集基础上生成一些good caption和bad caption的pairs,一方面我有些怀疑利用这些提前生成的pair是否能很好的指导训练,另一方面这使得训练和测试阶段差别比较大,我想到了之前做的句法树rerank的方法,感觉可以比较好的解决这两个问题。
这个方法需要的数据集和之前的ranker有所不同,我想可以生成这样的tfrecords,每个数据样本包含的数据如下:
- image_data: 图像数据
- proposed captions: 一个数组,包含各个模型产生的候选captions(可能需要pad)
- proposed caption length: 一个数组,包含上述captions的长度
- proposed caption scores: 一个数组,包含上述captions的分数(通过和reference计算得到的BLEU, CIDER等分数或者加权平均值)
- ground truth captions: 包含标准答案的captions数组(可能需要pad)
- ground truth caption length: 标准答案captions的长度 其中5,6项为可选数据,可以有也可以没有,主要看方法里是否需要;1,2,3为训练和测试时都需要的数据,4是训练时需要的数据。
基本可以按照目前的ranker_model框架,只是数据读取方面需要变化,经过数据读取之后,生成如下的tensor:
- images: batch_size x image size
- proposed captions: batch_size x caption_num x max_seq_length
- length: batch_size x caption_num
- gt_scores: batch_size x caption_num if train else None
然后开始进行处理:
- 根据image_model, text_model 和 match_model ,计算各个caption的得分 score
- 如果是测试阶段,直接输出得分最高的caption(结束)
- 如果是训练阶段:
- 选择gt_scores得分最高caption作为good_caption (这里也可以选择ground truth caption作为good caption,但是不一定好)
- 选择模型输出score得分最高的caption作为 candidate_caption (为了增加训练效率,也可以选择得分最高的top_k个captions,那么下面的loss计算就是k个candidate caption的loss之和)
- if candidate_caption == good_caption: loss = 0
- else loss = max(0, 1 - (score(good_caption) - score(candidate_caption)))