API_Net官方代码之训练网络
发布日期:2021-05-14 00:13:02 浏览次数:9 分类:精选文章

本文共 9280 字,大约阅读时间需要 30 分钟。

Python ImageNet������������

1. ������������

������������������������������������������������������������������������������������

������ ������
num_workers ���������������������������������������������������CPU���������������������������
batch_size ������������������������������
epochs ���������������������
start_epoch ������������������������������������������������������epoch
learning_rate ���������������
momentum ���������������������������
weight_decay ���������������������
resume ������������������������������������
n_classes ������������
n_samples ������������������

2. ������������

best_prec1 = 0  # ���class������������������������������device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

3. ������������

������������������������������������������������������

  • ������������������������������
  • ���������������������������
  • computes loss��� update������
  • ������������������������loss������������
  • ������epoch���������������������������������
  • ������������������

���������������������������

def train(train_loader, model, criterion, optimizer_conv, scheduler_conv, optimizer_fc, scheduler_fc, epoch, step):    global best_prec1        # ������������������    batch_time = AverageMeter()    data_time = AverageMeter()    softmax_losses = AverageMeter()    rank_losses = AverageMeter()    losses = AverageMeter()    top1 = AverageMeter()    top5 = AverageMeter()        # ������������������������������    rank_criterion = nn.MarginRankingLoss(margin=0.05)    softmax_layer = nn.Softmax(dim=1).to(device)        # ������������    for i, (input, target) in enumerate(train_loader):        model.train()        data_time.update(time.time() - end)                input_var = input.to(device)        target_var = target.to(device).squeeze()                # ������������������        logit1_self, logit1_other, logit2_self, logit2_other, labels1, labels2 = model(input_var, target_var, flag='train')                batch_size = logit1_self.shape[0]        labels1 = labels1.to(device)        labels2 = labels2.to(device)                self_logits = torch.zeros(2 * batch_size, 200).to(device)        other_logits = torch.zeros(2 * batch_size, 200).to(device)        self_logits[:batch_size] = logit1_self        self_logits[batch_size:] = logit2_self        other_logits[:batch_size] = logit1_other        other_logits[batch_size:] = logit2_other                # ������������������        logits = torch.cat([self_logits, other_logits], dim=0)        targets = torch.cat([labels1, labels2, labels1, labels2], dim=0)        softmax_loss = criterion(logits, targets)        rank_loss = rank_criterion(self_scores, other_scores, flag)                loss = softmax_loss + rank_loss                # ������������������������        prec1 = accuracy(logits, targets, 1)        prec5 = accuracy(logits, targets, 5)                # ���������������        top1.update(prec1, batch_size * 4)        top5.update(prec5, batch_size * 4)                # ���������������������������        optimizer_conv.zero_grad()        optimizer_fc.zero_grad()        loss.backward()        if epoch >= 8:            optimizer_conv.step()        optimizer_fc.step()        scheduler_conv.step()        scheduler_fc.step()                # ������������������        if i % args.print_freq == 0:            current_time = time.asctime(time.localtime(time.time()))            print(f'[{current_time}] Time: {batch_time.val:.3f} ({batch_time.avg:.3f}) '                   f'Data: {data_time.val:.3f} ({data_time.avg:.3f}) '                   f'Loss: {loss.val:.4f} ({loss.avg:.4f}) '                   f'SoftmaxLoss: {softmax_loss.val:.4f} ({softmax_loss.avg:.4f}) '                   f'RankLoss: {rank_loss.val:.4f} ({rank_loss.avg:.4f}) '                   f'Prec@1: {top1.avg:.3f} ({top1.avg:.3f}) '                   f'Prec@5: {top5.avg:.3f} ({top5.avg:.3f})')        # epoch���������������������������        if i == len(train_loader) - 1:            val_dataset = RandomDataset(transform=transforms.Compose([                transforms.Resize([512, 512]),                transforms.CenterCrop([448, 448]),                transforms.ToTensor(),                transforms.Normalize(                    mean=(0.485, 0.456, 0.406),                    std=(0.229, 0.224, 0.225)                )            ]))            val_loader = DataLoader(                val_dataset,                batch_size=args.batch_size,                shuffle=False,                num_workers=args.workers,                pin_memory=True            )                        current_prec1 = validate(val_loader, model, criterion)                        is_best = current_prec1 > best_prec1            best_prec1 = max(current_prec1, best_prec1)                        # ������������������            save_checkpoint({                'epoch': epoch + 1,                'state_dict': model.state_dict(),                'best_prec1': best_prec1,                'optimizer_conv': optimizer_conv.state_dict(),                'optimizer_fc': optimizer_fc.state_dict()            }, is_best)

4. ������������

def validate(val_loader, model, criterion):    global device        batch_time = AverageMeter()    softmax_losses = AverageMeter()    top1 = AverageMeter()    top5 = AverageMeter()        model.eval()    end = time.time()        with torch.no_grad():        for i, (input, target) in enumerate(val_loader):            input_var = input.to(device)            target_var = target.to(device).squeeze()                        # ������������������            logits = model(input_var, targets=None, flag='val')                        # ������������            softmax_loss = criterion(logits, target_var)                        # ���������������            prec1 = accuracy(logits, target_var, 1)            prec5 = accuracy(logits, target_var, 5)                        # ���������������            softmax_losses.update(softmax_loss.item(), logits.size(0))            top1.update(prec1, logits.size(0))            top5.update(prec5, logits.size(0))                        # ������������            batch_time.update(time.time() - end)            end = time.time()                        # ������������������������            if i % args.print_freq == 0:                current_time = time.asctime(time.localtime(time.time()))                print(f'[{current_time}] Time: {batch_time.val:.3f} ({batch_time.avg:.3f}) '                       f'Loss: {softmax_loss.item():.4f} '                       f'Prec@1: {prec1:.3f} '                       f'Prec@5: {prec5:.3f}')        return top1.avg

5. ���������

def main():    global args        args = parser.parse_args()    torch.manual_seed(2)    torch.cuda.manual_seed_all(2)    np.random.seed(2)        # ���������������    model = API_Net().to(device)    model.conv = DataParallel(model.conv)        # ������������������    criterion = CrossEntropyLoss().to(device)        # ���������������    optimizer_conv = SGD(        model.conv.parameters(),        lr=args.lr,        momentum=args.momentum,        weight_decay=args.weight_decay    )    fc_parameters = [name for name, param in model.named_parameters() if 'conv' not in name]    optimizer_fc = SGD(        fc_parameters,        lr=args.lr,        momentum=args.momentum,        weight_decay=args.weight_decay    )        # ������������    if args.resume and os.path.exists(args.resume):        print(f'��������������� {args.resume}')        checkpoint = torch.load(args.resume)        args.start_epoch = checkpoint['epoch']        best_prec1 = checkpoint['best_prec1']        model.load_state_dict(checkpoint['state_dict'])        optimizer_conv.load_state_dict(checkpoint['optimizer_conv'])        optimizer_fc.load_state_dict(checkpoint['optimizer_fc'])        print(f'��������������� {args.resume} (epoch {checkpoint["epoch"]})')    else:        print(f'��������������������� {args.resume}')        # ������ cudnn ������������    cudnn.benchmark = True        # ������������    train_dataset = BatchDataset(        transforms.Compose([            transforms.Resize([512, 512]),            transforms.RandomCrop([448, 448]),            transforms.RandomHorizontalFlip(),            transforms.ToTensor(),            transforms.Normalize(                mean=(0.485, 0.456, 0.406),                std=(0.229, 0.224, 0.225)            )        ])    )    train_sampler = BalancedBatchSampler(        train_dataset,        num_classes=args.n_classes,        num_samples=args.n_samples    )    train_loader = DataLoader(        train_dataset,        batch_sampler=train_sampler,        num_workers=args.workers,        pin_memory=True    )        scheduler_conv = CosineAnnealingLR(        optimizer_conv,        num_epochs=100 * len(train_loader)    )    scheduler_fc = CosineAnnealingLR(        optimizer_fc,        num_epochs=100 * len(train_loader)    )        step = 0    print(f'���������������{time.asctime(time.localtime(time.time()))}')        for epoch in range(args.start_epoch, args.epochs):        step = train(train_loader, model, criterion, optimizer_conv, scheduler_conv, optimizer_fc, scheduler_fc, epoch, step)

������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

上一篇:【pytorch】torch.manual_seed()
下一篇:API_Net官方代码之utils工具

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年05月02日 06时27分50秒