J5 - DenseNet与SE模块相结合



环境

  • 系统: Linux
  • 语言: Python3.8.10
  • 深度学习框架: Pytorch2.0.0+cu118
  • 显卡:GTX2080TI

步骤

环境设置

首先是包引用,使用pytorch,处理CV任务,一般包引用都是统一的

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torch.utils.data import DataLoader, random_split
import torchvision import datasets, transforms

import matplotlib.pyplot as plt
import numpy as np
from torchinfo import summary

from PIL import Image
import random, pathlib, copy
from collections import OrderedDict

声明一个设备对象,模型、数据都要转移到相同的设备对象中,才能访问

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

数据准备

下载并解压猴痘识别数据集,然后通过pathlib打开查看一下图像的尺寸等信息

path = './monkeypox'
lib_path = pathlib.Path(path)
images = list(lib_path.glob('*/*'))
for _ in range(5):
	print(np.array(Image.open(str(random.choice(images))).shape)

打印的结果展示所有的图像都是三通道,大小为224*224的,我一般还会再把图像随机取几个打印一下看看是什么样的。不过这个猴痘病毒的图像有点恶心,所以我就不贴了。

(224, 224, 3)
(224, 224, 3)
(224, 224, 3)
(224, 224, 3)
(224, 224, 3)
# 随机打印20张图像
plt.figure(figsize=(20, 4))
for i in range(20):
	plt.subplot(2, 10, i+1)
	plt.axis('off')
	image = random.choice(images)
	plt.title(image.parts[-2])
	plt.imshow(Image.open(str(image)))

由此可以开始编写数据集的预处理transform

transform = transforms.Compose([
	transforms.Resize([224, 224]),
	transforms.ToTensor(),
	transforms.Normalize(
       mean=[0.485, 0.456, 0.406], 
        std=[0.229, 0.224, 0.225],
	)])

定义好了图像转换到向量的transform后,就可以开始进行数据集的制作环节了

dataset = datasets.ImageFolder(path, transform=transform)
class_names = [x for x in dataset.class_to_idx]
print(class_names)
['Others', 'MonkeyPox']

然后是训练集和测试集的划分

train_size = int(len(dataset) * 0.9)
test_size = len(dataset) - train_size

train_dataset, test_dataset = random_split(dataset, [train_size, test_size])

然后是将数据集创建数据加载器

batch_size = 32
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size)

模型设计

SE模块图
从图中可以发现,SE模块的输入和输入形状完全一致,目的是为了逐通道计算一个权重值,更好的抑制无关的参数,增强真正学习到的参数。
首先是创建SE层

class SELayer(nn.Module):
	def __init__(self, input_size, hidden_size):
		super().__init__()

		self.avgpool = nn.AdaptiveAvgPool2d(1)
		self.hidden = nn.Linear(input_size, hidden_size)
		self.restore = nn.Lineare(hidden_size, input_size)

	def forward(self, inputs):
		x = self.avgpool(inputs)
		
		x = x.view(x.size(0), -1)
		x = self.hidden(x)
		x = F.relu(x)

		x = self.restore(x)
		x = F.sigmoid(x)
		
		x = x.view(x.size(0), -1, 1, 1)
		scaled = x*inputs
		return scaled

创建测试向量来测试SE模块

se = SELayer(1024, 256)
inputs = np.zeros((16, 1024, 6, 6))
se(inputs).shape

SE模块测试
通过结果可以发现,输入和输出的形状是完全一致的。接下来开始编写DenseNet的DenseBlock模块

class ConvBlock(nn.Sequential):
	def __init__(self, input_size, growth_rate, name):
		super().__init__()

		self.add_module(name + '_0_bn', nn.BatchNorm2d(input_size))
		self.add_module(name + '_0_relu', nn.ReLU())
		self.add_module(name + '_1_conv', nn.Conv2d(input_size, 4*growth_rate, kernel_size=1, bias=False))
		
		self.add_module(name + '_1_bn', nn.BatchNorm2d(4*growth_rate))
		self.add_module(name + '_1_relu', nn.ReLU())
		self.add_module(name + '_2_conv', nn.Conv2d(4*growth_rate, growth_rate, kernel_size=3, padding='same', bias=False)
	def forward(self, inputs):
		x = super().forward(inputs)
		return torch.cat([inputs, x], dim=1)

class DenseBlock(nn.Sequential):
	def __init__(self, input_size, blocks, name):
		super().__init__()

		growth_rate = 
<think>首先,用户的问题是:“我想了解SE - ResNet相关信息 请问SE - ResNet介绍、原理、应用等相关信息”。这要求我提供关于SE-ResNet的介绍、基本原理和应用领域。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户引用了几个站内引用,我需要参考这些引用: - 引用[1]: 谈论3D-SE-ResNet在遥感领域的应用,包括地物分类、植被监测等。还提到了未来研究方向如模型优化、多模态数据融合、实时应用。[^1] - 引用[2]: 描述SE-Net模块嵌入传统CNN架构中,通过通道级注意力机制增强性能。涉及全局信息池化和权重调整。[^2] - 引用[3]: 展示SE模块嵌入到Inception和ResNet中,包括维度信息和SE模型效果对比。[^3] - 引用[4]: 解释SE-ResNet module,包括Reweight操作,特征重标定。[^4] - 引用[5]: 讨论SE-NET应用于ResNet,引入SE块增强通道相互关系。[^5] 用户的问题焦点是SE-ResNet的介绍、原理、应用。所以,我应该基于这些引用和自己的知识构建回答。 关键点: - **SE-ResNet介绍**: SE-ResNet是ResNet架构的变体,引入了Squeeze-and-Excitation (SE) 模块。ResNet是深度残差网络,用于图像识别等任务。 - **原理**: SE模块的核心是通道注意力机制。它通过Squeeze步骤(如全局平均池化)压缩特征图到通道级别的描述符,然后Excitation步骤(通常是全连接层)学习每个通道的重要性权重,最后Reweighting步骤将权重应用到原始特征图上。这允许网络自适应地强调重要特征。 - 数学上:给定输入特征图$X$,形状为$H \times W \times C$。 - Squeeze: 计算每个通道的平均值,得到$1 \times 1 \times C$的向量。 - Excitation: 通过网络(如两个FC层)输出通道权重向量$S$。 - Reweight: 将$S$乘以原始特征图$X$,得到输出。 - 公式:$$S = \sigma(W_2 \delta(W_1 z))$$ 其中$z$是全局平均池化结果,$\delta$是ReLU,$\sigma$是sigmoid。 - **应用**: 如引用中提到的,广泛应用于图像分类、目标检测、语义分割、遥感图像处理等。具体到引用[1],在地物分类、植被监测、变化检测中有效。 回答结构: 1. **介绍SE-ResNet**:定义它,基于ResNet和SE模块的结合。 2. **详细解释原理**:分步骤描述SE模块的工作机制,使用数学表达式。 3. **应用领域**:列出常见应用,参考引用如遥感领域的应用。 4. **生成相关问题**:在末尾添加相关问题部分。 确保使用中文回答。引用时自然地添加引用标识,例如在相关段落末尾添加[^1]等。 生成相关问题: - 基于用户问题和引用,例如: 1. SE模块如何集成到ResNet架构中? 2. SE-ResNet在遥感图像处理中的具体优势是什么? 3. 如何优化SE-ResNet以提高性能? 4. SE-ResNet其他注意力机制的比较? 5. SE-ResNet的实际部署挑战? 最后,回答要清晰、结构良好。 </think>### SE-ResNet介绍、原理应用 SE-ResNet(Squeeze-and-Excitation ResNet)是一种基于经典ResNet(残差网络)架构的改进模型,它引入了SE模块(Squeeze-and-Excitation Block)以增强网络的通道注意力机制。这种设计源于Hu等人在2017年提出的SE-Net,通过自适应地重新校准特征图的通道权重,使网络能够更有效地捕捉重要信息,并抑制无关特征[^2][^4]。SE-ResNet广泛应用于图像分类、目标检测和遥感分析等任务,显著提升了模型性能和泛化能力。 #### 1. SE-ResNet介绍 SE-ResNet的核心创新是将SE模块嵌入到ResNet的残差块中。ResNet本身通过残差连接解决了深层网络训练中的梯度消失问题,而SE模块则添加了通道级别的注意力机制。这使得模型能动态调整每个通道的特征权重,从而放大有用特征并抑制噪声[^4][^5]。例如,在ResNet架构中,SE模块通常插入在残差块的卷积层之后,形成SE-ResNet模块(如下图所示结构)。 ```plaintext 输入特征图 → 卷积层 → SE模块 → 残差连接 → 输出特征图 ``` 这种集成方式保持了ResNet的深度优势,同时引入了轻量级的注意力计算,增加了模型对不同场景的适应能力[^3][^5]。相较于原始ResNet,SE-ResNet在ImageNet等基准数据集上取得了更高的准确率,且计算开销相对较小[^3]。 #### 2. SE-ResNet原理 SE模块的原理基于“Squeeze(压缩)”、“Excitation(激励)”和“Reweight(重加权)”三个步骤,实现了通道注意力机制。下面详细解释其数学过程(使用独立公式格式): 给定输入特征图$X \in \mathbb{R}^{H \times W \times C}$,其中$H$是高度,$W$是宽度,$C$是通道数。 - **Squeeze操作**:通过全局平均池化(Global Average Pooling)压缩空间维度,生成通道级别的统计量$z \in \mathbb{R}^{1 \times 1 \times C}$。这一步捕捉全局上下文信息: $$ z_c = \frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} X_c(i,j) $$ 其中$z_c$表示第$c$个通道的全局平均值。 - **Excitation操作**:使用全连接层和非线性激活函数学习每个通道的权重$s \in \mathbb{R}^{1 \times 1 \times C}$。这里引入了一个瓶颈结构(例如两个FC层)来建模通道间的依赖关系: $$ s = \sigma(W_2 \delta(W_1 z)) $$ 其中$W_1$和$W_2$是全连接层的权重矩阵,$\delta$是ReLU激活函数,$\sigma$是sigmoid函数,确保输出权重在$[0,1]$范围内。这步动态调整通道重要性,例如在高光谱遥感图像中,强调植被相关通道[^2][^4]。 - **Reweight操作**:将学到的权重$s$应用到原始特征图上,通过逐通道乘法实现特征重标定: $$ \tilde{X}_c = s_c \cdot X_c $$ 其中$\tilde{X}$是输出特征图,它增强了有用特征并减弱了噪声通道。 在SE-ResNet中,SE模块被嵌入到每个残差块的末端(如图示示例),形成端到端的训练流程[^3][^4]。整体上,SE模块通过$ \text{Squeeze} \to \text{Excitation} \to \text{Reweight} $序列,提升了模型的特征选择能力,参数增加少(仅占ResNet的~1%),计算效率高[^5]。 #### 3. SE-ResNet应用 SE-ResNet凭借其通道注意力优势,已广泛应用于多个领域: - **图像分类和目标检测**:在ImageNet、COCO等数据集上,SE-ResNet显著提高了分类精度和检测鲁棒性。例如,SE模块能使ResNet更好地区分细微特征,如动物纹理或物体边缘[^4][^5]。 - **遥感图像处理**:如参考文献所述,3D-SE-ResNet(SE-ResNet的3D扩展)在地物分类、植被监测和土地利用变化检测中表现突出。高光谱遥感图像提供丰富的光谱信息,SE模块能高效利用这些数据,提升分类准确率[^1]。例如,在植被监测任务中,SE机制自动增强叶绿素相关的通道,减少云层干扰。 - **其他领域**:包括语义分割(结合UNet或DenseNet)、医疗影像分析(如肿瘤检测)和实时系统(无人机导航)。未来研究方向包括模型优化(如改进SE块结构)、多模态数据融合(结合RGB或LiDAR数据)和实时应用(优化计算延迟)[^1][^5]。 SE-ResNet的优点包括:轻量级注意力机制、易于集成到现有架构、提升泛化能力;缺点是训练时需额外参数调整,实时应用中可能需优化延迟[^1][^3]。整体上,它代表了注意力机制在CNN中的关键进展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值