改进系列(6):基于DenseNet网络添加TripletAttention注意力层实现的番茄病害图像分类

目录

1. DenseNet 介绍

2. TripletAttention

3. DenseNet + TripletAttention

4. 番茄场景病害病虫识别

4.1 数据集情况

4.2 训练

4.3 训练结果

4.4 推理


1. DenseNet 介绍

DenseNet是一种深度学习架构,卷积神经网络(CNN)的一种变体,旨在解决梯度消失的问题并提高网络连接性。

在传统的CNN中,信息流是顺序的,每一层只连接到下一层。这可能会导致梯度在网络中传播时减小,从而难以训练深度网络。DenseNet旨在通过引入密集连接来缓解这一问题,密集连接允许从网络中的任何层直接连接到任何其他层。

DenseNet由多个密集块组成,每个密集块包含多个层。密集块内的每一层都连接到同一块内的其他每一层。这种密集的连接促进了特征重用和信息流,使梯度更容易在整个网络中传播。此外,DenseNet在每个密集块后都加入了一个过渡层,以降低特征图的维度并控制网络的增长。

DenseNet的主要优势包括:

改进的梯度流:层之间的直接连接有助于克服梯度消失问题,并实现深度网络的高效训练。

强大的特征重用:密集的连接促进了特征重用,从而实现了更紧凑的网络和更好的参数效率。

参数数量减少:与传统的CNN架构相比,DenseNet通常需要更少的参数,从而使模型更容易训练,计算效率更高。

提高精度:DenseNet已被证明在各种计算机视觉任务上达到了最先进的性能,如图像分类和物体检测。

总体而言,DenseNet是一个强大的深度学习架构,可以解决训练深度网络的挑战。其密集的连接性和高效的参数共享使其成为各种计算机视觉任务的有效选择。

其中,denseNet不同版本的架构如下

2. TripletAttention

TripletPattention是一种用于自然语言处理任务的注意力机制,特别是在问答和机器翻译中。它是传统自我注意机制的延伸,也称为变压器注意。

TripletAttention机制旨在通过结合有关输入序列的额外信息来增强注意力机制。它不仅使用查询、键和值向量,还包括三种不同类型的向量:锚向量、正向量和负向量。

在问答的上下文中,锚向量表示问题,正向量表示包含答案的段落,负向量表示不包含答案的随机段落。通过包含正向量和负向量,TripletAttention机制学会关注文章中有助于回答问题的相关信息,并忽略负面文章中的无关信息。

TripletPattention机制可用于计算文章中每个单词的注意力得分,表明其在答案预测中的重要性。然后,这些注意力得分用于对值向量进行加权,并生成一个上下文向量,即值向量的加权和。

总的来说,TripletAttention是一种强大的注意力机制,它利用额外的信息来提高神经网络在问答和其他自然语言处理任务中的性能。

python实现的代码如下:

class TripletAttention(nn.Module):
    def __init__(self, in_channels):
        super(TripletAttention, self).__init__()
        self.conv_query = nn.Conv2d(in_channels, in_channels // 8, kernel_size=1)
        self.conv_key = nn.Conv2d(in_channels, in_channels // 8, kernel_size=1)
        self.conv_value = nn.Conv2d(in_channels, in_channels, kernel_size=1)

    def forward(self, x):
        query = self.conv_query(x)
        key = self.conv_key(x)
        value = self.conv_value(x)

        query = query.view(query.size(0), -1, query.size(2) * query.size(3))
        key = key.view(key.size(0), -1, key.size(2) * key.size(3))
        value = value.view(value.size(0), -1, value.size(2) * value.size(3))

        attention_map = torch.bmm(query.permute(0, 2, 1), key)
        attention_map = F.softmax(attention_map, dim=-1)

        attended_features = torch.bmm(value, attention_map.permute(0, 2, 1))
        attended_features = attended_features.view(x.size())

        return attended_features

3. DenseNet + TripletAttention

本人添加的位置在DenseNet每个transition后

如下:其中红色区域就是添加的部分

4. 番茄场景病害病虫识别

完整项目下载:DenseNet图像分类改进【添加TripletAttention三重注意力机制模块】:番茄病害识别资源-CSDN文库

4.1 数据集情况

总共有8类别,分别放在不同的目录下,训练集有496张图片,验证集有121张图片

标签类别如下:

{
    "0": "BA",
    "1": "HA",
    "2": "MP",
    "3": "SE",
    "4": "SL",
    "5": "TP",
    "6": "TU",
    "7": "ZC"
}

可视化结果:

4.2 训练

这里训练了100个epoch,参数如下:

{
    "train parameters": {
        "model": "densenet121",
        "pretrained": true,
        "freeze_layers": true,
        "batch_size": 16,
        "epochs": 100,
        "optim": "SGD",
        "lr": 0.001,
        "lrf": 0.001
    },
    "model": {
        "total parameters": 7393256.0,
        "train parameters": 439400,
        "flops": 2944160256.0

想要更改训练超参数的可以在train脚本更改

4.3 训练结果

这里最后一轮的指标如下:

    "epoch:99": {
        "train info": {
            "accuracy": 0.8938775510021657,
            "BA": {
                "Precision": 0.8148,
                "Recall": 0.9167,
                "Specificity": 0.9774,
                "F1 score": 0.8628
            },
            "HA": {
                "Precision": 0.8947,
                "Recall": 0.9659,
                "Specificity": 0.9751,
                "F1 score": 0.9289
            },
            "MP": {
                "Precision": 0.902,
                "Recall": 0.8846,
                "Specificity": 0.9741,
                "F1 score": 0.8932
            },
            "SE": {
                "Precision": 0.8596,
                "Recall": 0.8167,
                "Specificity": 0.9814,
                "F1 score": 0.8376
            },
            "SL": {
                "Precision": 0.9718,
                "Recall": 0.8846,
                "Specificity": 0.9951,
                "F1 score": 0.9262
            },
            "TP": {
                "Precision": 0.8333,
                "Recall": 0.7895,
                "Specificity": 0.9936,
                "F1 score": 0.8108
            },
            "TU": {
                "Precision": 0.8814,
                "Recall": 0.8814,
                "Specificity": 0.9838,
                "F1 score": 0.8814
            },
            "ZC": {
                "Precision": 0.9412,
                "Recall": 0.9412,
                "Specificity": 0.9956,
                "F1 score": 0.9412
            },
            "mean precision": 0.8873500000000001,
            "mean recall": 0.8850750000000001,
            "mean specificity": 0.9845124999999999,
            "mean f1 score": 0.8852625
        },
        "valid info": {
            "accuracy": 0.529411764661394,
            "BA": {
                "Precision": 0.4211,
                "Recall": 0.6667,
                "Specificity": 0.8972,
                "F1 score": 0.5162
            },
            "HA": {
                "Precision": 0.4545,
                "Recall": 0.5,
                "Specificity": 0.8788,
                "F1 score": 0.4762
            },
            "MP": {
                "Precision": 0.5385,
                "Recall": 0.5385,
                "Specificity": 0.871,
                "F1 score": 0.5385
            },
            "SE": {
                "Precision": 0.25,
                "Recall": 0.2,
                "Specificity": 0.9135,
                "F1 score": 0.2222
            },
            "SL": {
                "Precision": 0.7059,
                "Recall": 0.6667,
                "Specificity": 0.9505,
                "F1 score": 0.6857
            },
            "TP": {
                "Precision": 0.3333,
                "Recall": 0.2,
                "Specificity": 0.9825,
                "F1 score": 0.25
            },
            "TU": {
                "Precision": 0.6923,
                "Recall": 0.6,
                "Specificity": 0.9615,
                "F1 score": 0.6429
            },
            "ZC": {
                "Precision": 0.8571,
                "Recall": 0.75,
                "Specificity": 0.991,
                "F1 score": 0.8
            },
            "mean precision": 0.5315875,
            "mean recall": 0.5152375,
            "mean specificity": 0.93075,
            "mean f1 score": 0.5164624999999999
        }
    }

曲线图:

混淆矩阵:

4.4 推理

推理结果如下:

想要更换数据集训练的话,参考readme文件即可

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库 环境下载 MySQL 5.7.44 包安装标题检查服务是否启动成功遇到的问题登陆&修改密码&远程访问 环境 操作系统:Ubuntu 20.04.4 LTS 数据库:MySQL 5.7.34 内核版本:x86_64(amd…

0基础学前端-----CSS DAY6

0基础学前端-----CSS DAY6 视频参考:B站Pink老师 今天是CSS学习的第六天,今天开始的笔记对应Pink老师课程中的CSS第三天的内容。 本节重点:CSS的三大特性以及CSS的盒子模型。 1.CSS的三大特性 CSS有三个重要特性:层叠性、继承性…

手写Redis分布式锁+RedisUtil二次封装

文章目录 1.手写Redis分布式锁1.RedisShareLockUtil2.使用方式 2.RedisUtil二次封装1.RedisUtil2.使用案例 1.手写Redis分布式锁 1.RedisShareLockUtil package com.sunxiansheng.redis.util;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springfra…

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#x…

IO的入门

目录 1.IO概述1.1流的分类 2.字符流2.1 案例 1.IO概述 IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。 对于java来说输…

el-table表格嵌套子表格:展开所有内容;对当前展开行内容修改,当前行默认展开;

原文1 原文2 原文3 一、如果全部展开 default-expand-all"true" 二、设置有数据的行打开下拉 1、父table需要绑定两个属性expand-row-key和row-key <el-table:data"tableData":expand-row-keys"expends" //expends是数组&#xff0c;设置…

canal详解及demo

提示&#xff1a;如何保证Redis中的数据与数据库中的数据一致性&#xff1f;数据同步canal的介绍和demo、大型企业如何实现mysql到redis的同步&#xff1f;使用binlog实时更新redis缓存、canal的接入教程、win下canal的服务器端、canal客户端的创建、连接、测试教程、数据同步方…

平方根无迹卡尔曼滤波(SR-UKF)的MATLAB例程,使用三维非线性的系统

本MATLAB 代码实现了平方根无迹卡尔曼滤波&#xff08;SR-UKF&#xff09;算法&#xff0c;用于处理三维非线性状态估计问题 文章目录 运行结果代码概述代码 运行结果 三轴状态曲线对比&#xff1a; 三轴误差曲线对比&#xff1a; 误差统计特性输出&#xff08;命令行截图&…

汇编DOSBox 如何使文件可以运行

1.在vscode编写&#xff08;其他也可以&#xff09;如何在vscode中编写汇编语言并在终端进行调试(保姆级别&#xff09;_如何在vscode编译asm-CSDN博客 2.点击ML615中的DOS 2.1在命令行中输入命令 ml 文件名.asm ml 文件名.obj 2.2 将生成的exe文件移动到Assembly里面 这个文件…

QT多线程(三):基于条件等待的线程同步

在多线程的程序中&#xff0c;多个线程之间的同步问题实际上就是多个线程之间的协调问题。例如在以下例子中只有等 ThreadDAQ 写满一个缓冲区之后&#xff0c;ThreadShow 和ThreadSaveFile 才能读取缓冲区的数据。 int buffer[100]; QReadWriteLock Lock; //定义读写锁变量 v…

js 数组方法总结

在 JavaScript 中&#xff0c;数组有许多内置的方法&#xff0c;可以用于操作和处理数组。以下是一些常用的数组方法及其特点&#xff1a; 1. push() - 用途&#xff1a;向数组末尾添加一个或多个元素 - 改变原数组&#xff1a;是 - 返回值&#xff1a;返回数组的新长度 let ar…

MongoDB-副本集

一、什么是 MongoDB 副本集&#xff1f; 1.副本集的定义 MongoDB 的副本集&#xff08;Replica Set&#xff09;是一组 MongoDB 服务器实例&#xff0c;它们存储同一数据集的副本&#xff0c;确保数据的高可用性和可靠性。副本集中的每个节点都有相同的数据副本&#xff0c;但…

驱动开发-入门【1】

1.内核下载地址 Linux内核源码的官方网站为https://www.kernel.org/&#xff0c;可以在该网站下载最新的Linux内核源码。进入该网站之后如下图所示&#xff1a; 从上图可以看到多个版本的内核分支&#xff0c;分别为主线版本&#xff08;mainline&#xff09;、稳定版本&#…

数字电视标准与分类

数字电视相关内容是一个极其成熟且久远的领域&#xff0c;并不像其它的技术方面那么前沿。但是学习技术的另外一个方面也不就是可以维持咱们的好奇心以及认识生活中多个事务后面的技术本质。 近年来&#xff0c;电视领域发生了一系列的变化&#xff0c;电视数字化的进程明显加快…

【WRF安装】WRF编译错误总结1:HDF5库包安装

目录 1 HDF5库包安装有误&#xff1a;HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1&#xff1a;提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的…

LeetCode 11. 盛最多水的容器(超简单讲解)

11. 盛最多水的容器 题目示例示例1示例2 解题思路双指针实现设计 详细代码 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务

解释 在spingboot 集成es客户端后&#xff0c;每当服务启动时&#xff0c;服务默认都会查看es中是否已经创建了对应的索引&#xff0c;如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…

IOTIQS100芯片, TCP 发送数据+NSOSD,data要是hex16进制转换方法

命令&#xff1a;data以十六进制字符串格式发送的数据。 方法 代码 sprintf(temp, "%02X", data[i]);&#xff1a;将当前字节转换为两位宽的大写十六进制字符&#xff0c;并存储在 temp 中。如果需要小写字母&#xff0c;可以将格式说明符改为 "%02x"。 …

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…