From 9eb937d9c53b3c69cdd550d352ae122d04bfe026 Mon Sep 17 00:00:00 2001 From: wangwl Date: Thu, 11 Dec 2025 07:14:40 +0000 Subject: [PATCH 1/3] add Xception --- PyTorch/build-in/Classification/Xception/ run | 7 + .../Classification/Xception/coverage.txt | 3 + .../build-in/Classification/Xception/loss.jpg | Bin 0 -> 36711 bytes .../build-in/Classification/Xception/loss.txt | 26 + .../Classification/Xception/weloTrainStep.py | 647 ++++++++++++++++++ .../Classification/Xception/xception.py | 239 +++++++ 6 files changed, 922 insertions(+) create mode 100644 PyTorch/build-in/Classification/Xception/ run create mode 100644 PyTorch/build-in/Classification/Xception/coverage.txt create mode 100644 PyTorch/build-in/Classification/Xception/loss.jpg create mode 100644 PyTorch/build-in/Classification/Xception/loss.txt create mode 100644 PyTorch/build-in/Classification/Xception/weloTrainStep.py create mode 100644 PyTorch/build-in/Classification/Xception/xception.py diff --git a/PyTorch/build-in/Classification/Xception/ run b/PyTorch/build-in/Classification/Xception/ run new file mode 100644 index 000000000..22c1dfb0d --- /dev/null +++ b/PyTorch/build-in/Classification/Xception/ run @@ -0,0 +1,7 @@ +SDAA_VISIBLE_DEVICES=4,5,6,7 python weloTrainStep.py --name train --arch xception --print_freq 1 --steps 100 --dataset cifar100 --datapath ../data --batch_size 16 --epochs 100 | tee xceptionCifar100Train.log + +SDAA_VISIBLE_DEVICES=4,5,6,7 python weloTrainStep.py --name dump --arch xception --print_freq 1 --steps 100 --dataset cifar100 --datapath ../data --batch_size 16 --epochs 100 | tee xceptionCifar100Dump.log + +SDAA_VISIBLE_DEVICES=4,5,6,7 python weloTrainStep.py --name debug --arch xception --print_freq 1 --steps 100 --dataset cifar100 --datapath ../data --batch_size 16 --epochs 100 | tee xceptionCifar100Debug.log + +python ../coverage.py --path vitaminCifar100Debug.log \ No newline at end of file diff --git a/PyTorch/build-in/Classification/Xception/coverage.txt b/PyTorch/build-in/Classification/Xception/coverage.txt new file mode 100644 index 000000000..c6e1a7a41 --- /dev/null +++ b/PyTorch/build-in/Classification/Xception/coverage.txt @@ -0,0 +1,3 @@ +all api: ['_amp_foreach_non_finite_check_and_unscale_', '_amp_update_scale_', '_copy_from', '_has_compatible_shallow_copy_type', '_local_scalar_dense', '_log_softmax', '_log_softmax_backward_data', '_pin_memory', '_reshape_alias', 'add', 'add_', 'addmm', 'as_strided', 'as_strided_', 'convolution', 'convolution_backward', 'copy_stride', 'div', 'eq', 'fill_', 'fused_sgd', 'is_pinned', 'linear', 'max_pool2d', 'maxpool2d_backward', 'maxpool2d_forward', 'mean', 'mm', 'mul', 'mul_', 'native_batch_norm', 'native_batch_norm_backward', 'nll_loss_backward', 'nll_loss_forward', 'reciprocal', 'relu', 'sum', 'threshold_backward', 'topk_out', 'view', 'zero_'], total: 41 +fallback op: [], total: 0 +coverage rate: 100.00% diff --git a/PyTorch/build-in/Classification/Xception/loss.jpg b/PyTorch/build-in/Classification/Xception/loss.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b34bde922aeef07bbe7f7b88687cb03a4d266767 GIT binary patch literal 36711 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ͻkn?rgl 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 n$i?Wa`OuaXUe2o)lv=@T3K`*a6ihG=U&9h{K< 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 支持 DDP / 单卡,AMP,resume,日志,checkpoint) +保存为 train_template_localmodel.py +""" +import torch +import torch.nn as nn +import torch.optim as optim +import torch.backends.cudnn as cudnn +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as tv_models + +import torch.distributed as dist +from torch.nn.parallel import DistributedDataParallel as DDP +from torch.utils.data import DataLoader +from torch.utils.data.distributed import DistributedSampler + +from torch.sdaa import amp +# from torch.cuda import amp + + +# ---------------------------- +# Helper utilities (self-contained) +# ---------------------------- +class AverageMeter(object): + def __init__(self, name='Meter', fmt=':.4f'): + self.name = name + self.fmt = fmt + self.reset() + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / max(1, self.count) + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} (avg {avg' + self.fmt + '})' + return fmtstr.format(name=self.name, val=self.val, avg=self.avg) + +def accuracy(output, target, topk=(1,)): + """Computes the precision@k for the specified values of k + 返回一个 list,每个元素是 tensor(百分比形式) + """ + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + # output: (N, C) -> pred: (maxk, N) + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() # (maxk, N) + correct = pred.eq(target.view(1, -1).expand_as(pred)) # (maxk, N) bool + + res = [] + for k in topk: + # 把前 k 行展平后求和(返回 0-dim tensor),随后换算为百分比 + correct_k = correct[:k].reshape(-1).float().sum() # 注意:不传 keepdim + # 乘以 100.0 / batch_size,保持返回 tensor(和之前代码兼容) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + +def save_checkpoint(state, is_best, save_dir, filename='checkpoint.pth'): + save_path = os.path.join(save_dir, filename) + torch.save(state, save_path) + if is_best: + best_path = os.path.join(save_dir, 'model_best.pth') + torch.save(state, best_path) + +def set_seed(seed, deterministic=False): + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + cudnn.deterministic = True + cudnn.benchmark = False + else: + cudnn.deterministic = False + cudnn.benchmark = True + +# ---------------------------- +# Argument parser +# ---------------------------- +def parse_args(): + parser = argparse.ArgumentParser(description='Generic PyTorch training template (DDP/AMP) with LocalModel priority') + parser.add_argument('--name', default='run', type=str, help='experiment name (log/checkpoints dir)') + parser.add_argument('--seed', default=42, type=int, help='random seed') + parser.add_argument('--arch', default='None', type=str, help='model name') + parser.add_argument('--deterministic', action='store_true', help='set cudnn deterministic (may be slower)') + parser.add_argument('--dataset', default='cifar10', choices=['cifar10','cifar100','imagenet','custom'], help='which dataset') + parser.add_argument('--datapath', default='./data', type=str, help='dataset root / imagenet root / custom root') + parser.add_argument('--imagenet_dir', default='./imagenet', type=str, help='if dataset=imagenet, path to imagenet root') + parser.add_argument('--custom_eval_dir', default=None, help='if dataset=custom, provide val dir') + parser.add_argument('--num_workers', default=4, type=int, help='dataloader workers per process') + parser.add_argument('--epochs', default=200, type=int) + parser.add_argument('--steps', default=0, type=int, help='max steps to run (if >0, training will stop when global_step reaches this).') + parser.add_argument('--batch_size', default=128, type=int) + parser.add_argument('--model_name', default='resnet18', help='torchvision model name or python path e.g. mypkg.mymodule.Model (used if no local Model)') + parser.add_argument('--num_classes', default=None, type=int, help='override num classes (auto-detect for common sets)') + parser.add_argument('--pretrained', action='store_true', help='use torchvision pretrained weights when available') + parser.add_argument('--optimizer', default='sgd', choices=['sgd','adam','adamw'], help='optimizer') + parser.add_argument('--lr', '--learning_rate', default=0.1, type=float) + parser.add_argument('--momentum', default=0.9, type=float) + parser.add_argument('--weight_decay', default=5e-4, type=float) + parser.add_argument('--nesterov', action='store_true') + parser.add_argument('--scheduler', default='multistep', choices=['multistep','step','cosine','none'], help='lr scheduler') + parser.add_argument('--milestones', default='100,150', type=str, help='milestones for multistep (comma sep)') + parser.add_argument('--step_size', default=30, type=int, help='step size for StepLR or cosine max epochs') + parser.add_argument('--gamma', default=0.1, type=float) + parser.add_argument('--scheduler_step_per_batch', action='store_true', help='call scheduler.step() per batch (for some schedulers)') + parser.add_argument('--resume', default='', type=str, help='path to checkpoint to resume from') + parser.add_argument('--start_epoch', default=0, type=int) + parser.add_argument('--print_freq', default=100, type=int) + parser.add_argument('--save_freq', default=10, type=int, help='save checkpoint every N epochs (rank0 only)') + parser.add_argument('--amp', action='store_true', default = True,help='use automatic mixed precision (AMP)') + parser.add_argument('--grad_accum_steps', default=1, type=int, help='gradient accumulation steps') + parser.add_argument('--local_rank', default=None, type=int, help='local rank passed by torchrun (if any). Use -1 or None for non-distributed') + parser.add_argument('--cutmix_prob', default=0.0, type=float) + parser.add_argument('--beta', default=1.0, type=float) + parser.add_argument('--seed_sampler', default=False, action='store_true', help='set sampler epoch seeds to make deterministic distributed shuffling') + args = parser.parse_args() + args.milestones = [int(x) for x in args.milestones.split(',')] if args.milestones else [] + return args + +# ---------------------------- +# build model (优先 LocalModel) +# ---------------------------- +def build_model_with_local_priority(args, device=None): + """ + 用参数 args.arch 作为模块名导入 Model() + 如果模块不存在或没有 Model 类,则报错停止。 + """ + try: + # 动态导入模块,比如 args.arch = "rexnet" + mod = importlib.import_module(args.arch) + Model = getattr(mod, "Model") # 从模块中获取 Model 类 + except Exception as e: + raise RuntimeError( + f"无法导入模型模块 '{args.arch}' 或未找到类 Model。" + f"\n错误信息:{e}" + ) + + # 解析数据集类别数 + if args.dataset == 'cifar10': + num_classes = 10 + elif args.dataset == 'cifar100': + num_classes = 100 + else: + print(f"[ERROR] 不支持的数据集类型:{args.dataset},无法确定类别数。程序终止。") + sys.exit(1) + + + # 实例化 + try: + model = Model(num_classes) + except Exception as e: + raise RuntimeError( + f"Model() 实例化失败,请检查模型构造函数。\n错误信息:{e}" + ) + + return model + +# ---------------------------- +# Data loader factory +# ---------------------------- +def build_dataloaders(args, rank, world_size): + if args.dataset == 'cifar10' or args.dataset == 'cifar100': + mean = (0.4914, 0.4822, 0.4465) + std = (0.2470, 0.2435, 0.2616) if args.dataset == 'cifar10' else (0.2023, 0.1994, 0.2010) + # train_transform = transforms.Compose([ + # transforms.RandomCrop(32, padding=4), + # transforms.RandomHorizontalFlip(), + # transforms.ToTensor(), + # transforms.Normalize(mean, std), + # ]) + # test_transform = transforms.Compose([ + # transforms.ToTensor(), + # transforms.Normalize(mean, std), + # ]) + + train_transform = transforms.Compose([ # 2025/12/3 从visformer模型开始 + transforms.Resize(256), # 先放大到 256 + transforms.RandomCrop(224), # 再随机裁剪为 224(更符合 ImageNet 风格增强) + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize(mean, std), + ]) + test_transform = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize(mean, std), + ]) + root = args.datapath + if args.dataset == 'cifar10': + train_set = datasets.CIFAR10(root=root, train=True, download=False, transform=train_transform) + val_set = datasets.CIFAR10(root=root, train=False, download=False, transform=test_transform) + num_classes = 10 + else: + train_set = datasets.CIFAR100(root=root, train=True, download=False, transform=train_transform) + val_set = datasets.CIFAR100(root=root, train=False, download=False, transform=test_transform) + num_classes = 100 + + elif args.dataset == 'imagenet': + train_dir = os.path.join(args.imagenet_dir, 'train') + val_dir = os.path.join(args.imagenet_dir, 'val') + train_transform = transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize((0.485,0.456,0.406), (0.229,0.224,0.225)), + ]) + test_transform = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize((0.485,0.456,0.406), (0.229,0.224,0.225)), + ]) + train_set = datasets.ImageFolder(train_dir, train_transform) + val_set = datasets.ImageFolder(val_dir, test_transform) + num_classes = args.num_classes or 1000 + + elif args.dataset == 'custom': + train_dir = os.path.join(args.datapath, 'train') + val_dir = args.custom_eval_dir or os.path.join(args.datapath, 'val') + train_transform = transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + ]) + test_transform = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + ]) + train_set = datasets.ImageFolder(train_dir, train_transform) + val_set = datasets.ImageFolder(val_dir, test_transform) + num_classes = len(train_set.classes) + else: + raise ValueError("Unknown dataset") + + if dist.is_initialized() and world_size > 1: + train_sampler = DistributedSampler(train_set, num_replicas=world_size, rank=rank, shuffle=True) + else: + train_sampler = None + + train_loader = DataLoader(train_set, + batch_size=args.batch_size, + shuffle=(train_sampler is None), + num_workers=args.num_workers, + pin_memory=True, + sampler=train_sampler, + drop_last=False) + val_loader = DataLoader(val_set, + batch_size=args.batch_size, + shuffle=False, + num_workers=args.num_workers, + pin_memory=True) + + return train_loader, val_loader, num_classes, train_sampler + +# ---------------------------- +# Train & validate +# ---------------------------- +def train_one_epoch(args, epoch, model, criterion, optimizer, train_loader, device, scaler, scheduler=None, train_sampler=None, global_step_start=0, max_global_steps=None): + """ + 现在支持:若 max_global_steps 非 None,则当 global_step 达到该值时提前退出 + 返回: epoch_summary_dict, step_logs_list, global_step_end + step_logs_list: list of dicts with per-step info (for logging to CSV if需要) + """ + batch_time = AverageMeter('Time') + data_time = AverageMeter('Data') + losses = AverageMeter('Loss') + top1 = AverageMeter('Acc@1') + top5 = AverageMeter('Acc@5') + + model.train() + end = time.time() + optimizer.zero_grad() + + iters = len(train_loader) + step_logs = [] + global_step = global_step_start + + for i, (images, targets) in enumerate(train_loader): + # check global steps limit + if (max_global_steps is not None) and (global_step >= max_global_steps): + break + + data_time.update(time.time() - end) + images = images.to(device, non_blocking=True) + targets = targets.to(device, non_blocking=True) + + if args.amp: + with amp.autocast(): + outputs = model(images) + loss = criterion(outputs, targets) / args.grad_accum_steps + else: + outputs = model(images) + loss = criterion(outputs, targets) / args.grad_accum_steps + + if args.amp: + scaler.scale(loss).backward() + else: + loss.backward() + + if (i + 1) % args.grad_accum_steps == 0: + if args.amp: + scaler.step(optimizer) + scaler.update() + else: + optimizer.step() + optimizer.zero_grad() + if scheduler is not None and args.scheduler_step_per_batch: + scheduler.step() + + with torch.no_grad(): + acc1, acc5 = accuracy(outputs, targets, topk=(1,5)) + losses.update(loss.item() * args.grad_accum_steps, images.size(0)) + top1.update(acc1.item(), images.size(0)) + top5.update(acc5.item(), images.size(0)) + + batch_time.update(time.time() - end) + end = time.time() + + # increment global step AFTER processing this batch + global_step += 1 + + # per-step print (controlled by print_freq) + # 输出格式调整为:Epoch[23]:step[1/32] step_train_loss 3.0075 acc1 25.95 acc5 54.46 + # 使用 i+1 / iters 更贴近人类可读的“第几步 / 总步数(该 epoch 内)” + if ((global_step % args.print_freq == 0) or (i == iters - 1)) and ((dist.get_rank() if dist.is_initialized() else 0) == 0): + lr = optimizer.param_groups[0]['lr'] + # note: losses.val is 当前 batch 的 loss(经过 grad_accum 处理后还原),losses.avg 是到目前为止的 epoch 平均 + print(f"Epoch[{epoch}]:step[{i+1}/{iters}] step_train_loss {losses.val:.4f} acc1 {top1.val:.2f} acc5 {top5.val:.2f}") + + # collect per-step log + step_logs.append({ + 'epoch': epoch, + 'batch_idx': i, + 'global_step': global_step, + 'lr': optimizer.param_groups[0]['lr'], + 'loss': losses.val, + 'loss_avg': losses.avg, + 'acc1': top1.val, + 'acc1_avg': top1.avg, + 'acc5': top5.val, + 'acc5_avg': top5.avg, + 'time': batch_time.val + }) + + # if reached max_global_steps inside epoch, break (handled at loop start next iter) + if (max_global_steps is not None) and (global_step >= max_global_steps): + # optional message + if (dist.get_rank() if dist.is_initialized() else 0) == 0: + print(f"[Info] 达到 max_global_steps={max_global_steps},将在 epoch 内提前停止。") + break + + if scheduler is not None and not args.scheduler_step_per_batch: + scheduler.step() + + return OrderedDict([('loss', losses.avg), ('acc1', top1.avg), ('acc5', top5.avg)]), step_logs, global_step + +def validate(args, model, val_loader, criterion, device): + losses = AverageMeter('Loss') + top1 = AverageMeter('Acc@1') + top5 = AverageMeter('Acc@5') + + model.eval() + with torch.no_grad(): + for i, (images, targets) in enumerate(tqdm(val_loader)): + images = images.to(device, non_blocking=True) + targets = targets.to(device, non_blocking=True) + outputs = model(images) + loss = criterion(outputs, targets) + acc1, acc5 = accuracy(outputs, targets, topk=(1,5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1.item(), images.size(0)) + top5.update(acc5.item(), images.size(0)) + return OrderedDict([('loss', losses.avg), ('acc1', top1.avg), ('acc5', top5.avg)]) + +# ---------------------------- +# Main +# ---------------------------- +def main(): + args = parse_args() + + # handle local_rank from env if not provided + local_rank_env = os.environ.get('LOCAL_RANK', None) + if args.local_rank is None and local_rank_env is not None: + args.local_rank = int(local_rank_env) + + distributed = (args.local_rank is not None and args.local_rank != -1) + if distributed: + dist.init_process_group(backend='nccl', init_method='env://') + rank = dist.get_rank() + world_size = dist.get_world_size() + else: + rank = 0 + world_size = 1 + + if distributed: + torch.cuda.set_device(args.local_rank) + device = torch.device('cuda', args.local_rank) + else: + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + + set_seed(args.seed + (rank if distributed else 0), deterministic=args.deterministic) + + save_dir = os.path.join('models', args.name) + if rank == 0: + os.makedirs(save_dir, exist_ok=True) + with open(os.path.join(save_dir, 'args.json'), 'w') as f: + json.dump(vars(args), f, indent=2) + if distributed: + dist.barrier() + + train_loader, val_loader, auto_num_classes, train_sampler = build_dataloaders(args, rank, world_size) + if args.num_classes is None: + args.num_classes = auto_num_classes + + # 使用本地 Model 优先(LocalModel 已在文件顶部尝试导入) + model = build_model_with_local_priority(args, device) + model.to(device) + + if distributed: + model = DDP(model, device_ids=[args.local_rank], output_device=args.local_rank, find_unused_parameters=True) + + criterion = nn.CrossEntropyLoss().to(device) + params = [p for p in model.parameters() if p.requires_grad] + if args.optimizer == 'sgd': + optimizer = optim.SGD(params, lr=args.lr, momentum=args.momentum, + weight_decay=args.weight_decay, nesterov=args.nesterov) + elif args.optimizer == 'adam': + optimizer = optim.Adam(params, lr=args.lr, weight_decay=args.weight_decay) + elif args.optimizer == 'adamw': + optimizer = optim.AdamW(params, lr=args.lr, weight_decay=args.weight_decay) + else: + raise ValueError('Unknown optimizer') + + scheduler = None + if args.scheduler == 'multistep': + scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=args.milestones, gamma=args.gamma) + elif args.scheduler == 'step': + scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=args.step_size, gamma=args.gamma) + elif args.scheduler == 'cosine': + scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=args.epochs) + elif args.scheduler == 'none': + scheduler = None + + scaler = amp.GradScaler() if args.amp else None + + start_epoch = args.start_epoch + best_acc = 0.0 + if args.resume: + if os.path.isfile(args.resume): + ckpt = torch.load(args.resume, map_location='cpu') + model_state = ckpt.get('state_dict', ckpt) + if isinstance(model, DDP): + model.module.load_state_dict(model_state) + else: + model.load_state_dict(model_state) + if 'optimizer' in ckpt: + optimizer.load_state_dict(ckpt['optimizer']) + start_epoch = ckpt.get('epoch', start_epoch) + best_acc = ckpt.get('best_acc', best_acc) + print(f"=> resumed from {args.resume}, start_epoch={start_epoch}") + else: + print(f"=> resume path {args.resume} not found") + + log_columns = ['epoch', 'lr', 'loss', 'acc1', 'acc5', 'val_loss', 'val_acc1', 'val_acc5'] + log_df = pd.DataFrame(columns=log_columns) + # step-level log + step_log_columns = ['epoch', 'batch_idx', 'global_step', 'lr', 'loss', 'loss_avg', 'acc1', 'acc1_avg', 'acc5', 'acc5_avg', 'time'] + step_log_df = pd.DataFrame(columns=step_log_columns) + + total_epochs = args.epochs + # global_step计数器(训练过程中跨epoch持续) + global_step = 0 + + epoch = start_epoch + # loop until either epoch criteria or step criteria met + while True: + if train_sampler is not None: + if args.seed_sampler: + train_sampler.set_epoch(epoch + args.seed) + else: + train_sampler.set_epoch(epoch) + + if rank == 0: + print(f"==== Epoch {epoch}/{total_epochs - 1} ====") + + # 如果传入了 args.steps (>0),则把剩余允许的 step 数传给 train_one_epoch, + # 否则 max_global_steps=None(按整 epoch 执行完) + if args.steps and args.steps > 0: + max_global_steps = args.steps + else: + max_global_steps = None + + train_log, step_logs, global_step = train_one_epoch( + args, epoch, model, criterion, optimizer, train_loader, device, scaler, + scheduler, train_sampler, global_step_start=global_step, max_global_steps=max_global_steps + ) + + # 如果启用了按 steps 的模式且已经达到上限,直接退出 main(跳过 validate) + if max_global_steps is not None and global_step >= max_global_steps: + if rank == 0: + print(f"[Main] 达到 max_global_steps={max_global_steps}(global_step={global_step}),提前退出训练(跳过验证)。") + # 直接返回 main(),不再执行后续 validate / 保存逻辑 + return + + # 验证并记录 epoch 级别日志(如果在 step 模式下很可能在中间某个 epoch 提前结束,但我们仍做一次 validate) + val_log = validate(args, model, val_loader, criterion, device) + current_lr = optimizer.param_groups[0]['lr'] + + if rank == 0: + # epoch summary print, 格式与示例对齐 + print(f"Epoch[{epoch}]: epoch_train_loss {train_log['loss']:.4f} acc1 {train_log['acc1']:.2f} acc5 {train_log['acc5']:.2f} | " + f"val_loss {val_log['loss']:.4f} acc1 {val_log['acc1']:.2f} acc5 {val_log['acc5']:.2f} lr {current_lr:.6f}") + row = { + 'epoch': epoch, + 'lr': current_lr, + 'loss': train_log['loss'], + 'acc1': train_log['acc1'], + 'acc5': train_log['acc5'], + 'val_loss': val_log['loss'], + 'val_acc1': val_log['acc1'], + 'val_acc5': val_log['acc5'], + } + new_row_df = pd.DataFrame([row]) + log_df = pd.concat([log_df, new_row_df], ignore_index=True) + log_df.to_csv(os.path.join(save_dir, 'log.csv'), index=False) + + is_best = val_log['acc1'] > best_acc + if is_best: + best_acc = val_log['acc1'] + if (epoch % args.save_freq == 0) or is_best or ( (max_global_steps is None) and (epoch == total_epochs - 1) ) : + state = { + 'epoch': epoch, + 'state_dict': model.module.state_dict() if isinstance(model, DDP) else model.state_dict(), + 'best_acc': best_acc, + 'optimizer': optimizer.state_dict(), + 'args': vars(args) + } + save_checkpoint(state, is_best, save_dir, filename=f'checkpoint_epoch_{epoch}.pth') + + # increment epoch + epoch += 1 + + # stopping conditions: + # 1) if steps mode enabled and reached steps -> stop + if args.steps and args.steps > 0: + if global_step >= args.steps: + if rank == 0: + print(f"[Main] 已达到指定 steps={args.steps}(global_step={global_step}),训练结束。") + break + + # 2) if steps not used, stop when epoch >= epochs + else: + if epoch >= total_epochs: + if rank == 0: + print(f"[Main] 已达到指定 epochs={total_epochs}(epoch={epoch}),训练结束。") + break + + if dist.is_initialized(): + dist.barrier() + if rank == 0: + print("Training finished. Best val acc1: {:.2f}".format(best_acc)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/PyTorch/build-in/Classification/Xception/xception.py b/PyTorch/build-in/Classification/Xception/xception.py new file mode 100644 index 000000000..517700904 --- /dev/null +++ b/PyTorch/build-in/Classification/Xception/xception.py @@ -0,0 +1,239 @@ +""" +Creates an Xception Model as defined in: + +Francois Chollet +Xception: Deep Learning with Depthwise Separable Convolutions +https://arxiv.org/pdf/1610.02357.pdf + +This weights ported from the Keras implementation. Achieves the following performance on the validation set: + +Loss:0.9173 Prec@1:78.892 Prec@5:94.292 + +REMEMBER to set your image size to 3x299x299 for both test and validation + +normalize = transforms.Normalize(mean=[0.5, 0.5, 0.5], + std=[0.5, 0.5, 0.5]) + +The resize parameter of the validation transform should be 333, and make sure to center crop at 299x299 +""" +import math +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +from torch.nn import init +import torch + +__all__ = ['xception'] + +model_urls = { +# 'xception':'https://www.dropbox.com/s/1hplpzet9d7dv29/xception-c0a72b38.pth.tar?dl=1' + 'xception':'http://data.lip6.fr/cadene/pretrainedmodels/xception-43020ad28.pth' +} + + +class SeparableConv2d(nn.Module): + def __init__(self,in_channels,out_channels,kernel_size=1,stride=1,padding=0,dilation=1,bias=False): + super(SeparableConv2d,self).__init__() + + self.conv1 = nn.Conv2d(in_channels,in_channels,kernel_size,stride,padding,dilation,groups=in_channels,bias=bias) + self.pointwise = nn.Conv2d(in_channels,out_channels,1,1,0,1,1,bias=bias) + + def forward(self,x): + x = self.conv1(x) + x = self.pointwise(x) + return x + + +class Block(nn.Module): + def __init__(self, in_filters, out_filters, reps, strides=1, + start_with_relu=True, grow_first=True): + super(Block, self).__init__() + + if out_filters != in_filters or strides != 1: + self.skip = nn.Conv2d(in_filters, out_filters, 1, stride=strides, bias=False) + self.skipbn = nn.BatchNorm2d(out_filters) + else: + self.skip = None + + rep = [] + filters = in_filters + + # 如果要先 relu,则显式添加一个 non-inplace ReLU(不要依赖 later 替换) + if grow_first: + if start_with_relu: + rep.append(nn.ReLU(inplace=False)) + # grow first: first separable conv goes from in_filters -> out_filters + rep.append(SeparableConv2d(in_filters, out_filters, 3, stride=1, padding=1, bias=False)) + rep.append(nn.BatchNorm2d(out_filters)) + filters = out_filters + else: + # not grow_first: if start_with_relu we still want a ReLU before the first sepconv + if start_with_relu: + rep.append(nn.ReLU(inplace=False)) + + # 中间重复层(reps-1 次) + for i in range(reps - 1): + rep.append(nn.ReLU(inplace=False)) + rep.append(SeparableConv2d(filters, filters, 3, stride=1, padding=1, bias=False)) + rep.append(nn.BatchNorm2d(filters)) + + # 非 grow_first 情况,需要最后把 in_filters -> out_filters 的层加上 + if not grow_first: + rep.append(nn.ReLU(inplace=False)) + rep.append(SeparableConv2d(in_filters, out_filters, 3, stride=1, padding=1, bias=False)) + rep.append(nn.BatchNorm2d(out_filters)) + + # 如果不希望以 ReLU 开头(start_with_relu=False),删除第一个元素(若它是 ReLU) + if not start_with_relu and len(rep) > 0 and isinstance(rep[0], nn.ReLU): + rep = rep[1:] + + # 如果需要下采样,用 MaxPool2d(保持原先的语义) + if strides != 1: + rep.append(nn.MaxPool2d(3, strides, 1)) + + self.rep = nn.Sequential(*rep) + + def forward(self, inp): + x = self.rep(inp) + + if self.skip is not None: + skip = self.skip(inp) + skip = self.skipbn(skip) + else: + skip = inp + + x = x + skip + return x + + + +class Xception(nn.Module): + """ + Xception optimized for the ImageNet dataset, as specified in + https://arxiv.org/pdf/1610.02357.pdf + """ + def __init__(self, num_classes=1000): + """ Constructor + Args: + num_classes: number of classes + """ + super(Xception, self).__init__() + + + self.num_classes = num_classes + + self.conv1 = nn.Conv2d(3, 32, 3,2, 0, bias=False) + self.bn1 = nn.BatchNorm2d(32) + # self.relu = nn.ReLU(inplace=True) + self.relu = nn.ReLU(inplace=False) # 或直接 nn.ReLU() + + self.conv2 = nn.Conv2d(32,64,3,bias=False) + self.bn2 = nn.BatchNorm2d(64) + #do relu here + + self.block1=Block(64,128,2,2,start_with_relu=False,grow_first=True) + self.block2=Block(128,256,2,2,start_with_relu=True,grow_first=True) + self.block3=Block(256,728,2,2,start_with_relu=True,grow_first=True) + + self.block4=Block(728,728,3,1,start_with_relu=True,grow_first=True) + self.block5=Block(728,728,3,1,start_with_relu=True,grow_first=True) + self.block6=Block(728,728,3,1,start_with_relu=True,grow_first=True) + self.block7=Block(728,728,3,1,start_with_relu=True,grow_first=True) + + self.block8=Block(728,728,3,1,start_with_relu=True,grow_first=True) + self.block9=Block(728,728,3,1,start_with_relu=True,grow_first=True) + self.block10=Block(728,728,3,1,start_with_relu=True,grow_first=True) + self.block11=Block(728,728,3,1,start_with_relu=True,grow_first=True) + + self.block12=Block(728,1024,2,2,start_with_relu=True,grow_first=False) + + self.conv3 = SeparableConv2d(1024,1536,3,1,1) + self.bn3 = nn.BatchNorm2d(1536) + + #do relu here + self.conv4 = SeparableConv2d(1536,2048,3,1,1) + self.bn4 = nn.BatchNorm2d(2048) + + self.fc = nn.Linear(2048, num_classes) + + + + #------- init weights -------- + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2. / n)) + elif isinstance(m, nn.BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + #----------------------------- + + + + + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + + x = self.conv2(x) + x = self.bn2(x) + x = self.relu(x) + + x = self.block1(x) + x = self.block2(x) + x = self.block3(x) + x = self.block4(x) + x = self.block5(x) + x = self.block6(x) + x = self.block7(x) + x = self.block8(x) + x = self.block9(x) + x = self.block10(x) + x = self.block11(x) + x = self.block12(x) + + x = self.conv3(x) + x = self.bn3(x) + x = self.relu(x) + + x = self.conv4(x) + x = self.bn4(x) + x = self.relu(x) + + x = F.adaptive_avg_pool2d(x, (1, 1)) + x = x.view(x.size(0), -1) + x = self.fc(x) + + return x + +class XceptionCIFAR(Xception): + def __init__(self, num_classes=10): + super().__init__(num_classes=num_classes) + + # 修改 conv1 stride 避免过度下采样 + self.conv1.stride = (1,1) + + # block1 stride 也改为1 + self.block1 = Block(64, 128, 2, 1, start_with_relu=False, grow_first=True) + + +def xception(pretrained=False,**kwargs): + """ + Construct Xception. + """ + + model = Xception(**kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['xception'])) + return model + +# welo: your custom entry for CIFAR +def Model(num_classes=100, pretrained=False): + model = XceptionCIFAR(num_classes=num_classes) + if pretrained: + print("Warning: pretrained ImageNet weights may not fully match CIFAR input size.") + # 可以尝试加载部分权重 + # model.load_state_dict(model_zoo.load_url(model_urls['xception']), strict=False) + return model \ No newline at end of file From 3939d5693e450272e0d210f75357666f566f85b6 Mon Sep 17 00:00:00 2001 From: wangwl Date: Wed, 7 Jan 2026 06:27:37 +0000 Subject: [PATCH 2/3] fix: cleanup code and update --- .../Classification/Xception/coverage.txt | 3 - .../build-in/Classification/Xception/loss.jpg | Bin 36711 -> 0 bytes .../build-in/Classification/Xception/loss.txt | 26 ----- .../build-in/Classification/Xception/readme | 65 +++++++++++++ .../Xception/requirements_exact.txt | 89 ++++++++++++++++++ 5 files changed, 154 insertions(+), 29 deletions(-) delete mode 100644 PyTorch/build-in/Classification/Xception/coverage.txt delete mode 100644 PyTorch/build-in/Classification/Xception/loss.jpg delete mode 100644 PyTorch/build-in/Classification/Xception/loss.txt create mode 100644 PyTorch/build-in/Classification/Xception/readme create mode 100644 PyTorch/build-in/Classification/Xception/requirements_exact.txt diff --git a/PyTorch/build-in/Classification/Xception/coverage.txt b/PyTorch/build-in/Classification/Xception/coverage.txt deleted file mode 100644 index c6e1a7a41..000000000 --- a/PyTorch/build-in/Classification/Xception/coverage.txt +++ /dev/null @@ -1,3 +0,0 @@ -all api: ['_amp_foreach_non_finite_check_and_unscale_', '_amp_update_scale_', '_copy_from', '_has_compatible_shallow_copy_type', '_local_scalar_dense', '_log_softmax', '_log_softmax_backward_data', '_pin_memory', '_reshape_alias', 'add', 'add_', 'addmm', 'as_strided', 'as_strided_', 'convolution', 'convolution_backward', 'copy_stride', 'div', 'eq', 'fill_', 'fused_sgd', 'is_pinned', 'linear', 'max_pool2d', 'maxpool2d_backward', 'maxpool2d_forward', 'mean', 'mm', 'mul', 'mul_', 'native_batch_norm', 'native_batch_norm_backward', 'nll_loss_backward', 'nll_loss_forward', 'reciprocal', 'relu', 'sum', 'threshold_backward', 'topk_out', 'view', 'zero_'], total: 41 -fallback op: [], total: 0 -coverage rate: 100.00% diff --git a/PyTorch/build-in/Classification/Xception/loss.jpg b/PyTorch/build-in/Classification/Xception/loss.jpg deleted file mode 100644 index b34bde922aeef07bbe7f7b88687cb03a4d266767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36711 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ͻkn?rgl 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 n$i?Wa`OuaXUe2o)lv=@T3K`*a6ihG=U&9h{K< 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 Date: Thu, 8 Jan 2026 10:30:48 +0000 Subject: [PATCH 3/3] fix: rename files and update code --- PyTorch/build-in/Classification/Xception/{readme => readme.md} | 0 .../Xception/{requirements_exact.txt => requirements.txt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename PyTorch/build-in/Classification/Xception/{readme => readme.md} (100%) rename PyTorch/build-in/Classification/Xception/{requirements_exact.txt => requirements.txt} (100%) diff --git a/PyTorch/build-in/Classification/Xception/readme b/PyTorch/build-in/Classification/Xception/readme.md similarity index 100% rename from PyTorch/build-in/Classification/Xception/readme rename to PyTorch/build-in/Classification/Xception/readme.md diff --git a/PyTorch/build-in/Classification/Xception/requirements_exact.txt b/PyTorch/build-in/Classification/Xception/requirements.txt similarity index 100% rename from PyTorch/build-in/Classification/Xception/requirements_exact.txt rename to PyTorch/build-in/Classification/Xception/requirements.txt