def predict_cnn(config): # load tokenizer and torchtext Field pickle_tokenizer = open('pickles/tokenizer.pickle', 'rb') cohesion_scores = pickle.load(pickle_tokenizer) tokenizer = LTokenizer(scores=cohesion_scores) pickle_vocab = open('pickles/text.pickle', 'rb') text = pickle.load(pickle_vocab) model = CNN(config) model.load_state_dict(torch.load(config.save_model)) model.to(device) model.eval() tokenized = tokenizer.tokenize(config.input) min_len = config.filter_sizes[-1] # if user's input sentence is shorter than the largest filter size, add pad tokens to input sentence if len(tokenized) < min_len: tokenized += ['<pad>'] * (min_len - len(tokenized)) indexed = [text.vocab.stoi[token] for token in tokenized] length = [len(indexed)] tensor = torch.LongTensor(indexed).to(device) tensor = tensor.unsqueeze(1) length_tensor = torch.LongTensor(length) prediction = torch.sigmoid(model(tensor, length_tensor)) label = torch.round(prediction) if label == 1: label = 'Positive' else: label = 'Negative' sentiment_percent = prediction.item() print(f'[in] >> {config.input}') print(f'[out] >> {sentiment_percent*100:.2f} % : {label}')
# for CNN model if model_type == 'CNN': hidden_size = 128 pool_size = 2 n_filters = 128 filter_sizes = [3, 8] n_epochs = 30 cnn = CNN(vocab_size, embedding_size, n_filters, filter_sizes, pool_size, hidden_size, n_classes, dropout_rate) optimizer = optim.Adam(cnn.parameters(), lr=lr) train_loss, train_acc, val_loss, val_acc = train_val( n_epochs, cnn, train_iter, val_iter, optimizer, lfunc, model_type, 'two_layer', optim_type) export_graph('cnn24_loss.png', n_epochs, train_loss, val_loss, 'Loss Across Epochs (CNN)', 'Loss') export_graph('cnn24_acc.png', n_epochs, train_acc, val_acc, 'Network Accuracy Across Epochs (CNN)', 'Accuracy') # test model cnn.load_state_dict( torch.load( os.path.join( path, 'CNN_' + 'two_layer' + '_' + optim_type + '_saved_state.pt'))) test_loss, test_acc = validate(cnn, test_iter, lfunc) print(f'Test Loss: {test_loss:.3f} | Test Acc: {test_acc * 100:.2f}%')
def main(): args = options() use_cuda = not args.no_cuda and torch.cuda.is_available() torch.manual_seed(args.seed) device = torch.device("cuda" if use_cuda else "cpu") train_set = preload.datasets.MNISTDataset('../data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, ), (0.5, )) ])) train_loader = preload.dataloader.DataLoader(train_set, batch_size=args.batch_size) test_loader = preload.dataloader.DataLoader( preload.datasets.MNISTDataset('../data', train=False, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, ), (0.5, )) ])), batch_size=args.test_batch_size) if args.model == 'cnn': model = CNN().to(device) elif args.model == 'cnn_leaky_relu': model = CNNLeakyReLU.to(device) else: print("model error") exit() start_point = copy.deepcopy(model.state_dict()) # print("\nNormal training:") # if args.load_model: # model.load_state_dict(torch.load("mnist_cnn.pt")) # else: # model.load_state_dict(start_point) # optimizer = optim.SGD(model.parameters(), lr=args.lr) # scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # normal_method = NormalTrain(model, device, train_loader, optimizer) # model_training(args, model, normal_method, device, test_loader, scheduler) # if args.save_model: # torch.save(model.state_dict(), "mnist_cnn.pt") # evaluation(args, model, device, test_loader) # print("\nNormal training with L2 regularization:") # if args.load_model: # model.load_state_dict(torch.load("mnist_cnn_l2_regular.pt")) # else: # model.load_state_dict(start_point) # optimizer = optim.SGD(model.parameters(), lr=args.lr) # scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # l2_method = L2RegularTrain(model, # device, # train_loader, # optimizer, # weight_decay=args.weight_decay) # model_training(args, model, l2_method, device, test_loader, scheduler) # if args.save_model: # torch.save(model.state_dict(), "mnist_cnn_l2_regular.pt") # evaluation(args, model, device, test_loader) # print("\nTraining with adversarial gradient regularization:") # if args.load_model: # model.load_state_dict(torch.load("mnist_cnn_adv_grad_regular.pt")) # else: # model.load_state_dict(start_point) # optimizer = optim.SGD(model.parameters(), lr=args.lr) # scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # adv_grad_reg_method = AdversarialGradientRegularTrain(model, # device, # train_loader, # optimizer, # gradient_decay=args.gradient_decay) # model_training(args, model, adv_grad_reg_method, device, test_loader, scheduler) # if args.save_model: # torch.save(model.state_dict(), "mnist_cnn_adv_grad_regular.pt") # evaluation(args, model, device, test_loader) # print("\nAdversarial training (FGSM):") # if args.load_model: # model.load_state_dict(torch.load("mnist_cnn_fgsm.pt")) # else: # model.load_state_dict(start_point) # optimizer = optim.SGD(model.parameters(), lr=args.lr) # scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # fgsm = FastGradientSignMethod(lf=F.nll_loss, eps=args.eps) # adv_method = AdversarialTrain(model, device, train_loader, optimizer, attack=fgsm) # model_training(args, model, adv_method, device, test_loader, scheduler) # if args.save_model: # torch.save(model.state_dict(), "mnist_cnn_{}.pt".format(fgsm.name)) # evaluation(args, model, device, test_loader) # print("\nAdversarial training (BIM):") # if args.load_model: # model.load_state_dict(torch.load("mnist_cnn_bim.pt")) # else: # model.load_state_dict(start_point) # optimizer = optim.SGD(model.parameters(), lr=args.lr) # scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # bim = BasicIterativeMethod(lf=F.nll_loss, eps=args.eps, alpha=args.alpha, iter_max=args.iter_max) # adv_method = AdversarialTrain(model, device, train_loader, optimizer, attack=bim) # model_training(args, model, adv_method, device, test_loader, scheduler) # if args.save_model: # torch.save(model.state_dict(), "mnist_cnn_{}.pt".format(bim.name)) # evaluation(args, model, device, test_loader) # print("\nAdversarial training (PGD):") # if args.load_model: # model.load_state_dict(torch.load("mnist_cnn_pgd.pt")) # else: # model.load_state_dict(start_point) # optimizer = optim.SGD(model.parameters(), lr=args.lr) # scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) # pgd = ProjectedGradientDescent(lf=F.nll_loss, eps=args.eps, alpha=args.alpha, iter_max=args.iter_max) # adv_method = AdversarialTrain(model, device, train_loader, optimizer, attack=pgd) # model_training(args, model, adv_method, device, test_loader, scheduler) # if args.save_model: # torch.save(model.state_dict(), "mnist_cnn_{}.pt".format(pgd.name)) # evaluation(args, model, device, test_loader) print("\nAdversarial guided training (FGSM):") if args.load_model: model.load_state_dict(torch.load("mnist_cnn_adv_guided.pt")) else: model.load_state_dict(start_point) optimizer = optim.SGD(model.parameters(), lr=args.lr) scheduler = StepLR(optimizer, step_size=1, gamma=args.gamma) guide_sets = make_guide_set(train_set, size=1000) adv_guided_method = AdversarialGuidedTrain( model, device, train_loader, optimizer, guide_sets=guide_sets, epsilon=args.eps, beta=args.beta, weight_decay=args.weight_decay, gradient_decay=args.gradient_decay) model_training(args, model, adv_guided_method, device, test_loader, scheduler) if args.save_model: torch.save(model.state_dict(), "mnist_cnn_adv_guided.pt") evaluation(args, model, device, test_loader)