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

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

 第一步:准备数据

5种鸟类行为数据:self.class_indict =

 ["bowing_status", "grooming", "headdown", "vigilance_status", "walking"]

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

第二步:搭建模型

简介:

DenseNet(Dense Convolutional Network)稠密卷积网络
CVPR2017的优秀文章
从feature入手,通过对feature的极致利用达到更好的效果和更少的参数。


优点:

减轻了vanishing-gradient(梯度消失)
加强了feature的传递
更有效地利用了feature
一定程度上较少了参数数量


在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,解决方法是创建浅层与深层之间的短路径。在DenseNet中,在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来。

在传统卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有(L+1)/2个连接。简单来说,就是每一层的输入来自前面所有层的输出。如下图是dense block的结构图,x是数据,H是网络层。

第三步:训练代码

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 densenet121, load_state_dict
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 "cd", 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_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 = densenet121(num_classes=args.num_classes).to(device)if args.weights != "":if os.path.exists(args.weights):load_state_dict(model, args.weights)else:raise FileNotFoundError("not found weights file: {}".format(args.weights))# 是否冻结权重if args.freeze_layers:for name, para in model.named_parameters():# 除最后的全连接层外,其他权重全部冻结if "classifier" not in name:para.requires_grad_(False)pg = [p for p in model.parameters() if p.requires_grad]optimizer = optim.SGD(pg, lr=args.lr, momentum=0.9, weight_decay=1E-4, nesterov=True)# 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_lambda=lf)for epoch in range(args.epochs):# trainmean_loss = train_one_epoch(model=model,optimizer=optimizer,data_loader=train_loader,device=device,epoch=epoch)scheduler.step()# validateacc = evaluate(model=model,data_loader=val_loader,device=device)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', type=int, default=5)parser.add_argument('--epochs', type=int, default=100)parser.add_argument('--batch-size', type=int, default=16)parser.add_argument('--lr', type=float, default=0.001)parser.add_argument('--lrf', type=float, default=0.1)# 数据集所在根目录# https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgzparser.add_argument('--data-path', type=str,default=r"E:\20240717\data")# densenet121 官方权重下载地址# https://download.pytorch.org/models/densenet121-a639ec97.pthparser.add_argument('--weights', type=str, default='densenet121.pth',help='initial weights path')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界面

视频演示地址:基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码_哔哩哔哩_bilibili

第六步:整个工程的内容

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

代码见:基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从json到protobuf,接口效率的提升
  • 领略诗词之妙,发觉生活之美。
  • 机器学习课程学习周报五
  • 初学Mybatis之 Lombok 篇
  • 微信小程序安装vant组件库和使用
  • Python3网络爬虫开发实战(6)异步爬虫
  • 速盾:cdn加速能不能防御攻击?
  • 掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了
  • 02 Redis安装与启动
  • 【c++刷题笔记-图论】day52: 101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿
  • C# 多线程Paralle使用
  • LangChain4j-RAG高级-核心概念
  • 区块链——代码格式检查(prettier、solhint)
  • OD C卷 - 密码输入检测
  • Linux操作系统 -socket网络通信
  • hexo+github搭建个人博客
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android单元测试 - 几个重要问题
  • Android组件 - 收藏集 - 掘金
  • classpath对获取配置文件的影响
  • CSS魔法堂:Absolute Positioning就这个样
  • eclipse的离线汉化
  • ES6系统学习----从Apollo Client看解构赋值
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • java第三方包学习之lombok
  • Js基础知识(四) - js运行原理与机制
  • MySQL几个简单SQL的优化
  • node 版本过低
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于组件的设计工作流与界面抽象
  • 简析gRPC client 连接管理
  • 将 Measurements 和 Units 应用到物理学
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 思维导图—你不知道的JavaScript中卷
  • 一份游戏开发学习路线
  • 用Visual Studio开发以太坊智能合约
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​如何使用QGIS制作三维建筑
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #数据结构 笔记三
  • (07)Hive——窗口函数详解
  • (1) caustics\
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (poj1.2.1)1970(筛选法模拟)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)php投票系统 毕业设计 121500
  • (六)软件测试分工
  • (面试必看!)锁策略
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原)本想说脏话,奈何已放下