示例#1
0
def validate(loader, trainer):

    trainer.eval()

    total_loss = 0.0
    total_pred_loss = 0.0
    total_reg_loss = 0.0

    for i, batch in enumerate(loader, 1):

        review, target = custom_collate(batch, vocab, args.cuda)

        if args.aspect == 'aspect1':
            target = target[:, 0]
        if args.aspect == 'aspect2':
            target = target[:, 1]
        if args.aspect == 'aspect3':
            target = target[:, 2]

        trainer(review, target)

        loss = trainer.loss.data[0]
        pred_loss = trainer.pred_loss.data[0]
        reg_loss = trainer.reg_loss.data[0]

        delta = loss - total_loss
        total_loss += (delta / i)
        delta = pred_loss - total_pred_loss
        total_pred_loss += (delta / i)
        delta = reg_loss - total_reg_loss
        total_reg_loss += (delta / i)

        # print("validated one batch")

    return total_loss, total_pred_loss, total_reg_loss
示例#2
0
def validate(loader, trainer, criterion):


    trainer.eval()

    total_loss = 0.0

    for i, batch in enumerate(loader, 1):

        review, target = custom_collate(batch, vocab, args.cuda)

        pred = activation(trainer(review))
        loss = criterion(pred, target).data[0]

        delta = loss - total_loss
        total_loss += (delta / i)

    return total_loss
示例#3
0
def train(loader, trainer, criterion, optimizer):

    trainer.train()

    total_loss = 0.0

    for t, batch in enumerate(loader, 1):

        review, target = custom_collate(batch, vocab, args.cuda)

        pred = activation(trainer(review))
        loss = criterion(pred, target)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        #print("trained one batch")
        delta = loss.data[0] - total_loss
        total_loss += (delta / t)

    return total_loss
示例#4
0
def train(loader, trainer, optimizer):

    trainer.train()

    total_loss = 0.0
    total_pred_loss = 0.0
    total_reg_loss = 0.0

    for i, batch in enumerate(loader, 1):

        reviews, target = custom_collate(batch, vocab, args.cuda)
        if args.aspect == 'aspect1':
            target = target[:, 0]
        if args.aspect == 'aspect2':
            target = target[:, 1]
        if args.aspect == 'aspect3':
            target = target[:, 2]

        loss = trainer(reviews, target)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        loss, pred_loss, reg_loss = trainer.loss.data[
            0], trainer.pred_loss.data[0], trainer.reg_loss.data[0]

        delta = loss - total_loss
        total_loss += (delta / i)
        delta = pred_loss - total_pred_loss
        total_pred_loss += (delta / i)
        delta = reg_loss - total_reg_loss
        total_reg_loss += (delta / i)

        #print("trained one batch")
        gc.collect()

    return total_loss, total_pred_loss, total_reg_loss
示例#5
0
文件: eval.py 项目: mbp28/dpp_nets
def main():

    global vocab, args

    lowest_loss = 100  # arbitrary high number as upper bound for loss

    # Check for GPU
    args = parser.parse_args()
    args.cuda = torch.cuda.is_available()

    # Set Seed
    torch.manual_seed(args.seed)
    if args.cuda:
        torch.cuda.manual_seed(args.seed)

    # Set-up data
    if args.remote:
        train_path = '/home/paulusm/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + args.mode + '.txt.gz'
        val_path = '/home/paulusm/data/beer_reviews/' + 'reviews.' + args.aspect + '.heldout.' + args.mode + '.txt.gz'
        embd_path = '/home/paulusm/data/beer_reviews/' + 'review+wiki.filtered.200.txt.gz'
        word_path = '/home/paulusm/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + 'words.txt.gz'
    else:
        train_path = '/Users/Max/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + args.mode + '.txt.gz'
        val_path = '/Users/Max/data/beer_reviews/' + 'reviews.' + args.aspect + '.heldout.' + args.mode + '.txt.gz'
        embd_path = '/Users/Max/data/beer_reviews/' + 'review+wiki.filtered.200.txt.gz'
        word_path = '/Users/Max/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + 'words.txt.gz'

    # Set-up vocabulary
    vocab = Vocabulary()
    vocab.loadPretrained(embd_path)
    vocab.setStops()
    vocab.loadCorpus(word_path)
    vocab.updateEmbedding()
    vocab.setCuda(args.cuda)

    # Set up datasets and -loader
    train_set = BeerDataset(train_path)
    val_set = BeerDataset(val_path)
    kwargs = {'num_workers': 0, 'pin_memory': True} if args.cuda else {}

    my_collate = custom_collate(vocab, args.cuda)
    train_loader = torch.utils.data.DataLoader(train_set,
                                               collate_fn=my_collate,
                                               batch_size=args.batch_size,
                                               shuffle=True,
                                               **kwargs)
    val_loader = torch.utils.data.DataLoader(val_set,
                                             collate_fn=my_collate,
                                             batch_size=args.batch_size,
                                             **kwargs)

    # Network parameters
    EMBD_DIM = 200
    KERNEL_DIM = 200
    HIDDEN_DIM = 500
    ENC_DIM = 200
    TARGET_DIM = 3 if args.aspect in set(['all', 'short']) else 1

    # Conventional trainer
    trainer = ChunkTrainer(EMBD_DIM, HIDDEN_DIM, KERNEL_DIM, ENC_DIM,
                           TARGET_DIM)
    trainer.activation = nn.Sigmoid()
    trainer.reg = args.reg
    trainer.reg_mean = args.reg_mean
    if args.cuda:
        trainer.cuda()
    print("created trainer")

    # Set-up optimizer
    params = [{
        'params': vocab.EmbeddingBag.parameters()
    }, {
        'params': trainer.parameters()
    }]
    optimizer = torch.optim.Adam(params, lr=args.lr)

    ### Loop
    for epoch in range(args.epochs):

        adjust_learning_rate(optimizer, epoch)

        train(train_loader, trainer, optimizer)
        loss, pred_loss, reg_loss = validate(val_loader, trainer)

        log(epoch, loss, pred_loss, reg_loss)
        print("logged")

        is_best = pred_loss < lowest_loss
        lowest_loss = min(pred_loss, lowest_loss)
        save = {
            'epoch:': epoch + 1,
            'embedding': vocab.EmbeddingBag.state_dict(),
            'model': 'marginal_chunk Trainer',
            'state_dict': trainer.state_dict(),
            'lowest_loss': lowest_loss,
            'optimizer': optimizer.state_dict()
        }

        save_checkpoint(save, is_best)
        print("saved a checkpoint")

    print('*' * 20, 'SUCCESS', '*' * 20)
示例#6
0
def main():

    global vocab, args

    lowest_loss = 100  # arbitrary high number as upper bound for loss

    # Check for GPU
    args = parser.parse_args()
    args.cuda = torch.cuda.is_available()

    # Set Seed
    torch.manual_seed(args.seed)
    if args.cuda:
        torch.cuda.manual_seed(args.seed)

    # Set-up data
    if args.remote:
        train_path = '/home/paulusm/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + args.mode + '.txt.gz'
        val_path = '/home/paulusm/data/beer_reviews/' + 'reviews.' + args.aspect + '.heldout.' + args.mode + '.txt.gz'
        embd_path = '/home/paulusm/data/beer_reviews/' + 'review+wiki.filtered.200.txt.gz'
        word_path = '/home/paulusm/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + 'words.txt.gz'
    else:
        train_path = '/Users/Max/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + args.mode + '.txt.gz'
        val_path = '/Users/Max/data/beer_reviews/' + 'reviews.' + args.aspect + '.heldout.' + args.mode + '.txt.gz'
        embd_path = '/Users/Max/data/beer_reviews/' + 'review+wiki.filtered.200.txt.gz'
        word_path = '/Users/Max/data/beer_reviews/' + 'reviews.' + args.aspect + '.train.' + 'words.txt.gz'

    # Set-up vocabulary
    vocab = Vocabulary()
    vocab.loadPretrained(embd_path)
    vocab.setStops()
    vocab.loadCorpus(word_path)
    vocab.updateEmbedding()
    vocab.setCuda(args.cuda)
    print('set up vocabulary')

    # Set up datasets and -loader
    train_set = BeerDataset(train_path, vocab)
    val_set = BeerDataset(val_path, vocab)
    kwargs = {'num_workers': 0, 'pin_memory': True} if args.cuda else {}

    my_collate = custom_collate(vocab, args.cuda)
    train_loader = torch.utils.data.DataLoader(train_set,
                                               collate_fn=my_collate,
                                               batch_size=args.batch_size,
                                               shuffle=True,
                                               **kwargs)
    val_loader = torch.utils.data.DataLoader(train_set,
                                             collate_fn=my_collate,
                                             batch_size=args.batch_size,
                                             **kwargs)

    # Network parameters
    EMBD_DIM = 200
    KERNEL_DIM = 200
    HIDDEN_DIM = 500
    ENC_DIM = 200
    TARGET_DIM = 3 if args.aspect in set(['all', 'short']) else 1

    # Conventional trainer
    trainer = ChunkTrainer(EMBD_DIM, HIDDEN_DIM, KERNEL_DIM, ENC_DIM,
                           TARGET_DIM)
    trainer.activation = nn.Sigmoid()
    trainer.reg = args.reg
    trainer.reg_mean = args.reg_mean

    print("created trainer")

    # Set-up optimizer
    params = [{
        'params': vocab.EmbeddingBag.parameters()
    }, {
        'params': trainer.parameters()
    }]
    optimizer = torch.optim.Adam(params, lr=args.lr)

    ### Loop
    for epoch in range(args.epochs):

        for t, batch in enumerate(train_loader):
            pass