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

深度学习案例:DenseNet + SE-Net

本文为为🔗365天深度学习训练营内部文章

原作者:K同学啊

 一 回顾DenseNet算法

DenseNet(Densely Connected Convolutional Networks)是一种深度卷积神经网络架构,提出的核心思想是通过在每一层与前面所有层进行直接连接,极大地增强了信息和梯度的流动。传统的卷积神经网络(CNN)结构中,每一层的输入仅来自前一层,而DenseNet通过让每一层的输入包含所有前面层的输出,形成了更密集的连接。这样的设计能够减少梯度消失的问题,促进特征复用,提高模型的表现力和学习效率。

DenseNet的优势主要体现在两个方面。首先,由于密集连接的特点,它在同等参数量下比传统的卷积网络能够学习到更丰富的特征,提升了网络的性能。其次,由于每层都接收前面层的特征图,DenseNet有效缓解了深度神经网络中训练难度较大的问题,特别是在处理深层网络时,可以显著提高梯度的传递效率,减少了对大规模数据集的需求。通过这些优点,DenseNet在图像分类、目标检测等任务中表现出色。

通道注意力机制上文提及,不再叙述。以下是DenseNet+SE-Net代码 

'''
SE模块实现
'''
import tensorflow as tf
from keras.models import Model
from keras import layers
from keras import backendclass Squeeze_excitation_layer(tf.keras.Model):def __init__(self, filter_sq):super().__init__()self.filter_sq = filter_sqself.avepool = tf.keras.layers.GlobalAveragePooling2D()def build(self, input_shape):self.dense1 = tf.keras.layers.Dense(self.filter_sq, activation='relu')self.dense2 = tf.keras.layers.Dense(input_shape[-1], activation='sigmoid')def call(self, inputs):squeeze = self.avepool(inputs)excitation = self.dense1(squeeze)excitation = self.dense2(excitation)excitation = tf.keras.layers.Reshape((1, 1, inputs.shape[-1]))(excitation)scale = inputs * excitationreturn scaledef dense_block(x,blocks,name):for i in range(blocks):x = conv_block(x,32,name=name+'_block'+str(i+1))return xdef conv_block(x,growth_rate,name):bn_axis = 3x1 = layers.BatchNormalization(axis=bn_axis,epsilon=1.001e-5,name=name+'_0_bn')(x)x1 = layers.Activation('relu',name=name+'_0_relu')(x1)x1 = layers.Conv2D(4*growth_rate,1,use_bias=False,name=name+'_1_conv')(x1)x1 = layers.BatchNormalization(axis=bn_axis,epsilon=1.001e-5,name=name + '_1_bn')(x1)x1 = layers.Activation('relu', name=name + '_1_relu')(x1)x1 = layers.Conv2D(growth_rate, 3, padding='same',use_bias=False, name=name + '_2_conv')(x1)x = layers.Concatenate(axis=bn_axis,name=name+'_concat')([x,x1])return xdef transition_block(x,reduction,name):bn_axis = 3x = layers.BatchNormalization(axis=bn_axis,epsilon=1.001e-5,name=name+'_bn')(x)x = layers.Activation('relu',name=name+'_relu')(x)x = layers.Conv2D(int(backend.int_shape(x)[bn_axis] * reduction),1,use_bias=False,name=name+'_conv')(x)x = layers.AveragePooling2D(2,strides=2,name=name+'_pool')(x)return xdef DenseNet(blocks,input_shape=None,classes=1000,**kwargs):img_input = layers.Input(shape=input_shape)bn_axis = 3# 224,224,3 -> 112,112,64x = layers.ZeroPadding2D(padding=((3,3),(3,3)))(img_input)x = layers.Conv2D(64,7,strides=2,use_bias=False,name='conv1/conv')(x)x = layers.BatchNormalization(axis=bn_axis,epsilon=1.001e-5,name='conv1/bn')(x)x = layers.Activation('relu',name='conv1/relu')(x)# 112,112,64 -> 56,56,64x = layers.ZeroPadding2D(padding=((1,1),(1,1)))(x)x = layers.MaxPooling2D(3,strides=2,name='pool1')(x)# 56,56,64 -> 56,56,64+32*block[0]# DenseNet121 56,56,64 -> 56,56,64+32*6 == 56,56,256x = dense_block(x,blocks[0],name='conv2')# 56,56,64+32*block[0] -> 28,28,32+16*block[0]# DenseNet121 56,56,256 -> 28,28,32+16*6 == 28,28,128x = transition_block(x,0.5,name='pool2')# 28,28,32+16*block[0] -> 28,28,32+16*block[0]+32*block[1]# DenseNet121 28,28,128 -> 28,28,128+32*12 == 28,28,512x = dense_block(x,blocks[1],name='conv3')# DenseNet121 28,28,512 -> 14,14,256x = transition_block(x,0.5,name='pool3')# DenseNet121 14,14,256 -> 14,14,256+32*block[2] == 14,14,1024x = dense_block(x,blocks[2],name='conv4')# DenseNet121 14,14,1024 -> 7,7,512x = transition_block(x,0.5,name='pool4')# DenseNet121 7,7,512 -> 7,7,256+32*block[3] == 7,7,1024x = dense_block(x,blocks[3],name='conv5')# 加SE注意力机制x = Squeeze_excitation_layer(16)(x)x = layers.BatchNormalization(axis=bn_axis,epsilon=1.001e-5,name='bn')(x)x = layers.Activation('relu',name='relu')(x)x = layers.GlobalAveragePooling2D(name='avg_pool')(x)x = layers.Dense(classes,activation='softmax',name='fc1000')(x)inputs = img_inputif blocks == [6,12,24,16]:model = Model(inputs,x,name='densenet121')elif blocks == [6,12,32,32]:model = Model(inputs,x,name='densenet169')elif blocks == [6,12,48,32]:model = Model(inputs,x,name='densenet201')else:model = Model(inputs,x,name='densenet')return modeldef DenseNet121(input_shape=[224,224,3],classes=3,**kwargs):return DenseNet([6,12,24,16],input_shape,classes,**kwargs)def DenseNet169(input_shape=[224,224,3],classes=3,**kwargs):return DenseNet([6,12,32,32],input_shape,classes,**kwargs)def DenseNet201(input_shape=[224,224,3],classes=3,**kwargs):return DenseNet([6,12,48,32],input_shape,classes,**kwargs)from tensorflow.keras.optimizers import Adam# 实例化模型,指定输入形状和类别数
model = DenseNet201(input_shape=[224,224,3], classes=2)
model.summary()
# 设置优化器
opt = tf.keras.optimizers.Adam(learning_rate=1e-7)model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])epochs = 25history = model.fit(train_ds,validation_data=val_ds,epochs=epochs,
)# 获取实际训练轮数
actual_epochs = len(history.history['accuracy'])acc = history.history['accuracy']
val_acc = history.history['val_accuracy']loss = history.history['loss']
val_loss = history.history['val_loss']epochs_range = range(actual_epochs)plt.figure(figsize=(12, 4))# 绘制准确率
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')# 绘制损失
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')plt.show()

总结:DenseNet与SE-Net(Squeeze-and-Excitation Networks)结合后,能够进一步增强模型的表现力和效率。DenseNet通过密集连接每一层,促进了特征的复用和梯度的流动,而SE-Net通过引入通道注意力机制,能够自动学习每个特征通道的重要性,调整通道的权重。将这两者结合起来,DenseNet负责加强特征之间的关联性和信息流动,而SE-Net则提升了特征通道的自适应能力,使得网络能够在不同任务中更加精准地利用最有用的特征。这样的结合使得模型在保持高效的同时,能够更加聚焦于有价值的特征,从而提升了性能,尤其在处理复杂的视觉任务时,表现尤为出色。

相关文章:

深度学习案例:DenseNet + SE-Net

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 回顾DenseNet算法 DenseNet(Densely Connected Convolutional Networks)是一种深度卷积神经网络架构,提出的核心思想是通过在每一层与前面所有层进行直接连接…...

excel文件合并,每个excel名称插入excel列

import pandas as pd import os # 设置文件夹路径 folder_path rC:\test # 替换为您的下载文件夹路径 output_file os.path.join(folder_path, BOM材料.xlsx) # 创建一个空的 DataFrame 用于存储合并的数据 combined_data pd.DataFrame() # 遍历文件夹中的所有文件 for …...

Linux 如何设置特殊权限?

简介 通过使用 setuid、setgid 、sticky,它们是 Linux 中的特殊权限,可以对文件和目录的访问和执行方式提供额外的控制。 命令八进制数字功能setuid4当执行文件时,它以文件所有者的权限运行,而不是执行它的用户的权限运行。setg…...

零基础如何使用ChatGPT快速学习Python

引言 AI编程时代来临,没有编程基础可以快速上车享受时代的红利吗?答案是肯定的。本文旨在介绍零基础如何利用ChatGPT快速学习Python编程语言,开启AI编程之路。解决的问题包括:传统学习方式效率低、缺乏互动性以及学习资源质量参差…...

【开源】一款基于SpringBoot 的全开源充电桩平台

一、下载项目文件 下载源码项目文件口令:动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后,进入夸克网盘app即可保存(如果复制到夸克app没有跳转资源,可以复制粘贴口令到夸克app的搜索框也可以打开(不用点搜索按钮&#…...

AI - RAG中的状态化管理聊天记录

AI - RAG中的状态化管理聊天记录 大家好,今天我们来聊聊LangChain和LLM中一个重要的话题——状态化管理聊天记录。在使用大语言模型(LLM)的时候,聊天记录(History)和状态(State)管理是非常关键的。那我们先…...

JAVA安全—SpringBoot框架MyBatis注入Thymeleaf模板注入

前言 之前我们讲了JAVA的一些组件安全,比如Log4j,fastjson。今天讲一下框架安全,就是这个也是比较常见的SpringBoot框架。 SpringBoot框架 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提…...

【STM32系列】提升ADC采样精度的方法

资料地址 兆易创新GigaDevice-资料下载兆易创新GD32 MCU ADC简介 ADC转换包括采样、保持、量化、编码四个步骤。的采样电容上,即在采样开关 SW 关闭的过程中,外部输入信号通过外部的输入电阻 RAIN 和以及 ADC 采样电阻 RADC 对采样电容 CADC 充电。采样…...

前端面试如何出彩

1、原型链和作用域链说不太清,主要表现在寄生组合继承和extends继承的区别和new做了什么。2、推荐我的两篇文章:若川:面试官问:能否模拟实现JS的new操作符、若川:面试官问:JS的继承 3、数组构造函数上有哪些…...

Linux 切换用户的两种方法

sudo -su user1 与 su - user1 都可以让当前用户切换到 user1 的身份执行命令或进入该用户的交互式 Shell。但它们在权限认证方式、环境变量继承和 Shell 初始化过程等方面存在一些差异。 权限认证方式 su - user1 su 是 “switch user” 的缩写,默认情况下需要你输…...

Spring Boot 3 中Bean的配置和实例化详解

一、引言 在Java企业级开发领域,Spring Boot凭借其简洁、快速、高效的特点,迅速成为了众多开发者的首选框架。Spring Boot通过自动配置、起步依赖等特性,极大地简化了Spring应用的搭建和开发过程。而在Spring Boot的众多核心特性中&#xff…...

Vue实现留言板(实现增删改查)注意:自己引入Vue.js哦

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scri…...

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址&#xff1a;https://start.spring.io/ 修改为阿里云Server URL地址&#xff1a;https://star…...

读取电视剧MP4视频的每一帧,检测出现的每一个人脸并保存

检测效果还不错,就是追踪有点难做 import cv2 import mediapipe as mp import os from collections import defaultdict# pip install msvc-runtime# 初始化OpenCV的MultiTracker # multi_tracker = cv2.MultiTracker_create() # multi_tracker = cv2.legacy.MultiTracker_cre…...

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…...

使用Allure作为测试报告生成器(Java+Selenium)

背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时&#xff0c;当需要确认UI regression issue还是selenium test case自身的问题&#xff0c;需要去jenkins中查log&#xff0c;一般得到的是“Can not find element xxx…...

RocketMQ面试题合集

消费者获取消息是从Master Broker还是Slave Broker获取&#xff1f; Master Broker宕机&#xff0c;Slave Broker会自动切换为Master Broker吗&#xff1f; 这种Master-Slave模式不是彻底的高可用模式&#xff0c;他没法实现自动把Slave切换为Master。在RocketMQ 4.5之后&…...

Qt初识_对象树

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 什么是对象树 为什么要引…...

axios的get和post请求,关于携带参数相关的讲解一下

在使用 Axios 发送 HTTP 请求时&#xff0c;GET 和 POST 请求携带参数的方式有所不同。以下是关于这两种请求方法携带参数的详细讲解&#xff1a; GET 请求携带参数 对于 GET 请求&#xff0c;参数通常附加在 URL 之后&#xff0c;以查询字符串的形式传递。 直接在 URL 中拼接…...

Vue前端开发-路由其他配置

在路由文件中&#xff0c;除了跳转配置外&#xff0c;还可以进行路径重定向配置&#xff0c;如果没有找到对应的地址&#xff0c;还可以实现404的配置&#xff0c;同时&#xff0c;如果某个页面需要权限登录&#xff0c;还可以进行路由守卫配置&#xff0c;接下来&#xff0c;分…...

框架建设实战7——定时任务组件

在金融系统中,或者其他对账系统里,往往离不开分布式定时任务。用来做查证或者重试处理。 分布式job目前一般有如下三种: 1.elastic job 当当出品,比较老牌。新公司用的应该不多了。 2.xxl-job 个人开源项目。便于二开;有简洁的后管配置界面,方便接入。 3.powerjob …...

mybatis 整合 ehcache

pom.xml <!-- ehcache依赖 --><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.1.0</version></dependency>ehcache.xml <?xml version"1.0" en…...

【PlantUML系列】用例图(三)

目录 一、组成部分 二、典型案例 一、组成部分 参与者&#xff08;Actors&#xff09;&#xff1a;使用关键字 actor 后跟参与者的名称。用例&#xff08;Use Cases&#xff09;&#xff1a;使用关键字 usecase 后跟用例的名称和编号&#xff08;可选&#xff09;。系统边界…...

发送请求时遇到了数据库完整性约束错误 1048 Column ‘platform‘ cannot be null

可以这样解决 在 Vue 2 中封装接口请求时&#xff0c;确保每次请求都包含 platform Header 参数的最佳实践是通过创建一个全局的 Axios 实例&#xff0c;并为这个实例设置默认的 Header。这样可以确保所有通过该实例发送的请求都会自动包含 platform 参数。此外&#xff0c;你…...

三菱FX3U模拟量产品的介绍

FX3u可编程控制器模拟量产品包括&#xff1a;特殊适配器、特殊功能模块的连接 1、连接在FX3U可编程控制器的左侧。 2、连接特殊适配器时&#xff0c;需要功能扩展板。 3、最多可以连接4台模拟量特殊适配器。 4、使用高速输入输出特殊适配器时&#xff0c;请将模拟量特殊适配器连…...

pdf转图片

目录 pdf2image库 PyMuPDF库 python-office库 pdfplumber库 pdf2image库 安装&#xff1a;pip install pdf2image 使用时会报错&#xff1a;pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH? 需要安装 po…...

Go 协程上下文切换的代价

在 Go 语言中&#xff0c;协程&#xff08;Goroutine&#xff09;是一种非常轻量级的并发执行单元&#xff0c;设计之初就是为了简化并发编程并提高性能。协程的上下文切换被认为是非常高效的&#xff0c;但是它的真正性能优势需要我们深入了解其背后的机制。 本文将深入探讨 …...

HTTP 持久连接(长连接)

HTTP 持久连接&#xff08;长连接&#xff09; HTTP 持久连接&#xff08;HTTP Persistent Connections&#xff09;&#xff0c;也常被称作 HTTP 长连接&#xff0c;是 HTTP 协议中的一种重要特性&#xff0c;以下是关于它的详细介绍&#xff1a; 一、基本概念 在传统的 HTT…...

12月10日IO

作业&#xff1a;使用read和write实现拷贝文件&#xff0c;将1.txt内容前一半拷贝给2.txt后一半拷贝给3.txt #include <myhead.h>int main(int argc, const char *argv[]) {//打开三个文件int fd1,fd2,fd3;fd1open("1.txt",O_RDONLY);fd2open("2.txt&quo…...

Composite Pattern

Composite Pattern The intent of Composite pattern is to composite objects into tree structures to represent a “part-whole” hierarchy .The Composite Pattern allow clients to treat individual objects and composite objects uniformly. UML Used in Qt Exam…...

企业网站设计开发服务/外贸网站

AtCoder Beginner Contest 196 https://atcoder.jp/contests/abc196/tasks。 A - Difference Max https://atcoder.jp/contests/abc196/tasks/abc196_a。 签到题&#xff0c;能看懂题目意思&#xff0c;应该就可以完成。给我们四个数字 &#xff0c;找出一个 和 &#xff…...

东莞保安公司在哪里/嘉峪关seo

本文将介绍如何分组数据&#xff0c;以便能汇总表内容的子集&#xff0c;这涉及两个新SELECT语句子句&#xff0c;分别是 GROUP BY 子句和HAVING子句。 1.1 创建分组 分组是在SELECT语句的GROUP BY子句中建立的。 输入&#xff1a; SELECT vend_id,COUNT(*) AS num_prods FROM …...

wordpress链接里的图像地址/郑州seo技术服务顾问

https://blog.csdn.net/p942005405/article/details/84764104 评论区&#xff1a; 上面的所有结论都是基于什么得到的&#xff1f;真是武断&#xff01;&#xff01;STL的实现版本很多&#xff0c;VS、GCC版本不同&#xff0c;实现都不同&#xff0c;建议翻看STL源代码。 新版…...

搭建 网站的环节/引擎搜索是什么意思

dockerfile文件放在golang程序根目录下&#xff1a; FROM golang:1.17.3WORKDIR /appCOPY . /app # 依赖私有第三方module git源时需要授权 RUN git config --global credential.helper store && \echo "https://{username}:{password}github.com" > $HO…...

苹果电脑用什么软件做网站/一站式网站设计

这是一份示例代码&#xff0c;用于识别句子的功能&#xff1a; import nltk nltk.download(punkt)sentence "这是一个测试句子。" tokens nltk.word_tokenize(sentence) print(tokens)首先&#xff0c;我们使用 nltk 库中的 word_tokenize 函数将句子分词。然后&am…...

做网站都需要数据库吗/民宿平台搜索量上涨

编辑&#xff1a;哈雷 | 来源&#xff1a;巨盒创意 | 欢迎转发到朋友圈 日常工作中&#xff0c;我们可能有这样的需求&#xff0c;我们的数据分别存放在N个工作簿里&#xff0c;我们需要把这些零散的数据都移动到一个工作簿里面&#xff0c;而且每张工作表分别存在&#xf…...