def validate()

in solver/self_play_all_vilbert.py [0:0]


    def validate(self, specified_set):
        self.model.eval()
        total_hit = 0
        total_cnt = 0
        out_name = self.exp_name + ('_gt' if self.use_gt_question else '') + '.txt'
        out_file = open(out_name, 'w')
        out_file.write('game_id|pred_obj|answer_obj|turn_id|question|answer|answer_confidence\n')

        for val_step, data in enumerate(specified_set):
            # game, obj_feats, tgt_cat, tgt_bbox, tgt_img_feat, cats, bboxs, bboxs_mask, label, qs, q_len = self.fetch_data(data)
            game, qgen_img_feats, qgen_bboxs, image_features_rcnn_oracle, bboxs_rcnn_oracle, image_features_rcnn_gt_guesser, bboxs_rcnn_gt_guesser, \
                 tgt_img_feat, tgt_bbox_vb, tgt_cat, cats_guesser, bboxs_mask, label, qs, q_len = self.fetch_data(data)
            with torch.no_grad(): 
                if self.use_gt_question:
                    pred, dialog, q_log, a_log, a_conf_log = self.model.play_with_gt_questions(
                        qs, q_len, image_features_rcnn_oracle, bboxs_rcnn_oracle, 
                        image_features_rcnn_gt_guesser, bboxs_rcnn_gt_guesser,
                        tgt_cat, tgt_bbox_vb, tgt_img_feat, cats_guesser, bboxs_mask,
                        self.tokenizer.sos_id, self.tokenizer.pad_id, 
                        self.tokenizer.eoq_id, self.tokenizer.eod_id,
                        self.answer2id, self.answer2token,
                    )
                else:
                    pred, dialog, q_log, a_log, a_conf_log = self.model.play(
                        qgen_img_feats, qgen_bboxs, image_features_rcnn_oracle, bboxs_rcnn_oracle, 
                        image_features_rcnn_gt_guesser, bboxs_rcnn_gt_guesser,
                        tgt_cat, tgt_bbox_vb, tgt_img_feat, cats_guesser, bboxs_mask,
                        self.tokenizer.sos_id, self.tokenizer.pad_id, 
                        self.tokenizer.eoq_id, self.tokenizer.eod_id,
                        self.answer2id, self.answer2token, max_q_len=20, max_turns=8,
                    )
                question_tokens = self.tokenizer.decode(q_log[0][0].tolist())
                for b in range(pred.size(0)):
                    out_prefix = "{}|{}|{}".format(game[b].id, pred[b].argmax(dim=-1).item(), label[b].item())
                    for t in range(len(q_log[b])):
                        out_str = out_prefix + "|{}|{}|".format(t, self.tokenizer.decode(q_log[b][t].tolist()))
                        if len(a_log[b]) > t:
                            out_str += "{}|{:.3f}".format(self.tokenizer.decode(a_log[b][t].tolist()), a_conf_log[b][t])
                        out_file.write(out_str+'\n')

                total_hit += (pred.argmax(dim=-1) == label).sum().item()
                total_cnt += pred.size(0)
                # if (val_step == 0) or ((val_step+1) % self._progress_step == 0):
                self.progress("Dev stat. ({}/{}) |  Acc. - {:.3f}".format(
                    val_step, len(specified_set), total_hit/float(total_cnt)))
                # Log
                if self.mode == 'train':
                    NOT_IMPLEMENT_YET()

                        
        if self.mode == 'train':

            score = -avg_loss
            if score > self.best_score:
                #self.save_checkpoint('step_{}.pth'.format(self.step), score)
                self.save_checkpoint('best.pth', score)
                self.best_score = score
            self.model.train()

        self.verbose(["Val stat. @ step {} | Acc. - {:.3f}"
                      .format(self.step, total_hit / float(total_cnt))])
        
        out_file.close()