基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

 第一步:准备数据

12种宠物猫类数据:self.class_indict = ["阿比西尼猫", "豹猫", "伯曼猫", "孟买猫", "英国短毛猫", "埃及猫", "缅因猫", "波斯猫", "布偶猫", "克拉特猫", "泰国暹罗猫", "加拿大无毛猫"]

,总共有2160张图片,每个文件夹单独放一种数据

第二步:搭建模型

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

ConvNext (Convolutional Network Net Generation), 即下一代卷积神经网络, 是近些年来 CV 领域的一个重要发展. ConvNext 由 Facebook AI Research 提出, 仅仅通过卷积结构就达到了与 Transformer 结构相媲美的 ImageNet Top-1 准确率, 这在近年来以 Transformer 为主导的视觉问题解决趋势中显得尤为突出.

第三步:训练代码

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

2)训练代码:

import os
import argparseimport torch
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformsfrom my_dataset import MyDataSet
from model import convnext_tiny as create_model
from utils import read_split_data, create_lr_scheduler, get_params_groups, train_one_epoch, evaluatedef main(args):device = torch.device(args.device if torch.cuda.is_available() else "cpu")print(f"using {device} device.")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)img_size = 224data_transform = {"train": transforms.Compose([transforms.RandomResizedCrop(img_size),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),"val": transforms.Compose([transforms.Resize(int(img_size * 1.143)),transforms.CenterCrop(img_size),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}# 实例化训练数据集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_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_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).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)["model"]# 删除有关分类类别的权重for k in list(weights_dict.keys()):if "head" in k: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外,其他权重全部冻结if "head" not in name:para.requires_grad_(False)else:print("training {}".format(name))# pg = [p for p in model.parameters() if p.requires_grad]pg = get_params_groups(model, weight_decay=args.wd)optimizer = optim.AdamW(pg, lr=args.lr, weight_decay=args.wd)lr_scheduler = create_lr_scheduler(optimizer, len(train_loader), args.epochs,warmup=True, warmup_epochs=1)best_acc = 0.for epoch in range(args.epochs):# traintrain_loss, train_acc = train_one_epoch(model=model,optimizer=optimizer,data_loader=train_loader,device=device,epoch=epoch,lr_scheduler=lr_scheduler)# validateval_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)if best_acc < val_acc:torch.save(model.state_dict(), "./weights/best_model.pth")best_acc = val_accif __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--num_classes', type=int, default=12)parser.add_argument('--epochs', type=int, default=100)parser.add_argument('--batch-size', type=int, default=4)parser.add_argument('--lr', type=float, default=5e-4)parser.add_argument('--wd', type=float, default=5e-2)# 数据集所在根目录# https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgzparser.add_argument('--data-path', type=str,default=r"G:\demo\data\cat_data_sets_models\cat_12_train")# 预训练权重路径,如果不想载入就设置为空字符# 链接: https://pan.baidu.com/s/1aNqQW4n_RrUlWUBNlaJRHA  密码: i83tparser.add_argument('--weights', type=str, default='./convnext_tiny_1k_224_ema.pth',help='initial weights path')# 是否冻结head以外所有权重parser.add_argument('--freeze-layers', type=bool, default=False)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界面

第六步:整个工程的内容

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

代码的下载路径(新窗口打开链接):基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

​​

有问题可以私信或者留言,有问必答

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言之函数和方法

个人网站&#xff1a; http://hardyfish.top/ 免费书籍分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码&#xff1a;3899 免费专栏分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-6…

学习TS看这一篇就够了!

目录 TS的优点和缺点基础类型数字类型布尔类型字符串类型void 类型null 类型和 undefined 类型bigint类型Symbol类型 其他类型数组元组枚举Enum对象和函数any void never unknown 的区别是什么泛型 Generic交叉类型联合类型 特殊符号 ? ?. ?? ! _修饰符 TS的优点和缺点 优…

GPT对话代码库——STM32G431微秒(us)级delay函数

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 方法一&#xff1a;使用定时器&#xff08;Timer&#xff09; 方法二&#xff1a;使用SysTick定时器 方法三&#xff1a;使用内联汇编 选择合适的方法 2&#xff0c;问&#xff1a; 2&#xff0c;答&…

如何集成CppCheck到visual studio中

1.CPPCheck安装 在Cppcheck官方网站下载最新版本1.70&#xff0c;官网链接&#xff1a;http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS&#xff0c;菜单栏工具->外部工具->添加&#xff0c;按照下图设置&#xff0c;记得勾选“使用输出窗口” 2.…

深入解析 IPython 命名空间与作用域机制

IPython 是一个强大的交互式 Python 解释器&#xff0c;它提供了许多增强的功能来改善用户的编程体验。在 IPython 中&#xff0c;命名空间&#xff08;namespace&#xff09;和作用域&#xff08;scope&#xff09;的概念对于理解变量的生命周期和访问方式至关重要。本文将详细…

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述&#xff1a;word2016中新建页面显示出来的页面没有页眉页脚&#xff0c;只显示正文部分。设置了页边距也不管用。 如图1 图1 解决&#xff1a; 点击“视图”——“多页”——“单页”&#xff0c;即可。如图2操作 图2 结果展示&#xff1a;如图3 图3

【Unity】数据持久化--JSON

1、JSON基础语法 1.1 注释内容 单行注释 // 多行注释 /* 内容 */ //注释内容 /* 多行注释 123 e1 ds */ /* 1.2 符号含义 大括号 {} 对象 中括号 [] 数组 冒号 : 键值对对应关系 逗号 , 数据分割 双引号 "" 键名/字符串 1.3 键值对表示 “ "键…

AI 大模型之美 | 更新完结

AI 大模型&#xff1a;技术的壮丽与美感 在当今的人工智能领域&#xff0c;大模型如同一座座巨大的桥梁&#xff0c;将计算机科学、语言学、认知科学等多个领域连接在一起。它们不仅仅是技术的象征&#xff0c;更是人类智慧与创新的结晶。本文将探讨AI大模型的壮丽与美感&…

基于Java的订餐小程序【附源码】

一、本选题的依据&#xff08;阐述所选课题的研究背景、研究目的和意义、分析国内外研究现状及趋势&#xff09; 研究背景&#xff1a; 随着移动互联网的普及和智能手机的发展&#xff0c;人们的生活方式正在发生深刻的变化。特别是在餐饮行业&#xff0c;传统的堂食模式已不能…

‘pip‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

【深度学习】快速入门KerasNLP:微调BERT模型完成电影评论情感分类任务

简介&#xff1a;本文将介绍 KerasNLP 的安装及使用&#xff0c;以及如何使用它在情感分析任务中微调 BERT 的预训练模型。 1. KerasNLP库 KerasNLP 是一个自然语言处理库&#xff0c;兼容 TensorFlow、JAX 和 PyTorch 等多种深度学习框架。基于 Keras 3 构建&#xff0c;这些…

核密度估计kde的本质

核密度估计的本质就是插值&#xff0c;不是拟合&#xff0c;只是不要求必须过已知点。 核为box窗函数 核为高斯函数

python利用cartopy绘制带有经纬度的地图

参考&#xff1a; https://makersportal.com/blog/2020/4/24/geographic-visualizations-in-python-with-cartopy https://scitools.org.uk/cartopy/docs/latest/ https://stackoverflow.com/questions/69465435/cartopy-show-tick-marks-of-axes 具体实现方式&#xff1a; …

201.回溯算法:全排列(力扣)

class Solution { public:vector<int> res; // 用于存储当前排列组合vector<vector<int>> result; // 用于存储所有的排列组合void backtracing(vector<int>& nums, vector<bool>& used) {// 如果当前排列组合的长度等于 nums 的长度&am…

【Android】软键盘空白问题

问题描述 A界面弹出软键盘&#xff0c;跳到B界面&#xff0c;然后返回A界面时软键盘出现空白 解决方案&#xff1a; A界面的onResume方法、跳B界面方法调用前&#xff0c;加一个清除输入框焦点的方法 if (editText!null){editText.clearFocus();}清单文件里A界面添加属性&…

Mybatis 到 MyBatisPlus

Mybatis 到 MyBatisPlus Mybatis MyBatis&#xff08;官网&#xff1a;https://mybatis.org/mybatis-3/zh/index.html &#xff09;是一款优秀的 持久层 &#xff08;ORM&#xff09;框架&#xff0c;用于简化JDBC的开发。是 Apache的一个开源项目iBatis&#xff0c;2010年这…

[亲测可用] 一行代码分页---springBoot PageHelper 不生效解决方案!!

今天做mybatis查询的时候 不管是用框架查询sql还是手动写sql&#xff0c;查询分页都不生效&#xff0c;很简单&#xff0c;你配置不对&#xff0c;或者缺少了配置。我下面是直接配置 不用写代码配置。框架查询sql还是手动写sql都支持 这是我查询的sql (注意&#xff01;&#…

【图像处理实战】去除光照不均(Python)

这篇文章主要是对参考文章里面实现一种小拓展&#xff1a; 可处理彩色图片&#xff08;通过对 HSV 的 V 通道进行处理&#xff09;本来想将嵌套循环改成矩阵运算的&#xff0c;但是太麻烦了&#xff0c;而且代码也不好理解&#xff0c;所以放弃了。 代码 import cv2 import …

虚拟化 之八 详解构造带有 jailhouse 的 openEuler 发行版(ARM 飞腾派)

基本环境 嵌入式平台下,由于资源的限制,通常不具备通用性的 Linux 发行版,各大主流厂商都会提供自己的 Linux 发行版。这个发行版通常是基于某个 Linux 发行版构建系统来构建的,而不是全部手动构建,目前主流的 Linux 发行版构建系统是 Linux 基金会开发的 Yocto 构建系统。…

【大数据技术原理与应用(概念、存储、处理、分析与应用)】第3章-分布式文件系统HDFS习题与知识回顾

文章目录 单选题多选题知识回顾什么是HDFS?分布式文件系统结构HDFS的设计目标与局限性块的概念名称节点(NameNode)数据节点(DataNode)第二名称节点HDFS体系结构的局限性HDFS存储原理冗余存储数据存取策略数据读取策略HDFS数据读写过程读数据的过程写数据的过程单选题 1、分…