当前位置: 首页 > news >正文

基于Pytorch框架的深度学习Vision Transformer神经网络蝴蝶分类识别系统源码

第一步:准备数据

6种蝴蝶数据:self.class_indict = ["曙凤蝶", "麝凤蝶", "多姿麝凤蝶", "旖凤蝶", "红珠凤蝶", "热斑凤蝶"],总共有900张图片,每个文件夹单独放一种数据

第二步:搭建模型

本文选择一个Vision Transformer网络,其原理介绍如下:

Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,用于图像识别和计算机视觉任务。与传统的卷积神经网络(CNN)不同,ViT直接将图像视为一个序列化的输入,并利用自注意力机制来处理图像中的像素关系。

ViT通过将图像分成一系列的图块(patches),并将每个图块转换为向量表示作为输入序列。然后,这些向量将通过多层的Transformer编码器进行处理,其中包含了自注意力机制和前馈神经网络层。这样可以捕捉到图像中不同位置的上下文依赖关系。最后,通过对Transformer编码器输出进行分类或回归,可以完成特定的视觉任务。

Vit model结构图
Vit的模型结构如下图所示。vit是将图像块应用于transformer。CNN是以滑窗的思想用卷积核在图像上进行卷积得到特征图。为了可以使图像仿照NLP的输入序列,我们可以先将图像分成块(patch),再将这些图像块进行平铺后输入到网络中(这样就变成了图像序列),然后通过transformer进行特征提取,最后再通过MLP对这些特征进行分类【其实就可以理解为在以往的CNN分类任务中,将backbone替换为transformer】。

第三步:训练代码

1)损失函数为:交叉熵损失函数

2)训练代码:

import os import math import argparse import torch import torch.optim as optim import torch.optim.lr_scheduler as lr_scheduler from torch.utils.tensorboard import SummaryWriter from torchvision import transforms from my_dataset import MyDataSet from vit_model import vit_base_patch16_224_in21k as create_model from utils import read_split_data, train_one_epoch, evaluate def main(args): device = torch.device(args.device if torch.cuda.is_available() else "cpu") if os.path.exists("./weights") is False: os.makedirs("./weights") tb_writer = SummaryWriter() 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.5, 0.5, 0.5], [0.5, 0.5, 0.5])]), "val": transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])} # 实例化训练数据集 train_dataset = MyDataSet(images_path=train_images_path, images_class=train_images_label, transform=data_transform["train"]) # 实例化验证数据集 val_dataset = MyDataSet(images_path=val_images_path, images_class=val_images_label, transform=data_transform["val"]) batch_size = args.batch_size nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8]) # number of workers print('Using {} dataloader workers every process'.format(nw)) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, pin_memory=True, num_workers=nw, collate_fn=train_dataset.collate_fn) val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False, pin_memory=True, num_workers=nw, collate_fn=val_dataset.collate_fn) model = create_model(num_classes=args.num_classes, has_logits=False).to(device) if args.weights != "": assert os.path.exists(args.weights), "weights file: '{}' not exist.".format(args.weights) weights_dict = torch.load(args.weights, map_location=device) # 删除不需要的权重 del_keys = ['head.weight', 'head.bias'] if model.has_logits \ else ['pre_logits.fc.weight', 'pre_logits.fc.bias', 'head.weight', 'head.bias'] for k in del_keys: del weights_dict[k] print(model.load_state_dict(weights_dict, strict=False)) if args.freeze_layers: for name, para in model.named_parameters(): # 除head, pre_logits外,其他权重全部冻结 if "head" not in name and "pre_logits" not in name: para.requires_grad_(False) else: print("training {}".format(name)) pg = [p for p in model.parameters() if p.requires_grad] optimizer = optim.SGD(pg, lr=args.lr, momentum=0.9, weight_decay=5E-5) # Scheduler https://arxiv.org/pdf/1812.01187.pdf lf = lambda x: ((1 + math.cos(x * math.pi / args.epochs)) / 2) * (1 - args.lrf) + args.lrf # cosine scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf) for epoch in range(args.epochs): # train train_loss, train_acc = train_one_epoch(model=model, optimizer=optimizer, data_loader=train_loader, device=device, epoch=epoch) scheduler.step() # validate val_loss, val_acc = evaluate(model=model, data_loader=val_loader, device=device, epoch=epoch) tags = ["train_loss", "train_acc", "val_loss", "val_acc", "learning_rate"] tb_writer.add_scalar(tags[0], train_loss, epoch) tb_writer.add_scalar(tags[1], train_acc, epoch) tb_writer.add_scalar(tags[2], val_loss, epoch) tb_writer.add_scalar(tags[3], val_acc, epoch) tb_writer.add_scalar(tags[4], 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', type=int, default=6) parser.add_argument('--epochs', type=int, default=100) parser.add_argument('--batch-size', type=int, default=4) parser.add_argument('--lr', type=float, default=0.001) parser.add_argument('--lrf', type=float, default=0.01) # 数据集所在根目录 # https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz parser.add_argument('--data-path', type=str, default=r"G:\demo\data\Butterfly20") parser.add_argument('--model-name', default='', help='create model name') # 预训练权重路径,如果不想载入就设置为空字符 parser.add_argument('--weights', type=str, default='./vit_base_patch16_224_in21k.pth', help='initial weights path') # 是否冻结权重 parser.add_argument('--freeze-layers', type=bool, default=True) parser.add_argument('--device', default='cuda:0', help='device id (i.e. 0 or 0,1 or cpu)') opt = parser.parse_args() main(opt)

第四步:统计正确率

第五步:搭建GUI界面

演示视频:基于Pytorch框架的深度学习Vision Transformer神经网络蝴蝶分类识别系统源码_哔哩哔哩_bilibili

第六步:整个工程的内容

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

https://www.bilibili.com/video/BV1WezAYRE1f/

http://www.jsqmd.com/news/258485/

相关文章:

  • 手把手教你学 GPU KMD--1.1:UMD、KMD 与 DDK 的协作关系——从应用到硬件的完整数据流解析
  • 吃尾巴
  • centos stream9:设置系统时区
  • 基于keras框架的LeNet/AlexNet/Vgg16深度学习神经网络花卉/花朵分类识别系统源码
  • 手把手教你学Simulink--基础MPPT控制场景实例:基于Simulink的双模式MPPT(快速追踪+稳态优化)仿真
  • 除螨除螨虫哪个品牌效果好?2026十大排行榜揭晓,照着买省心又安心! - 资讯焦点
  • 100kW微型燃气轮机Simulink建模探索
  • 2026精选:五大分龄适配儿童洗发水品牌推荐,专研温和表活,洗出顺滑秀发 - 资讯焦点
  • 基于深度学习神经网络YOLOv4目标检测的汽车车牌识别系统
  • ACPI!ACPIBuildProcessGenericComplete函数的作用是摘下当前处理的节点PCI0后ACPI!AcpiBuildRunMethodList剩9个节点
  • 2026横梁货架优选集:实力厂商排行榜,仓库货架/横梁货架/仓储货架/中型货架/重型货架/层板货架,横梁货架供应商怎么选 - 品牌推荐师
  • 基于Simulink的双模式MPPT(快速追踪+稳态优化)仿真
  • 踩下油门时混合动力车的能量分配就像打扑克——既要看当前手牌,也得算后面几步。模型预测控制(MPC)在这局游戏里当起了军师,今天咱们就拆解这背后的骚操作
  • 深圳AI智能办公鼠标服务选择哪家好,这几家值得关注 - 工业品牌热点
  • 学Simulink--基础储能管理场景实例:基于Simulink的储能参与黑启动过程控制仿真
  • 消失的“AI”:当大模型不再是新闻,我们该如何保卫“人”的价值?
  • 告别盲目选购!2026年儿童洗发水九大品牌排行榜:分龄设计小金盾认证,公认好用 - 资讯焦点
  • 单北斗GNSS位移监测技术在变形监测中的应用与发展
  • 身体乳什么牌子好?2026超级补水止痒润肤效果特别好的身体乳推荐,高效多效保湿 - 资讯焦点
  • 去螨虫产品哪个品牌最有效?2026厉害推荐榜单,效果超强,家庭必备! - 资讯焦点
  • 2025年口碑最佳光纤熔接机品牌排行榜,电子对抗设备/无线信号测量仪表/光时域反射仪/无线电综合测试测试仪/光通信测量仪表光纤熔接机品牌推荐 - 品牌推荐师
  • 2026年四川口碑好的木方,辐射松木方,南方松木方厂家行业热门推荐 - 品牌鉴赏师
  • 【开题答辩全过程】以 基于Java的智慧园林管理系统为例,包含答辩的问题和答案
  • 给我的新网站 md-to.com 测试了一下安全评分
  • 2026年成都优秀的桥梁板,桥梁模版,模板厂家品牌推荐清单 - 品牌鉴赏师
  • 详细介绍:谷歌云AI 时代的算力革命:CPU、GPU 到 TPU 的架构与定位解析
  • 【测试人生】一套灵活的变更风险观测策略匹配机制设计
  • 轴承代理来图定制哪家好,伯陆商城口碑出众 - 工业品牌热点
  • 支付宝立减金回收天花板:15 秒到账的隐藏玩法 - 可可收
  • 2026年度GEO服务商加盟代理权威推荐:基于百家客户真实反馈效果排行榜 - 品牌推荐