
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)
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月02日 06时27分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
web项目开发记录
2021-05-14
matlab函数:sprintf详解
2021-05-14
matlab函数:fix 向0取整
2021-05-14
ORCAD创建元件库时,格点对不起怎么办
2021-05-14
Allegro中如何消除器件本身Pin间距报错
2021-05-14
AD中拖动器件,无法移动在一起如何解决
2021-05-14
python爬虫--07 Scrapy爬虫数据类型
2021-05-14
linux--练习001-基础类型
2021-05-14
python内存地址和编译字节码
2021-05-14
Flask--简介
2021-05-14
Flask模板--过滤器与测试器
2021-05-14
16 python基础-恺撒密码
2021-05-14
17 python基础--异常处理
2021-05-14
06.1 python基础--结构控制
2021-05-14
Frame--Api框架
2021-05-14
Frame--WEB框架
2021-05-14
idea 在Debug 模式中运行语句中函数的方法
2021-05-14
springboot2.1.1开启druid数据库连接池并开启监控
2021-05-14