From 462f3a15332e83aec2201277110c9e6970951bd6 Mon Sep 17 00:00:00 2001 From: iamhankai Date: Tue, 31 Aug 2021 21:25:09 +0800 Subject: [PATCH] add versatile filters --- readme.md | 15 +- versatile_filters/License.txt | 13 + ...HIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt | 74 ++++ versatile_filters/fig/config.png | Bin 0 -> 39188 bytes versatile_filters/fig/versatile.png | Bin 0 -> 42159 bytes versatile_filters/fig/versatile2.png | Bin 0 -> 43225 bytes versatile_filters/imagenet-vcnn.py | 376 ++++++++++++++++++ versatile_filters/readme.md | 54 +++ versatile_filters/vcnn.py | 242 +++++++++++ 9 files changed, 773 insertions(+), 1 deletion(-) create mode 100755 versatile_filters/License.txt create mode 100755 versatile_filters/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt create mode 100755 versatile_filters/fig/config.png create mode 100755 versatile_filters/fig/versatile.png create mode 100755 versatile_filters/fig/versatile2.png create mode 100755 versatile_filters/imagenet-vcnn.py create mode 100755 versatile_filters/readme.md create mode 100755 versatile_filters/vcnn.py diff --git a/readme.md b/readme.md index f56b1bd..e2ffb4b 100755 --- a/readme.md +++ b/readme.md @@ -4,11 +4,14 @@ including GhostNet, TinyNet, TNT (Transformer in Transformer) developed by Huawe - [TinyNet Code](#tinynet-code) - [TNT Code](#tnt-code) - [LegoNet Code](#legonet-code) +- [Versatile Filters Code](#versatile-filters-code) - [Citation](#citation) - [Other versions](#other-versions) **News** +2021/08/31 The code of Versatile Filters (https://github.com/huawei-noah/Versatile-Filters) has been merged into this repo. + 2021/08/26 The code of LegoNet (https://github.com/huawei-noah/LegoNet) has been merged into this repo. 2021/06/15 The code of TNT (Transformer in Transformer) has been released in this repo. @@ -45,9 +48,13 @@ This repo provides **training code** of TNT (Transformer in Transformer) for PyT - We also opensource code on [MindSpore Model Zoo](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/TNT). ## LegoNet Code -This repo provides the implementation of ICML2019 paper [LegoNet: Efficient Convolutional Neural Networks with Lego Filters](http://proceedings.mlr.press/v97/yang19c/yang19c.pdf) +This repo provides the implementation of paper [LegoNet: Efficient Convolutional Neural Networks with Lego Filters (ICML 2019)](http://proceedings.mlr.press/v97/yang19c/yang19c.pdf) - PyTorch: [./legonet_pytorch](https://github.com/huawei-noah/CV-backbones/tree/master/legonet_pytorch). +## Versatile Filters Code +This repo provides the implementation of paper [Learning Versatile Filters for Efficient Convolutional Neural Networks (NeurIPS 2018)](https://papers.nips.cc/paper/7433-learning-versatile-filters-for-efficient-convolutional-neural-networks) +- PyTorch: [./versatile_filters](https://github.com/huawei-noah/CV-backbones/tree/master/versatile_filters). + ## Citation ``` @@ -75,6 +82,12 @@ This repo provides the implementation of ICML2019 paper [LegoNet: Efficient Conv booktitle={ICML}, year={2019} } +@inproceedings{wang2018learning, + title={Learning versatile filters for efficient convolutional neural networks}, + author={Wang, Yunhe and Xu, Chang and Chunjing, XU and Xu, Chao and Tao, Dacheng}, + booktitle={NeurIPS}, + year={2018} +} ``` ## Other versions of GhostNet diff --git a/versatile_filters/License.txt b/versatile_filters/License.txt new file mode 100755 index 0000000..5976bc1 --- /dev/null +++ b/versatile_filters/License.txt @@ -0,0 +1,13 @@ +Copyright (c) 2019. Huawei Technologies Co., Ltd. + All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/versatile_filters/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt b/versatile_filters/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt new file mode 100755 index 0000000..fa030c1 --- /dev/null +++ b/versatile_filters/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt @@ -0,0 +1,74 @@ +Please note we provide an open source software notice for the third party open source software along with this software and/or this software component contributed by Huawei (in the following just “this SOFTWARE”). The open source software licenses are granted by the respective right holders. + +Warranty Disclaimer +THE OPEN SOURCE SOFTWARE IN THIS SOFTWARE IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + +Copyright Notice and License Texts +Software: PyTorch Examples 0.4 +Copyright notice: +Copyright (c) 2017 + +License: BSD 3-Clause License + +Copyright (c) 2017, +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright Notice and License Texts +Software: torchvision 0.2.0 +Copyright notice: +Copyright (c) Soumith Chintala 2016 + +License: BSD 3-Clause License + +Copyright (c) Soumith Chintala 2016, +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/versatile_filters/fig/config.png b/versatile_filters/fig/config.png new file mode 100755 index 0000000000000000000000000000000000000000..14742a58282544c17d065756549a5f066b2dd147 GIT binary patch literal 39188 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�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Ø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 literal 0 HcmV?d00001 diff --git a/versatile_filters/fig/versatile2.png b/versatile_filters/fig/versatile2.png new file mode 100755 index 0000000000000000000000000000000000000000..0891728df97e7f0a04d2da210986f581a6b5af33 GIT binary patch literal 43225 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%0A#<|94()+mhEI4KR zb&`YGtS|(a5N{emH!3Ih6!^EWz;epdN;=Fjj+FTsHMeyFHauGf=n4OB& z`w29pIzkMHMLzFfA;9eMrSnV6aDN@)09Q`Tk{#(nkObLI>m+Zdm{~QxAxAb z1MJ&lQhd3fcp-lKyndOYiqE=3Gs7}J{~uZ6E}_FNfU~#nM9CZQ&lgAxgX69^kc{~0?#|8@z@=iK zqkjNLK$5wcscH71>n2ywH}|bf|E-pX-IlGZHNE*vge`R*&)|}X5CseIzrcCekbiE345-$FfSOu~ae#va@wL&TJYQ-p&%UYQ z>h0^x&ivqSQgb}-u$b#~x-n9s(?=S1xmP(f8ZE{9Ns8wj!|l9CGk3SNA&k&z4HXo9 z(144QBr|f;Qy$EL=zPgs!Pk33DV#$7zD6K+oHkI`9-tzjOIpI`swB&Tr|z%SpU&t0 zMrrtqI^%`!@0pj7I`(Rp(aCc!t%H16V!*%aEd~t49$4i57nmIXOHBiIs}(_g80DhK zBE_=2-Le*qI@`6Ms4K>EkHJ@VBD&A;EEB;&4qKTLLi&$CB%gxh0TASf`DHG_OmnKNj^Tt}kv^o7Z$EgbM^8N>e6k6Jmzd#t}~ z+Y|P9&(Z(|55XE^00Z`NA^nNEK_(XW!|YA4zPmwr8$(UufN8AqOVJ+Fl
Z_?S{ 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 Koq}sN!T$jt%HDSX literal 0 HcmV?d00001 diff --git a/versatile_filters/imagenet-vcnn.py b/versatile_filters/imagenet-vcnn.py new file mode 100755 index 0000000..6025adc --- /dev/null +++ b/versatile_filters/imagenet-vcnn.py @@ -0,0 +1,376 @@ +# 2019.07.24-Changed for training and testing versatile filters +# Huawei Technologies Co., Ltd. +import argparse +import os +import random +import shutil +import time +import warnings +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +#import torchvision.models as models + +import vcnn as models + +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--arch', '-a', metavar='ARCH', default='vgg16bn', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: vgg16bn)') +parser.add_argument('-j', '--workers', default=16, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=130, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=256, type=int, + metavar='N', help='mini-batch size (default: 256)') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--weight-decay', '--wd', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)') +parser.add_argument('--print-freq', '-p', default=50, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--save-path', default='/tmp/data/hankai/', type=str, + help='path to latest checkpoint (default: none)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=1, type=int, + help='number of distributed processes') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='gloo', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +# for cloud +parser.add_argument('--num_gpus', default=8, + type=int, metavar='N', + help='number of GPUs') +parser.add_argument('--data_url', type=str, + help='path to dataset') +parser.add_argument('--train_url', type=str, help='train_dir') +parser.add_argument('--tmp_data_dir', default='/cache/imagenet/', help='temp data dir') +parser.add_argument('--tmp_save_dir', default='/cache/save/', help='temp save dir') + +# Copy data to temp dir +args = parser.parse_args() +import moxing as mox +if not mox.file.exists(args.tmp_data_dir): + mox.file.make_dirs(args.tmp_data_dir) +if not mox.file.exists(args.tmp_save_dir): + mox.file.make_dirs(args.tmp_save_dir) + +source = os.path.join(args.data_url) +target = os.path.join(args.tmp_data_dir) +mox.file.copy_parallel(source, target) + +tmp_resume = os.path.join(args.tmp_save_dir, 'resume.pth') +if args.resume: + mox.file.copy_parallel(args.resume, tmp_resume) + args.resume = tmp_resume + +best_prec1 = 0 + +def main(): + global args, best_prec1 + args = parser.parse_args() + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + args.distributed = args.world_size > 1 + + if args.distributed: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size) + + # create model + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + + if args.gpu is not None: + model = model.cuda(args.gpu) + elif args.distributed: + model.cuda() + model = torch.nn.parallel.DistributedDataParallel(model) + else: + if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + model.features = torch.nn.DataParallel(model.features) + model.cuda() + else: + model = torch.nn.DataParallel(model).cuda() + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().cuda(args.gpu) + + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + # optionally resume from a checkpoint + if args.resume: + args.resume = tmp_resume + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(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.load_state_dict(checkpoint['optimizer']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + # Data loading code + traindir = os.path.join(args.tmp_data_dir, 'train') + valdir = os.path.join(args.tmp_data_dir, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True) + + if args.evaluate: + validate(val_loader, model, criterion) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + adjust_learning_rate(optimizer, epoch) + + # train for one epoch + train(train_loader, model, criterion, optimizer, epoch) + + # evaluate on validation set + prec1 = validate(val_loader, model, criterion) + + # remember best prec@1 and save checkpoint + is_best = prec1 > best_prec1 + best_prec1 = max(prec1, best_prec1) + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_prec1': best_prec1, + 'optimizer' : optimizer.state_dict(), + }, is_best) + + # timely backup + source = os.path.join(args.tmp_save_dir) + target = os.path.join(args.train_url) + mox.file.copy_parallel(source, target) + + +def train(train_loader, model, criterion, optimizer, epoch): + batch_time = AverageMeter() + data_time = AverageMeter() + losses = AverageMeter() + top1 = AverageMeter() + top5 = AverageMeter() + + # switch to train mode + model.train() + + end = time.time() + for i, (input, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + if args.gpu is not None: + input = input.cuda(args.gpu, non_blocking=True) + target = target.cuda(args.gpu, non_blocking=True) + + # compute output + output = model(input) + loss = criterion(output, target) + + # measure accuracy and record loss + prec1, prec5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), input.size(0)) + top1.update(prec1[0], input.size(0)) + top5.update(prec5[0], input.size(0)) + + # compute gradient and do SGD step + optimizer.zero_grad() + loss.backward() + optimizer.step() + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + print('Epoch: [{0}][{1}/{2}]\t' + 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' + 'Data {data_time.val:.3f} ({data_time.avg:.3f})\t' + 'Loss {loss.val:.4f} ({loss.avg:.4f})\t' + 'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' + 'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( + epoch, i, len(train_loader), batch_time=batch_time, + data_time=data_time, loss=losses, top1=top1, top5=top5)) + + +def validate(val_loader, model, criterion): + batch_time = AverageMeter() + losses = AverageMeter() + top1 = AverageMeter() + top5 = AverageMeter() + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (input, target) in enumerate(val_loader): + if args.gpu is not None: + input = input.cuda(args.gpu, non_blocking=True) + target = target.cuda(args.gpu, non_blocking=True) + + # compute output + output = model(input) + loss = criterion(output, target) + + # measure accuracy and record loss + prec1, prec5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), input.size(0)) + top1.update(prec1[0], input.size(0)) + top5.update(prec5[0], input.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + print('Test: [{0}/{1}]\t' + 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' + 'Loss {loss.val:.4f} ({loss.avg:.4f})\t' + 'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' + 'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( + i, len(val_loader), batch_time=batch_time, loss=losses, + top1=top1, top5=top5)) + + print(' * Prec@1 {top1.avg:.3f} Prec@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + filename = args.tmp_save_dir+filename + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, filename+'_best.pth.tar') + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self): + 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 / self.count + + +def adjust_learning_rate(optimizer, epoch): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 40)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/versatile_filters/readme.md b/versatile_filters/readme.md new file mode 100755 index 0000000..8c88b85 --- /dev/null +++ b/versatile_filters/readme.md @@ -0,0 +1,54 @@ +## Versatile Filters + +Code for paper: [Yunhe Wang, et al. Learning Versatile Filters for Efficient Convolutional Neural Networks (NeurIPS 2018)](https://papers.nips.cc/paper/7433-learning-versatile-filters-for-efficient-convolutional-neural-networks) + +This paper introduces versatile filters to construct efficient convolutional neural network. A series of secondary filters can be derived from a primary filter. These secondary filters all inherit in the primary filter without occupying more storage, but once been unfolded in computation they could significantly enhance the capability of the filter by integrating information extracted from different receptive fields. Besides spatial versatile filters, we additionally investigate versatile filters from the channel perspective. The new techniques are general to upgrade filters in existing CNNs, which are able to achieve comparable accuracy as that of original filters, but require less memory and FLOPs. + + + + +### Files description +Platform: Pytorch 0.4 + +`vcnn.py` is the implementation of Versatile Convolution (an example of VGG-16). The `VConv2d` class can be used to replace the `nn.Conv2d` in any CNN. + +`imagenet-vcnn.py` is the script for training ImageNet on Huawei Cloud DLS. + +### Getting Started +Run `imagenet-vcnn.py` to train and test the model. + +- **Hyper-paprameters** in `VConv2d`: +- `delta`: (c-\hat{c}) in Eq.(6) +- `g`: g in Eq.(6) + +### Performance +- ImageNet Classification (code in this repo) + +| backbone | method | top1 acc (%) | top5 acc (%) | +|--------|---------------------------|----------|----------| +| VGG-16 | spatial versatile filters | 72.2 | 91.1 | + +- COCO Object Detection using Faster R-CNN + +|Backbone|Memory (MB)|FLOPs (B)|mAP (%)| +|-|-|-|-| +|ResNet50|97.2|4.1|33.1| +|Versatile-v1-ResNet50|75.6|3.2|33.0| +|Versatile-v2-ResNet50|41.7|3.0|31.3| + +### Citation +If you use these models in your research, please cite: +``` +@inproceedings{wang2018learning, + title={Learning versatile filters for efficient convolutional neural networks}, + author={Wang, Yunhe and Xu, Chang and Chunjing, XU and Xu, Chao and Tao, Dacheng}, + booktitle={Advances in Neural Information Processing Systems}, + pages={1608--1618}, + year={2018} +} +``` + +### Contributing +We appreciate all contributions. If you are planning to contribute back bug-fixes, please do so without any further discussion. + +If you plan to contribute new features, utility functions or extensions to the core, please first open an issue and discuss the feature with us. Sending a PR without discussion might end up resulting in a rejected PR, because we might be taking the core in a different direction than you might be aware of. diff --git a/versatile_filters/vcnn.py b/versatile_filters/vcnn.py new file mode 100755 index 0000000..2661c95 --- /dev/null +++ b/versatile_filters/vcnn.py @@ -0,0 +1,242 @@ +# 2019.07.24-Changed for building versatile filters +# Huawei Technologies Co., Ltd. +import torch +import torch.nn as nn +import torch.utils.model_zoo as model_zoo +import torch.nn.functional as F +from torch.nn.modules.utils import _pair +import math +import numpy as np + +__all__ = [ + 'VGG', 'vgg11', 'vgg11_bn', 'vgg13', 'vgg13_bn', 'vgg16', 'vgg16_bn', + 'vgg19_bn', 'vgg19', +] + + +model_urls = { + 'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth', + 'vgg13': 'https://download.pytorch.org/models/vgg13-c768596a.pth', + 'vgg16': 'https://download.pytorch.org/models/vgg16-397923af.pth', + 'vgg19': 'https://download.pytorch.org/models/vgg19-dcbb9e9d.pth', + 'vgg11_bn': 'https://download.pytorch.org/models/vgg11_bn-6002323d.pth', + 'vgg13_bn': 'https://download.pytorch.org/models/vgg13_bn-abd245e5.pth', + 'vgg16_bn': 'https://download.pytorch.org/models/vgg16_bn-6c64b313.pth', + 'vgg19_bn': 'https://download.pytorch.org/models/vgg19_bn-c79401a0.pth', +} + +class VConv2d(nn.modules.conv._ConvNd): + """ + Versatile Filters + Paper: https://papers.nips.cc/paper/7433-learning-versatile-filters-for-efficient-convolutional-neural-networks + """ + def __init__(self, in_channels, out_channels, kernel_size, stride=1, + padding=0, dilation=1, groups=1, bias=True, delta=0, g=1): + kernel_size = _pair(kernel_size) + stride = _pair(stride) + padding = _pair(padding) + dilation = _pair(dilation) + super(VConv2d, self).__init__( + in_channels, out_channels, kernel_size, stride, padding, dilation, + False, _pair(0), groups, bias) + self.s_num = int(np.ceil(self.kernel_size[0]/2)) # s in paper + self.delta = delta # c-\hat{c} in paper + self.g = g # g in paper + self.weight = nn.Parameter(torch.Tensor( + int(out_channels/self.s_num/(1+self.delta/self.g)), in_channels // groups, *kernel_size)) + self.reset_parameters() + + def forward(self, x): + x_list = [] + s_num = self.s_num + ch_ratio = (1+self.delta/self.g) + ch_len = self.in_channels - self.delta + for s in range(s_num): + for start in range(0, self.delta+1, self.g): + weight1 = self.weight[:, :ch_len, s:self.kernel_size[0]-s, s:self.kernel_size[0]-s] + if self.padding[0]-s < 0: + h = x.size(2) + x1 = x[:,start:start+ch_len,s:h-s,s:h-s] + padding1 = _pair(0) + else: + x1 = x[:,start:start+ch_len,:,:] + padding1 = _pair(self.padding[0]-s) + x_list.append(F.conv2d(x1, weight1, self.bias[int(self.out_channels*(s*ch_ratio+start)/s_num/ch_ratio):int(self.out_channels*(s*ch_ratio+start+1)/s_num/ch_ratio)], self.stride, + padding1, self.dilation, self.groups)) + x = torch.cat(x_list, 1) + return x + +class VGG(nn.Module): + + def __init__(self, features, num_classes=1000, init_weights=True): + super(VGG, self).__init__() + self.features = features + self.fc6 = VConv2d(512, 4096, kernel_size=7, padding=0) + self.classifier = nn.Sequential( + #nn.Linear(512 * 7 * 7, 4096), + nn.ReLU(True), + nn.Dropout(), + nn.Linear(4096, 4096), + nn.ReLU(True), + nn.Dropout(), + nn.Linear(4096, num_classes), + ) + if init_weights: + self._initialize_weights() + + def forward(self, x): + x = self.features(x) + x = self.fc6(x) + x = x.view(x.size(0), -1) + x = self.classifier(x) + return x + + def _initialize_weights(self): + for m in self.modules(): + if isinstance(m, VConv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') + if m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + nn.init.constant_(m.bias, 0) + + +def make_layers(cfg, batch_norm=False): + layers = [] + in_channels = 3 + for v in cfg: + if v == 'M': + layers += [nn.MaxPool2d(kernel_size=2, stride=2)] + else: + conv2d = VConv2d(in_channels, v, kernel_size=3, padding=1) + if batch_norm: + layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)] + else: + layers += [conv2d, nn.ReLU(inplace=True)] + in_channels = v + return nn.Sequential(*layers) + + +cfg = { + 'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], + 'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], + 'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'], + 'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'], +} + + +def vgg11(pretrained=False, **kwargs): + """VGG 11-layer model (configuration "A") + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['A']), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg11'])) + return model + + +def vgg11_bn(pretrained=False, **kwargs): + """VGG 11-layer model (configuration "A") with batch normalization + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['A'], batch_norm=True), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg11_bn'])) + return model + + +def vgg13(pretrained=False, **kwargs): + """VGG 13-layer model (configuration "B") + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['B']), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg13'])) + return model + + +def vgg13_bn(pretrained=False, **kwargs): + """VGG 13-layer model (configuration "B") with batch normalization + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['B'], batch_norm=True), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg13_bn'])) + return model + + +def vgg16(pretrained=False, **kwargs): + """VGG 16-layer model (configuration "D") + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['D']), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg16'])) + return model + + +def vgg16_bn(pretrained=False, **kwargs): + """VGG 16-layer model (configuration "D") with batch normalization + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['D'], batch_norm=True), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg16_bn'])) + return model + + +def vgg19(pretrained=False, **kwargs): + """VGG 19-layer model (configuration "E") + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['E']), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg19'])) + return model + + +def vgg19_bn(pretrained=False, **kwargs): + """VGG 19-layer model (configuration 'E') with batch normalization + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + if pretrained: + kwargs['init_weights'] = False + model = VGG(make_layers(cfg['E'], batch_norm=True), **kwargs) + if pretrained: + model.load_state_dict(model_zoo.load_url(model_urls['vgg19_bn'])) + return model +