idea怎么做网站,重庆建筑网站,不同用户入口的网站样板,网站建设项目怎么写第一步#xff1a;准备数据
17种猴子动物数据#xff1a;
self.class_indict [白头卷尾猴, 弥猴, 山魈, 松鼠猴, 叶猴, 银色绒猴, 印度乌叶猴, 疣猴, 侏绒… 第一步准备数据
17种猴子动物数据
self.class_indict [白头卷尾猴, 弥猴, 山魈, 松鼠猴, 叶猴, 银色绒猴, 印度乌叶猴, 疣猴, 侏绒,白秃猴, 赤猴, 滇金丝猴, 狒狒, 黑色吼猴, 黑叶猴, 金丝猴, 懒猴]总共有1800张图片每个文件夹单独放一种数据 第二步搭建模型
本文选择一个ShufflenetV2网络其原理介绍如下
shufflenet v2是旷视提出的shufflenet的升级版本并被ECCV2018收录。论文说在同等复杂度下shufflenet v2比shufflenet和mobilenetv2更准确。shufflenet v2是基于四条准则对shufflenet v1进行改进而得到的这四条准则如下
G1同等通道大小最小化内存访问量 对于轻量级CNN网络常采用深度可分割卷积depthwise separable convolutions其中点卷积 pointwise convolution即1x1卷积复杂度最大。这里假定输入和输出特征的通道数分别为C1和C2经证明仅当C1C2时内存使用量(MAC)取最小值这个理论分析也通过实验得到证实。更详细的证明见参考【1】
G2过量使用组卷积会增加MAC 组卷积group convolution是常用的设计组件因为它可以减少复杂度却不损失模型容量。但是这里发现分组过多会增加MAC。更详细的证明见参考【1】
G3网络碎片化会降低并行度 一些网络如Inception以及Auto ML自动产生的网络NASNET-A它们倾向于采用“多路”结构即存在一个lock中很多不同的小卷积或者pooling这很容易造成网络碎片化减低模型的并行度相应速度会慢这也可以通过实验得到证明。
G4不能忽略元素级操作 对于元素级element-wise operators比如ReLU和Add虽然它们的FLOPs较小但是却需要较大的MAC。这里实验发现如果将ResNet中残差单元中的ReLU和shortcut移除的话速度有20%的提升。
根据前面的4条准则作者分析了ShuffleNet v1设计的不足并在此基础上改进得到了ShuffleNetv2两者模块上的对比下图所示 第三步训练代码
1损失函数为交叉熵损失函数
2训练代码
import os
import math
import argparseimport torch
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
import torch.optim.lr_scheduler as lr_schedulerfrom model import shufflenet_v2_x1_0
from my_dataset import MyDataSet
from utils import read_split_data, train_one_epoch, evaluatedef main(args):device torch.device(args.device if torch.cuda.is_available() else cpu)print(args)print(Start Tensorboard with tensorboard --logdirruns, view at http://localhost:6006/)tb_writer SummaryWriter()if os.path.exists(./weights) is False:os.makedirs(./weights)train_images_path, train_images_label, val_images_path, val_images_label read_split_data(args.data_path)data_transform {train: transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),val: 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_dataset MyDataSet(images_pathtrain_images_path,images_classtrain_images_label,transformdata_transform[train])# 实例化验证数据集val_dataset MyDataSet(images_pathval_images_path,images_classval_images_label,transformdata_transform[val])batch_size args.batch_sizenw min([os.cpu_count(), batch_size if batch_size 1 else 0, 8]) # number of workersprint(Using {} dataloader workers every process.format(nw))train_loader torch.utils.data.DataLoader(train_dataset,batch_sizebatch_size,shuffleTrue,pin_memoryTrue,num_workersnw,collate_fntrain_dataset.collate_fn)val_loader torch.utils.data.DataLoader(val_dataset,batch_sizebatch_size,shuffleFalse,pin_memoryTrue,num_workersnw,collate_fnval_dataset.collate_fn)# 如果存在预训练权重则载入model shufflenet_v2_x1_0(num_classesargs.num_classes).to(device)if args.weights ! :if os.path.exists(args.weights):weights_dict torch.load(args.weights, map_locationdevice)load_weights_dict {k: v for k, v in weights_dict.items()if model.state_dict()[k].numel() v.numel()}print(model.load_state_dict(load_weights_dict, strictFalse))else:raise FileNotFoundError(not found weights file: {}.format(args.weights))# 是否冻结权重if args.freeze_layers:for name, para in model.named_parameters():# 除最后的全连接层外其他权重全部冻结if fc not in name:para.requires_grad_(False)pg [p for p in model.parameters() if p.requires_grad]optimizer optim.SGD(pg, lrargs.lr, momentum0.9, weight_decay4E-5)# Scheduler https://arxiv.org/pdf/1812.01187.pdflf lambda x: ((1 math.cos(x * math.pi / args.epochs)) / 2) * (1 - args.lrf) args.lrf # cosinescheduler lr_scheduler.LambdaLR(optimizer, lr_lambdalf)for epoch in range(args.epochs):# trainmean_loss train_one_epoch(modelmodel,optimizeroptimizer,data_loadertrain_loader,devicedevice,epochepoch)scheduler.step()# validateacc evaluate(modelmodel,data_loaderval_loader,devicedevice)print([epoch {}] accuracy: {}.format(epoch, round(acc, 3)))tags [loss, accuracy, learning_rate]tb_writer.add_scalar(tags[0], mean_loss, epoch)tb_writer.add_scalar(tags[1], acc, epoch)tb_writer.add_scalar(tags[2], optimizer.param_groups[0][lr], epoch)torch.save(model.state_dict(), ./weights/model-{}.pth.format(epoch))if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--num_classes, typeint, default17)parser.add_argument(--epochs, typeint, default100)parser.add_argument(--batch-size, typeint, default4)parser.add_argument(--lr, typefloat, default0.01)parser.add_argument(--lrf, typefloat, default0.1)# 数据集所在根目录# https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgzparser.add_argument(--data-path, typestr,defaultrG:\demo\data\monkeys\training)# shufflenetv2_x1.0 官方权重下载地址# https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pthparser.add_argument(--weights, typestr, default./shufflenetv2_x1-5666bf0f80.pth,helpinitial weights path)parser.add_argument(--freeze-layers, typebool, defaultFalse)parser.add_argument(--device, defaultcuda:0, helpdevice id (i.e. 0 or 0,1 or cpu))opt parser.parse_args()main(opt)第四步统计正确率 第五步搭建GUI界面 第六步整个工程的内容
有训练代码和训练好的模型以及训练过程提供数据提供GUI界面代码 代码的下载路径新窗口打开链接基于Pytorch框架的深度学习ShufflenetV2神经网络十七种猴子动物识别分类系统源码 有问题可以私信或者留言有问必答