(即插即用模块-特征处理部分) 三十二、(TGRS 2024) MDAF 多尺度双表示对齐过滤器

在这里插入图片描述

文章目录

  • 1、Multiscale Dual-Representation Alignment Filter
  • 2、代码实现

paper:SFFNet: A Wavelet-Based Spatial and Frequency Domain Fusion Network for Remote Sensing Segmentation

Code:https://github.com/yysdck/SFFNet


1、Multiscale Dual-Representation Alignment Filter

频率域特征和空间域特征分别捕捉图像的不同方面和属性,但它们之间存在语义差异。直接将两者融合可能导致特征表示不一致,无法充分发挥各自优势。需要一种方法来对齐两者的语义,并选择更具代表性的特征进行融合。所以这篇论文提出一种 多尺度双表示对齐过滤器(Multiscale Dual-Representation Alignment Filter),其主要包含以下两点:多尺度映射 (Multiscale Mapping):使用不同尺度的竖条卷积对频率域特征和空间域特征进行处理。将处理后的特征拼接并进行 1x1 卷积,得到统一尺度的矩阵 Q, K, V 作为输入。多域注意力融合 (MDAF):设计了 DAF (Dual-Representation Alignment Filter) 结构,利用交叉注意力机制实现语义对齐和特征选择。通过查询对方及其自身的键值对计算注意力,并进行特征加权,最终实现特征选择。

实现过程:

  1. 多尺度映射:对空间域特征 Fs 和频率域特征 Ff 分别进行多尺度映射,得到两组矩阵 (Q1, K1, V1) 和 (Q2, K2, V2)
  2. DAF 计算:计算 DAF 输出 F1 和 F2:(1)F1 = δ1×1(Attn(Q2, K1, V1)):使用 Ff 的 Q, K, V 与 Fs 的 K, V 计算注意力,并进行特征加权。(2)F2 = δ1×1(Attn(Q1, K2, V2)):使用 Fs 的 Q, K, V 与 Ff 的 K, V 计算注意力,并进行特征加权。
  3. MDAF 输出:将 F1 和 F2 拼接得到最终的输出特征。

Multiscale Dual-Representation Alignment Filter 结构图:
在这里插入图片描述


2、代码实现

import torch
import torch.nn as nn
import torch.nn.functional as F
import numbers
from einops import rearrangedef to_3d(x):return rearrange(x, 'b c h w -> b (h w) c')def to_4d(x, h, w):return rearrange(x, 'b (h w) c -> b c h w', h=h, w=w)class BiasFree_LayerNorm(nn.Module):def __init__(self, normalized_shape):super(BiasFree_LayerNorm, self).__init__()if isinstance(normalized_shape, numbers.Integral):normalized_shape = (normalized_shape,)normalized_shape = torch.Size(normalized_shape)assert len(normalized_shape) == 1self.weight = nn.Parameter(torch.ones(normalized_shape))self.normalized_shape = normalized_shapedef forward(self, x):sigma = x.var(-1, keepdim=True, unbiased=False)return x / torch.sqrt(sigma + 1e-5) * self.weightclass WithBias_LayerNorm(nn.Module):def __init__(self, normalized_shape):super(WithBias_LayerNorm, self).__init__()if isinstance(normalized_shape, numbers.Integral):normalized_shape = (normalized_shape,)normalized_shape = torch.Size(normalized_shape)assert len(normalized_shape) == 1self.weight = nn.Parameter(torch.ones(normalized_shape))self.bias = nn.Parameter(torch.zeros(normalized_shape))self.normalized_shape = normalized_shapedef forward(self, x):mu = x.mean(-1, keepdim=True)sigma = x.var(-1, keepdim=True, unbiased=False)return (x - mu) / torch.sqrt(sigma + 1e-5) * self.weight + self.biasclass LayerNorm(nn.Module):def __init__(self, dim, LayerNorm_type):super(LayerNorm, self).__init__()if LayerNorm_type == 'BiasFree':self.body = BiasFree_LayerNorm(dim)else:self.body = WithBias_LayerNorm(dim)def forward(self, x):h, w = x.shape[-2:]return to_4d(self.body(to_3d(x)), h, w)class MDAF(nn.Module):def __init__(self, dim, num_heads=8, LayerNorm_type='WithBias'):super(MDAF, self).__init__()self.num_heads = num_headsself.norm1 = LayerNorm(dim, LayerNorm_type)self.norm2 = LayerNorm(dim, LayerNorm_type)self.project_out = nn.Conv2d(dim, dim, kernel_size=1)self.conv1_1_1 = nn.Conv2d(dim, dim, (1, 7), padding=(0, 3), groups=dim)self.conv1_1_2 = nn.Conv2d(dim, dim, (1, 11), padding=(0, 5), groups=dim)self.conv1_1_3 = nn.Conv2d(dim, dim, (1, 21), padding=(0, 10), groups=dim)self.conv1_2_1 = nn.Conv2d(dim, dim, (7, 1), padding=(3, 0), groups=dim)self.conv1_2_2 = nn.Conv2d(dim, dim, (11, 1), padding=(5, 0), groups=dim)self.conv1_2_3 = nn.Conv2d(dim, dim, (21, 1), padding=(10, 0), groups=dim)self.conv2_1_1 = nn.Conv2d(dim, dim, (1, 7), padding=(0, 3), groups=dim)self.conv2_1_2 = nn.Conv2d(dim, dim, (1, 11), padding=(0, 5), groups=dim)self.conv2_1_3 = nn.Conv2d(dim, dim, (1, 21), padding=(0, 10), groups=dim)self.conv2_2_1 = nn.Conv2d(dim, dim, (7, 1), padding=(3, 0), groups=dim)self.conv2_2_2 = nn.Conv2d(dim, dim, (11, 1), padding=(5, 0), groups=dim)self.conv2_2_3 = nn.Conv2d(dim, dim, (21, 1), padding=(10, 0), groups=dim)def forward(self, x1,x2):b, c, h, w = x1.shapex1 = self.norm1(x1)x2 = self.norm2(x2)attn_111 = self.conv1_1_1(x1)attn_112 = self.conv1_1_2(x1)attn_113 = self.conv1_1_3(x1)attn_121 = self.conv1_2_1(x1)attn_122 = self.conv1_2_2(x1)attn_123 = self.conv1_2_3(x1)attn_211 = self.conv2_1_1(x2)attn_212 = self.conv2_1_2(x2)attn_213 = self.conv2_1_3(x2)attn_221 = self.conv2_2_1(x2)attn_222 = self.conv2_2_2(x2)attn_223 = self.conv2_2_3(x2)out1 = attn_111 + attn_112 + attn_113 +attn_121 + attn_122 + attn_123out2 = attn_211 + attn_212 + attn_213 +attn_221 + attn_222 + attn_223out1 = self.project_out(out1)out2 = self.project_out(out2)k1 = rearrange(out1, 'b (head c) h w -> b head h (w c)', head=self.num_heads)v1 = rearrange(out1, 'b (head c) h w -> b head h (w c)', head=self.num_heads)k2 = rearrange(out2, 'b (head c) h w -> b head w (h c)', head=self.num_heads)v2 = rearrange(out2, 'b (head c) h w -> b head w (h c)', head=self.num_heads)q2 = rearrange(out1, 'b (head c) h w -> b head w (h c)', head=self.num_heads)q1 = rearrange(out2, 'b (head c) h w -> b head h (w c)', head=self.num_heads)q1 = torch.nn.functional.normalize(q1, dim=-1)q2 = torch.nn.functional.normalize(q2, dim=-1)k1 = torch.nn.functional.normalize(k1, dim=-1)k2 = torch.nn.functional.normalize(k2, dim=-1)attn1 = (q1 @ k1.transpose(-2, -1))attn1 = attn1.softmax(dim=-1)out3 = (attn1 @ v1) + q1attn2 = (q2 @ k2.transpose(-2, -1))attn2 = attn2.softmax(dim=-1)out4 = (attn2 @ v2) + q2out3 = rearrange(out3, 'b head h (w c) -> b (head c) h w', head=self.num_heads, h=h, w=w)out4 = rearrange(out4, 'b head w (h c) -> b (head c) h w', head=self.num_heads, h=h, w=w)out = self.project_out(out3) + self.project_out(out4) + x1+x2return outif __name__ == '__main__':x = torch.randn(4, 64, 128, 128).cuda()y = torch.randn(4, 64, 128, 128).cuda()model = MDAF(64).cuda()out = model(x,y)print(out.shape)

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

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

相关文章

Python 中为什么 hash(-1) == hash(-2)?

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 让我们从哪里开始?获取源代码!让我们浏览一下这是正确/完整的答案吗?结论前几天在浏览 Reddit 时,我在 r/Python 上看到了这样一个…

基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析

引言:工程图纸自动化处理的技术革新 在机械设计领域,CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6pycatia技术栈,提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案…

macos下 ragflow二次开发环境搭建

参考官网链接 https://ragflow.io/docs/dev/launch_ragflow_from_source虚拟环境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安装 …

libva之ffavdemo分析

ffavdemo 代码库实现了一个基于FFmpeg和VAAPI的硬件加速视频解码与渲染框架,主要用于演示视频解码与渲染的完整硬件加速流程。支持多种渲染后端(X11、DRM、EGL),适应不同显示环境。包含视频处理过滤器,可进行格式转换和…

JavaWeb 课堂笔记 —— 09 MySQL 概述 + DDL

本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…

精品推荐 | 湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)

精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与数…

【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例

今天田辛老师和小伙伴探讨了一个有趣的多义词问题, 在人工智能技术日新月异的今天,大语言模型(LLM)对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的? 比如:当用户提到"…

【maxENT】最大熵模型(Maximum Entropy Model)R语言实现

文章目录 一、相关package介绍1.1 dismo 包1.2 raster包1.3 常见问题与解决 二、代码示例 🟢🟠先看:【maxENT】最大熵模型(Maximum Entropy Model)介绍与使用(maxENT软件) ASCII文件太大&#…

哈希表-算法小结

哈希表 map set 数组 在C中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示: 集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率std::set红黑树有序否否O(log n)O(log n)std::multiset红黑树有序是否…

OpenCompass模型评估

OpenCompass面向大模型的开源方和使用者, 提供开源、高效、全面的大模型评测开放平台。 一、OpenCompass文档 1.基础安装 使用Conda准备 OpenCompass 运行环境: conda create --name opencompass python3.10 -y conda activate opencompass2. 安装 Op…

博途 TIA Portal之1200做主站与有意思的板子做MODBUS_RTU通讯

做为博途的硬件,1200和1500本体都不具有串口通讯功能,只能使用扩展板或是通讯模块完成。 其中1200使用CB1241或CM1241进行串口通讯,本文将使用CM1241进行演示。 1、硬件介绍 1200的PLC一台,有意思的板子(以下简单4D板)一台。 其中1200带扩展模块CM1241 RS232;4D板使…

【深度学习与实战】3.1 逻辑回归模型

‌1. 定义与核心思想‌ 逻辑回归(Logistic Regression)是一种用于‌二分类问题‌的统计学习方法,通过‌sigmoid函数‌将线性回归的输出映射到[0,1]区间,表示样本属于某一类别的概率‌。 ‌本质‌:广义线性模型&#x…

AI三万字论文生成效果——随机森林在信用卡欺诈分析

以下内容全文由AI制作,有gemini和gpt模型配合一次性生成(即未来我们会发布的功能),一次性生成的三万多字论文效果。 标题:随机森林在信用卡欺诈分析中的应用研究 摘要 信用卡欺诈已成为全球金融领域面临的严峻挑战…

质检LIMS系统在半导体制造行业的应用 半导体质量革命的现状

在半导体这个“工业皇冠上的明珠”领域,纳米级的精度要求与质量管控如同硬币的两面。随着芯片制程向3nm、2nm演进,传统质检模式已难以满足海量数据、复杂工艺的质量追溯需求。质检LIMS实验室系统作为质量管理的中枢神经,正在重构半导体制造的…

idea手动创建resources文件夹

有时maven没有构建成功可能造成,resources文件夹不创建的现象 此时我们可以手动创建 手动创建

利用Ruby的Typhoeus编写爬虫程序

Typhoeus是一个基于libcurl的HTTP客户端,支持并行请求,适合高效爬取数据。用户可能想要一个简单的例子,或者需要处理更复杂的情况,比如分页、并发请求或者数据解析。 首先,我应该检查用户是否已经安装了Typhoeus。通常…

【mllm】——x64模拟htp的后端无法编译debug

mllm, qnn, x64 code:https://github.com/UbiquitousLearning/mllm 1. 问题 通过自定义qualcomm graph使用高通的htp后端进行llm推理,网络暂时只有mllm,和https://github.com/chraac/llama.cpp。qualcomm是支持x64模拟htp推理的,这样比较好d…

JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列

以下是 JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列: 1. JDK 1.0 (1996) 发布年份:1996年1月23日关键特性: Java首次正式发布。核心语言特性…

撰写学位论文Word图表目录的自动生成

第一步:为图片和表格添加题注 选中图片或表格 右键点击需要编号的图片或表格,选择 【插入题注】(或通过菜单栏 引用 → 插入题注)。 设置题注标签 在弹窗中选择 标签(如默认有“图”“表”,若无需自定义标…

Xcode为不同环境配置不同的环境变量

一般有三种方式: 一、通过多Target 二、通过scheme,也就是多configurations 三、通过.xcconfig文件 先来看第二种方式:通过scheme,也就是多configurations,包括自定义User-settings 第一步:增加configurations,Xcode默认为我们生成了…