Ejemplo n.º 1
0
 def train(self, train_loader: DataLoader, valid_loader: DataLoader, opt_params: Optional[Mapping] = None,
           nb_epoch=100, step=100, k=20, early=50, verbose=True, swa_warmup=None, **kwargs):
     self.get_optimizer(**({} if opt_params is None else opt_params))
     global_step, best_n5, e = 0, 0.0, 0
     for epoch_idx in range(nb_epoch):
         if epoch_idx == swa_warmup:
             self.swa_init()
         for i, (train_x, train_y) in enumerate(train_loader, 1):
             global_step += 1
             loss = self.train_step(train_x, train_y.cuda(1))
             if global_step % step == 0:
                 self.swa_step()
                 self.swap_swa_params()
                 labels = np.concatenate([self.predict_step(valid_x, k)[1] for valid_x in valid_loader])
                 targets = valid_loader.dataset.data_y
                 p5, n5 = get_p_1(labels, targets), get_n_1(labels, targets)
                 if n5 > best_n5:
                     self.save_model()
                     best_n5, e = n5, 0
                 else:
                     e += 1
                     if early is not None and e > early:
                         return
                 self.swap_swa_params()
                 if verbose:
                     logger.info(F'{epoch_idx} {i * train_loader.batch_size} train loss: {round(loss, 5)} '
                                 F'P@5: {round(p5, 5)} nDCG@5: {round(n5, 5)} early stop: {e}')
Ejemplo n.º 2
0
    def train(self,
              train_loader: DataLoader,
              valid_loader: DataLoader,
              opt_params: Optional[Mapping] = None,
              nb_epoch=100,
              step=100,
              k=5,
              early=100,
              verbose=True,
              swa_warmup=None,
              **kwargs):
        self.get_optimizer(**({} if opt_params is None else opt_params))
        global_step, best_n5, e = 0, 0.0, 0
        print_loss = 0.0
        for epoch_idx in range(nb_epoch):
            if epoch_idx == swa_warmup:
                self.swa_init()
            for i, (train_x, train_y) in enumerate(train_loader, 1):
                global_step += 1
                loss = self.train_step(train_x, train_y.cuda())
                print_loss += loss
                if global_step % step == 0:
                    self.swa_step()
                    self.swap_swa_params()

                    labels = []
                    valid_loss = 0.0
                    self.model.eval()
                    with torch.no_grad():
                        for (valid_x, valid_y) in valid_loader:
                            logits = self.model(valid_x)
                            valid_loss += self.loss_fn(logits,
                                                       valid_y.cuda()).item()
                            scores, tmp = torch.topk(logits, k)
                            labels.append(tmp.cpu())
                    valid_loss /= len(valid_loader)
                    labels = np.concatenate(labels)

                    targets = valid_loader.dataset.data_y
                    p1, p3, p5, n3, n5 = get_p_1(labels, targets), get_p_3(
                        labels, targets), get_p_5(labels, targets), get_n_3(
                            labels, targets), get_n_5(labels, targets)
                    if n5 > best_n5:
                        self.save_model(True)
                        best_n5, e = n5, 0
                    else:
                        e += 1
                        if early is not None and e > early:
                            return
                    self.swap_swa_params()
                    if verbose:
                        log_msg = '%d %d train loss: %.7f valid loss: %.7f P@1: %.5f P@3: %.5f P@5: %.5f N@3: %.5f N@5: %.5f early stop: %d' % \
                        (epoch_idx, i * train_loader.batch_size, print_loss / step, valid_loss, round(p1, 5), round(p3, 5), round(p5, 5), round(n3, 5), round(n5, 5), e)
                        logger.info(log_msg)
                        print_loss = 0.0
Ejemplo n.º 3
0
def evalucate(results, targets, train_labels, a=0.55, b=1.5):
    res, targets = np.load(results, allow_pickle=True), np.load(targets, allow_pickle=True)
    mlb = MultiLabelBinarizer(sparse_output=True)
    targets = mlb.fit_transform(targets)
    print('Precision@1,3,5:', get_p_1(res, targets, mlb), get_p_3(res, targets, mlb), get_p_5(res, targets, mlb))
    print('nDCG@1,3,5:', get_n_1(res, targets, mlb), get_n_3(res, targets, mlb), get_n_5(res, targets, mlb))
    if train_labels is not None:
        train_labels = np.load(train_labels, allow_pickle=True)
        inv_w = get_inv_propensity(mlb.transform(train_labels), a, b)
        print('PSPrecision@1,3,5:', get_psp_1(res, targets, inv_w, mlb), get_psp_3(res, targets, inv_w, mlb),
              get_psp_5(res, targets, inv_w, mlb))
        print('PSnDCG@1,3,5:', get_psndcg_1(res, targets, inv_w, mlb), get_psndcg_3(res, targets, inv_w, mlb),
              get_psndcg_5(res, targets, inv_w, mlb))
Ejemplo n.º 4
0
def main(results, targets, train_labels):
    res, targets = np.load(results,
                           allow_pickle=True), np.load(targets,
                                                       allow_pickle=True)

    topk = 5
    with open('predictions.txt', 'w') as fout:
        for labels in res:
            fout.write(' '.join(labels[:topk]) + '\n')

    mlb = MultiLabelBinarizer(sparse_output=True)
    targets = mlb.fit_transform(targets)
    print('Precision@1,3,5:', get_p_1(res, targets, mlb),
          get_p_3(res, targets, mlb), get_p_5(res, targets, mlb))
    print('nDCG@1,3,5:', get_n_1(res, targets, mlb),
          get_n_3(res, targets, mlb), get_n_5(res, targets, mlb))
Ejemplo n.º 5
0
    def train(self, train_loader: DataLoader, valid_loader: DataLoader, opt_params: Optional[Mapping] = None,
              nb_epoch=100, step=100, k=5, early=100, verbose=True, swa_warmup=None, **kwargs):
        self.get_optimizer(**({} if opt_params is None else opt_params))
        global_step, best_n5, e = 0, 0.0, 0
        print_loss = 0.0  #
        epoch_loss = np.zeros((1, nb_epoch), dtype=np.float)
        np_p1 = np.zeros((1, nb_epoch), dtype=np.float)
        np_p5 = np.zeros((1, nb_epoch), dtype=np.float)
        for epoch_idx in range(nb_epoch):
            print_epoch_loss = 0.0
            if epoch_idx == swa_warmup:
                self.swa_init()
            p1_tmp = 0.0
            p5_tmp = 0.0
            for i, (train_x, train_y) in enumerate(train_loader, 1):
                global_step += 1
                loss = self.train_step(train_x, train_y.cuda())
                print_loss += loss
                print_epoch_loss += loss
                if global_step % step == 0:
                    self.swa_step()
                    self.swap_swa_params()
                    ##
                    labels = []
                    valid_loss = 0.0
                    self.model.eval()
                    with torch.no_grad():
                        for (valid_x, valid_y) in valid_loader:
                            # 原始寫法
                            # logits = self.model(valid_x)
                            logits = self.model(valid_x.long())
                            valid_loss += self.loss_fn(logits, valid_y.cuda()).item()
                            scores, tmp = torch.topk(logits, k)
                            labels.append(tmp.cpu())
                    valid_loss /= len(valid_loader)
                    labels = np.concatenate(labels)
                    ##
                    #                    labels = np.concatenate([self.predict_step(valid_x, k)[1] for valid_x in valid_loader])
                    targets = valid_loader.dataset.data_y
                    p5, n5 = get_p_5(labels, targets), get_n_5(labels, targets)
                    p1, n1 = get_p_1(labels, targets), get_n_1(labels, targets)
                    p5_tmp = p5
                    p1_tmp = p1
                    if n5 > best_n5:
                        self.save_model(True)  # epoch_idx > 1 * swa_warmup)
                        best_n5, e = n5, 0
                    else:
                        e += 1
                        if early is not None and e > early:
                            return
                    self.swap_swa_params()
                    if verbose:
                        log_msg = '%d %d train loss: %.7f valid loss: %.7f P@5: %.5f N@5: %.5f P@1: %.5f N@1: %.5f early stop: %d' % \
                                  (epoch_idx, i * train_loader.batch_size, print_loss / step, valid_loss, round(p5, 5),
                                   round(n5, 5), round(p1, 5), round(n1, 5), e)
                        logger.info(log_msg)
                        print_loss = 0.0

            epoch_loss[0, epoch_idx] = print_epoch_loss / 15249
            print_epoch_loss = 0.0
            np_p1[0, epoch_idx] = p1_tmp
            np_p5[0, epoch_idx] = p5_tmp
        return epoch_loss, np_p1, np_p5