Пример #1
0
def train(epoch, dir_fn, label_dict, in_dir):
    mlp.train()
    with open(dir_fn, "r") as fo:
        imnames = map(lambda x: x.strip(), fo.readlines())
    perm = np.random.permutation(len(imnames)).tolist()
    lt, pred_multi, grt_multi = [], [], []
    for i in range(0, len(perm), args.batch_size):
        optimizer.zero_grad()
        fns = imnames[i:i + args.batch_size]
        l, pred, grt = run_net(label_dict, in_dir, fns)
        pred_multi.append(pred)
        grt_multi.append(grt)
        l.backward()
        torch.nn.utils.clip_grad_norm(mlp.parameters(), 5.0)
        optimizer.step()
        lt.append(l.cpu().item())
        if len(lt) % args.print_interval == 0:
            # save model
            pred_multi, grt_multi = np.concatenate(
                pred_multi, axis=0), np.concatenate(grt_multi, axis=0)
            precision, recall, fscore = get_fscore(
                pred_multi >= args.threshold, grt_multi)
            pcont = "epoch: %d, train loss: %.3f, precision: %.3f, recall: %.3f, fscore: %.3f" % (
                epoch, sum(lt) / len(lt), precision, recall, fscore)
            print(pcont)
            with open(vs_log_fn, "a+") as fo:
                fo.write(pcont + "\n")
            lt, pred_multi, grt_multi = [], [], []
    return 0
Пример #2
0
def test(epoch, dir_fn, label_dict, in_dir):
    mlp.eval()
    with open(dir_fn, "r") as fo:
        imnames = map(lambda x: x.strip(), fo.readlines())
    lt, pred_multi, grt_multi = [], [], []
    for i in range(0, len(imnames), args.test_batch_size):
        fns = imnames[i:i + args.test_batch_size]
        l, pred, grt = run_net(label_dict, in_dir, fns)
        lt.append(l.cpu().item())
        pred_multi.append(pred)
        grt_multi.append(grt)
    pred_multi, grt_multi = np.concatenate(pred_multi,
                                           axis=0), np.concatenate(grt_multi,
                                                                   axis=0)
    precision, recall, fscore = get_fscore(pred_multi >= args.threshold,
                                           grt_multi)
    pcont = "epoch: %d, dev loss: %.3f, precision: %.3f, recall: %.3f, fscore: %.3f" % (
        epoch, sum(lt) / len(lt), precision, recall, fscore)
    print(pcont)
    with open(vs_log_fn, "a+") as fo:
        fo.write(pcont + "\n")
    return fscore
Пример #3
0
def test(epoch, subset):
    network.eval()
    ids_fn_sem = ddir.sp_testSem_ids_fn
    ids_fn = ddir.sp_dev_ids_fn if subset == "dev" else ddir.sp_test_ids_fn
    with open(ids_fn, "r") as fo:
        ids = map(lambda x: x.strip(), fo.readlines())
    with open(ids_fn_sem, "r") as fo:
        ids_sem = map(lambda x: x.strip(), fo.readlines())
    lt, pred_multi, grt_multi, pred_multiBoW, ltKW, ltBoW = [], [], [], [], [], []
    for i in range(0, len(ids), args.test_batch_size):
        idx = ids[i:i + args.test_batch_size]
        Xs, _ = data_io.load_mfcc(ddir.mfcc_dir, idx, args.n_pad)
        Xs = np.transpose(Xs, (0, 2, 1))
        Ys = np.stack(map(lambda x: vision_bow_vec[x[4:-2]], idx), axis=0)
        caption_Ys = np.stack(map(lambda x: caption_bow_vec[x], idx), axis=0)
        if (args.attn): l, pred, _ = run_net(Xs, Ys)
        elif (args.mt): l, lBoW, pred, predBoW = run_net(Xs, Ys, caption_Ys)
        else: l, pred = run_net(Xs, Ys)
        pred_multi.append(pred)
        grt_multi.append(caption_Ys)
        if (args.mt):
            pred_multiBoW.append(predBoW)
            lossTot = args.alpha * l + (1 - args.alpha) * lBoW
            ltKW.append(l.cpu().item())
            ltBoW.append(lBoW.cpu().item())
        else:
            lossTot = torch.tensor(l, requires_grad=True)
        lt.append(lossTot.cpu().item())
    pred_multi, grt_multi = np.concatenate(pred_multi,
                                           axis=0), np.concatenate(grt_multi,
                                                                   axis=0)
    pred_multi = np.concatenate(
        (pred_multi,
         np.zeros(
             (pred_multi.shape[0],
              grt_multi.shape[1] - pred_multi.shape[1])).astype(np.float32)),
        axis=1)
    if (args.mt):
        pred_multiBoW = np.concatenate(pred_multiBoW, axis=0)
        pred_multiBoW = np.concatenate(
            (pred_multiBoW,
             np.zeros((pred_multiBoW.shape[0], grt_multi.shape[1] -
                       pred_multiBoW.shape[1])).astype(np.float32)),
            axis=1)
    precision, recall, fscore = utils.get_fscore(pred_multi >= args.threshold,
                                                 grt_multi)
    if (args.mt):
        precisionBoW, recallBoW, fscoreBoW = utils.get_fscore(
            pred_multiBoW >= args.threshold, grt_multi)
        pcont1 = "epoch: %d, dev loss: %.3f" % (epoch, sum(lt) / len(lt))
        pcont2 = "dev loss KW: %.3f, precision KW: %.3f, recall KW: %.3f, fscore KW: %.3f" % (
            sum(ltKW) / len(ltKW), precision, recall, fscore)
        pcont3 = "dev loss BoW: %.3f, precision BoW: %.3f, recall BoW: %.3f, fscore BoW: %.3f" % (
            sum(ltBoW) / len(ltBoW), precisionBoW, recallBoW, fscoreBoW)
        print(pcont1)
        print(pcont2)
        print(pcont3)
    else:
        pcont = "epoch: %d, dev loss: %.3f, precision: %.3f, recall: %.3f, fscore: %.3f" % (
            epoch, sum(lt) / len(lt), precision, recall, fscore)
        print(pcont)
    with open(saveLog, "a+") as fo:
        if (args.mt):
            fo.write("\n" + pcont1 + "\n" + pcont2 + "\n" + pcont3 + "\n")
        else:
            fo.write(pcont + "\n")
    return fscore
Пример #4
0
def train(epoch):
    network.train()
    with open(ddir.sp_train_ids_fn, "r") as fo:
        train_ids = map(lambda x: x.strip(), fo.readlines())
    perm = np.random.permutation(len(train_ids)).tolist()
    perm = range(len(train_ids))
    lt, pred_multi, grt_multi, pred_multiBoW, ltKW, ltBoW = [], [], [], [], [], []
    for i in range(0, len(perm), args.batch_size):
        optimizer.zero_grad()
        idx = map(lambda x: train_ids[x], perm[i:i + args.batch_size])
        train_Xs, _ = data_io.load_mfcc(ddir.mfcc_dir, idx, args.n_pad)
        train_Xs = np.transpose(train_Xs, (0, 2, 1))
        train_Ys = np.stack(map(lambda x: vision_bow_vec[x[4:-2]], idx),
                            axis=0)
        caption_Ys = np.stack(map(lambda x: caption_bow_vec[x], idx), axis=0)
        if (args.attn): l, pred, _ = run_net(train_Xs, train_Ys)
        elif (args.mt):
            l, lBoW, pred, predBoW = run_net(train_Xs,
                                             train_Ys,
                                             YsBoW=caption_Ys)
        else:
            l, pred = run_net(train_Xs, train_Ys)
        pred_multi.append(pred)
        grt_multi.append(caption_Ys)
        if (args.mt):
            pred_multiBoW.append(predBoW)
            lossTot = args.alpha * l + (1 - args.alpha) * lBoW
            ltKW.append(l.cpu().item())
            ltBoW.append(lBoW.cpu().item())
        else:
            lossTot = torch.tensor(l, requires_grad=True)
        lossTot.backward()
        torch.nn.utils.clip_grad_norm(network.parameters(), 5.0)
        optimizer.step()
        lt.append(lossTot.cpu().item())
        if len(lt) % args.print_interval == 0:
            # save model
            pred_multi, grt_multi = np.concatenate(
                pred_multi, axis=0), np.concatenate(grt_multi, axis=0)
            pred_multi = np.concatenate(
                (pred_multi,
                 np.zeros((pred_multi.shape[0], grt_multi.shape[1] -
                           pred_multi.shape[1])).astype(np.float32)),
                axis=1)
            if (args.mt):
                pred_multiBoW = np.concatenate(pred_multiBoW, axis=0)
                pred_multiBoW = np.concatenate(
                    (pred_multiBoW,
                     np.zeros((pred_multiBoW.shape[0], grt_multi.shape[1] -
                               pred_multiBoW.shape[1])).astype(np.float32)),
                    axis=1)
            # pred_multi, grt_multi = np.concatenate(pred_multi, axis=0), np.concatenate(grt_multi, axis=0)
            # pred_multi = np.concatenate((pred_multi, np.zeros((pred_multi.shape[0], grt_multi.shape[1]-pred_multi.shape[1])).astype(np.float32)), axis=1)
            precision, recall, fscore = get_fscore(
                pred_multi >= args.threshold, grt_multi)
            if (args.mt):
                precisionBoW, recallBoW, fscoreBoW = utils.get_fscore(
                    pred_multiBoW >= args.threshold, grt_multi)
                pcont1 = "epoch: %d, train loss: %.3f" % (epoch,
                                                          sum(lt) / len(lt))
                pcont2 = "train loss KW: %.3f, precision KW: %.3f, recall KW: %.3f, fscore KW: %.3f" % (
                    sum(ltKW) / len(ltKW), precision, recall, fscore)
                pcont3 = "train loss BoW: %.3f, precision BoW: %.3f, recall BoW: %.3f, fscore BoW: %.3f" % (
                    sum(ltBoW) / len(ltBoW), precisionBoW, recallBoW,
                    fscoreBoW)
                print(pcont1)
                print(pcont2)
                print(pcont3)
            else:
                pcont = "epoch: %d, train loss: %.3f, precision: %.3f, recall: %.3f, fscore: %.3f" % (
                    epoch, sum(lt) / len(lt), precision, recall, fscore)
                print(pcont)
            with open(saveLog, "a+") as fo:
                if (args.mt):
                    fo.write("\n" + pcont1 + "\n" + pcont2 + "\n" + pcont3 +
                             "\n")
                else:
                    fo.write(pcont + "\n")
            lt, pred_multi, grt_multi, pred_multiBoW, ltKW, ltBoW = [], [], [], [], [], []
    return 0
def test(epoch, subset):
    network.eval()
    pcont4 = " "
    ids_fn_sem = ddir.sp_testSem_ids_fn
    ids_fn = ddir.sp_dev_ids_fn if subset == "dev" else ddir.sp_test_ids_fn
    with open(ids_fn, "r") as fo:
        ids = map(lambda x: x.strip(), fo.readlines())
    with open(ids_fn_sem, "r") as fo:
        ids_sem = map(lambda x: x.strip(), fo.readlines())
    lt, pred_multi, grt_multi, pred_multiBoW, ltKW, ltBoW, pred_multi_kw, grt_multi_kw = [], [], [], [], [], [], [], []
    for i in range(0, len(ids), args.test_batch_size):
        idx = ids[i:i + args.test_batch_size]
        Xs, _ = data_io.load_mfcc(ddir.mfcc_dir, idx, args.n_pad)
        Xs = np.transpose(Xs, (0, 2, 1))
        Ys = np.stack(map(lambda x: vision_bow_vec[x[4:-2]], idx), axis=0)
        caption_Ys = np.stack(map(lambda x: caption_bow_vec[x], idx), axis=0)
        if (args.mt): l, lBoW, pred, predBoW, _ = run_net(Xs, Ys, caption_Ys)
        else: l, pred, _ = run_net(Xs, Ys)
        pred_multi.append(pred)
        grt_multi.append(caption_Ys)
        if (args.mt):
            pred_multiBoW.append(predBoW)
            lossTot = args.alpha * l + (1 - args.alpha) * lBoW
            ltKW.append(l.cpu().item())
            ltBoW.append(lBoW.cpu().item())
        else:
            lossTot = torch.tensor(l, requires_grad=True)
        lt.append(lossTot.cpu().item())
        # if('taslp' in args.dataset):
        predMapped = (pred.T[mapping]).T
        pred_multi_kw.append(predMapped)
        # pdb.set_trace()
        grtMapped = (caption_Ys.T[mapping1]).T
        grt_multi_kw.append(grtMapped)

    pred_multi, grt_multi = np.concatenate(pred_multi,
                                           axis=0), np.concatenate(grt_multi,
                                                                   axis=0)
    pred_multi = np.concatenate(
        (pred_multi,
         np.zeros(
             (pred_multi.shape[0],
              grt_multi.shape[1] - pred_multi.shape[1])).astype(np.float32)),
        axis=1)
    # if('taslp' in args.dataset):
    pred_multi_kw, grt_multi_kw = np.concatenate(
        pred_multi_kw, axis=0), np.concatenate(grt_multi_kw, axis=0)
    pred_multi_kw = np.concatenate(
        (pred_multi_kw,
         np.zeros((pred_multi_kw.shape[0], grt_multi_kw.shape[1] -
                   pred_multi_kw.shape[1])).astype(np.float32)),
        axis=1)
    precision1, recall1, fscore1 = utils.get_fscore(
        pred_multi_kw >= args.threshold, grt_multi_kw)
    if (epoch == args.epoch - 1 or subset == "test"):
        ap1 = utils.get_metrics(pred_multi, grt_multi, flag='onlyAP')
        eer, ap, prec10, precN = utils.get_metrics(pred_multi_kw, grt_multi_kw)
        pcont4 = "Overall ratings: EER: %f, Average precision: %f, Average precision on all keywords: %f, Precision@10: %f, Precision@N: %f" % (
            eer, ap, ap1, prec10, precN)
        with open("tempcsvap.csv", "a+") as fo:
            fo.write(args.mtType + ',' + str(args.alpha) + ',' +
                     str(ap1 * 100) + ',' + str(ap * 100) + '\n')
    if (args.mt):
        pred_multiBoW = np.concatenate(pred_multiBoW, axis=0)
        pred_multiBoW = np.concatenate(
            (pred_multiBoW,
             np.zeros((pred_multiBoW.shape[0], grt_multi.shape[1] -
                       pred_multiBoW.shape[1])).astype(np.float32)),
            axis=1)
    precision, recall, fscore = utils.get_fscore(pred_multi >= args.threshold,
                                                 grt_multi)
    if (args.mt):
        precisionBoW, recallBoW, fscoreBoW = utils.get_fscore(
            pred_multiBoW >= args.threshold, grt_multi)
        pcont1 = "epoch: %d, dev loss: %.3f" % (epoch, sum(lt) / len(lt))
        pcont2 = "dev loss KW: %.3f, precision KW: %.3f, recall KW: %.3f, fscore KW: %.3f" % (
            sum(ltKW) / len(ltKW), precision, recall, fscore)
        pcont3 = "dev loss BoW: %.3f, precision BoW: %.3f, recall BoW: %.3f, fscore BoW: %.3f" % (
            sum(ltBoW) / len(ltBoW), precisionBoW, recallBoW, fscoreBoW)
        print(pcont1)
        print(pcont2)
        print(pcont3)
    else:
        pcont = "epoch: %d, dev loss: %.3f, precision: %.3f, recall: %.3f, fscore: %.3f" % (
            epoch, sum(lt) / len(lt), precision, recall, fscore)
        print(pcont)
    print(pcont4)
    with open(saveLog, "a+") as fo:
        if (args.mt):
            fo.write("\n" + pcont1 + "\n" + pcont2 + "\n" + pcont3 + "\n" +
                     pcont4 + "\n")
        else:
            fo.write(pcont + "\n" + pcont4 + "\n")
    # with open(saveLog, "a+") as fo:
    #     if(args.mt): fo.write("\n"+pcont1+"\n"+pcont2+"\n"+pcont3+"\n")
    #     else: fo.write(pcont+"\n")

    # return fscore

    return fscore1