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}')
Esempio n. 2
0
    # 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}%')
Esempio n. 3
0
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)