import time import copy import argparse import torch import torch.nn as nn import models import dataset import util if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--name', required=True) parser.add_argument('--zeroshot', action='store_true') parser.add_argument('--epochs', default=50) parser.add_argument('--seed', type=int, default=None) parser.add_argument('--patience', type=int, default=5) parser.add_argument('--dropout', type=float, default=0.5) parser.add_argument('--alpha', type=float, default=0.2) parser.add_argument('--l', type=int, default=2) parser.add_argument('--filename') args = parser.parse_args() if 'atis' in args.name: args.dataset = 'atis' elif 'snips' in args.name: args.dataset = 'snips' if 'intent' in args.name: args.model = 'intent' elif 'slot' in args.name: args.model = 'slot' elif 'joint' in args.name: args.model = 'joint' print(f"seed {util.rep(args.seed)}") cuda = torch.cuda.is_available() train, valid, test, num_words, num_intent, num_slot, wordvecs = dataset.load(args.dataset, batch_size=8, seq_len=50) model = util.load_model(args.model, num_words, num_intent, num_slot, args.dropout, wordvecs) model.load_state_dict(torch.load(args.name)) criterion = torch.nn.CrossEntropyLoss(ignore_index=-1) if cuda: model = model.cuda() if len(args.name.split('/')) > 1: nameprefix = args.name.split('/')[-1] else: nameprefix = args.name filename = args.filename if args.filename else f"results/{nameprefix}_{'zeroshot' if args.zeroshot else 'retrain'}_l{args.l}_alpha{args.alpha}.csv" if args.model == 'intent': open(filename, 'w').close() # clear the file f = open(filename, "a") while sum(model.filter_sizes) > 0: _, test_acc = util.valid_intent(model, test, criterion, cuda) print(f"{sum(model.filter_sizes)}, {test_acc:.5f}", file=f, flush=True) if sum(model.filter_sizes) > 10: model.prune(5, args.l) else: model.prune(1, args.l) if not args.zeroshot: optimizer = torch.optim.Adam(model.parameters()) best_epoch = 0 best_valid_loss, _ = util.valid_intent(model, valid, criterion, cuda) best_model = copy.deepcopy(model) epoch = 1 while epoch <= best_epoch + args.patience: train_loss, train_acc = util.train_intent(model, train, criterion, optimizer, cuda) valid_loss, valid_acc = util.valid_intent(model, valid, criterion, cuda) if valid_loss < best_valid_loss: best_valid_loss = valid_loss best_epoch = epoch best_model = copy.deepcopy(model) epoch += 1 model = best_model elif args.model == 'slot': open(filename, 'w').close() # clear the file f = open(filename, "a") while sum(model.filter_sizes) > 0: _, test_f1 = util.valid_slot(model, test, criterion, cuda) print(f"{sum(model.filter_sizes)}, {test_f1:.5f}", file=f, flush=True) if sum(model.filter_sizes) > 10: model.prune(5, args.l) else: model.prune(1, args.l) if not args.zeroshot: optimizer = torch.optim.Adam(model.parameters()) best_epoch = 0 best_valid_loss, _ = util.valid_slot(model, valid, criterion, cuda) best_model = copy.deepcopy(model) epoch = 1 while epoch <= best_epoch + args.patience: train_loss, train_f1 = util.train_slot(model, train, criterion, optimizer, cuda) valid_loss, valid_f1 = util.valid_slot(model, valid, criterion, cuda) if valid_loss < best_valid_loss: best_valid_loss = valid_loss best_epoch = epoch best_model = copy.deepcopy(model) epoch += 1 model = best_model elif args.model == 'joint': open(filename, 'w').close() # clear the file f = open(filename, "a") while sum(model.filter_sizes) > 0: _, (_, test_acc), (_, test_f1) = util.valid_joint(model, test, criterion, cuda, args.alpha) print(f"{sum(model.filter_sizes)}, {test_acc:.5f}, {test_f1:.5f}", file=f, flush=True) if sum(model.filter_sizes) > 10: model.prune(5, args.l) else: model.prune(1, args.l) if not args.zeroshot: optimizer = torch.optim.Adam(model.parameters()) best_epoch = 0 best_valid_loss, (_, _), (_, _) = util.valid_joint(model, valid, criterion, cuda, args.alpha) best_model = copy.deepcopy(model) epoch = 1 while epoch <= best_epoch + args.patience: train_loss, (_, _), (_, _) = util.train_joint(model, train, criterion, optimizer, cuda, args.alpha) valid_loss, (_, _), (_, _) = util.valid_joint(model, valid, criterion, cuda, args.alpha) if valid_loss < best_valid_loss: best_valid_loss = valid_loss best_epoch = epoch best_model = copy.deepcopy(model) epoch += 1 model = best_model