探索声音的未来:Hierarchical Token Semantic Audio Transformer

探索声音的未来:Hierarchical Token Semantic Audio Transformer

HTS-Audio-TransformerThe official code repo of "HTS-AT: A Hierarchical Token-Semantic Audio Transformer for Sound Classification and Detection"项目地址:https://gitcode.com/gh_mirrors/ht/HTS-Audio-Transformer

项目简介

在ICASSP 2022会议上发表的HTS-AT,是一个创新的音频处理模型,它将Swin Transformer与令牌语义模块结合,专为音频分类声音事件检测任务设计。通过构建层次结构并保持轻量级(仅3000万参数),HTS-AT不仅实现了音频领域的状态-of-the-art(SOTA)性能,在AudioSet、ESC-50和Speech Command V2上的表现均有所突破,而且在事件定位方面超越了传统的CNN模型。

技术剖析

HTS-AT架构的核心是其层次结构的设计,该设计允许模型对音频进行逐层理解,从局部细节到全局模式,同时引入令牌语义模块增强信息的提取和表示。这种融合方法使模型能够高效地处理不同频率和时间尺度的声音特征,从而提高识别和检测的准确性。

应用场景

  • 音频分类:无论是音乐流派识别,还是环境声音分类,如汽车喇叭声、人声笑语等,HTS-AT都能提供高精度的标签。
  • 声音事件检测:在安全监控、智能家居等领域中,快速准确地识别出特定声音事件(比如玻璃破碎、婴儿哭泣)至关重要,HTS-AT为此提供了强大的工具。
  • 事件定位:在DESED数据集上,HTS-AT展现了优异的事件时空定位能力,这对于实时音频分析和响应系统尤其有价值。

项目亮点

  • 效率与轻量化:即使只有3000万参数,HTS-AT也能展现出高效的计算性能,适合资源有限的设备。
  • SOTA性能:在AudioSet、ESC-50和Speech Command V2等广泛使用的数据集上,HTS-AT取得了最新的最佳结果。
  • 强大定位功能:与以往基于CNN的方法相比,HTS-AT在事件定位方面表现出更高的准确性。
  • 易于使用:通过简单的配置文件设置,用户可以在不同的数据集上训练和测试模型,支持单GPU运行。

开始探索

要开始你的HTS-AT之旅,首先安装必要的依赖库,然后下载并处理相应的数据集,包括AudioSet、ESC-50、Speech Command V2和DESED。配置好config.py文件后,即可启动训练和评估流程。我们还提供了预训练模型的检查点以供直接测试。详细的步骤说明可在项目README中找到。

让我们一起揭示声音世界的新维度,利用HTS-AT开启更智能的声音处理之旅!

# 引用本文档
@inproceedings{htsat-ke2022,
  author = {陈克和杜兴杰和朱碧雷和马泽军和Taylor Berg-Kirkpatrick和Shlomo Dubnov},
  title = {HTS-AT: 一个分层令牌语义音频变换器用于声音分类和检测},
  booktitle = {{ICASSP} 2022}
}

此工作基于微软的Swin Transformer,一个著名的图像分类Transformer模型,其在视觉领域已经取得了显著成果。

HTS-Audio-TransformerThe official code repo of "HTS-AT: A Hierarchical Token-Semantic Audio Transformer for Sound Classification and Detection"项目地址:https://gitcode.com/gh_mirrors/ht/HTS-Audio-Transformer

内容概要:本文详细介绍了利用粒子群优化(PSO)算法解决配电网中分布式光伏系统的选址与定容问题的方法。首先阐述了问题背景,即在复杂的配电网环境中选择合适的光伏安装位置和确定合理的装机容量,以降低网损、减小电压偏差并提高光伏消纳效率。接着展示了具体的PSO算法实现流程,包括粒子初始化、适应度函数构建、粒子位置更新规则以及越界处理机制等关键技术细节。文中还讨论了目标函数的设计思路,将多个相互制约的目标如网损、电压偏差和光伏消纳通过加权方式整合为单一评价标准。此外,作者分享了一些实践经验,例如采用前推回代法进行快速潮流计算,针对特定应用场景调整权重系数,以及引入随机波动模型模拟光伏出力特性。最终实验结果显示,经过优化后的方案能够显著提升系统的整体性能。 适用人群:从事电力系统规划与设计的专业人士,尤其是那些需要处理分布式能源集成问题的研究人员和技术人员。 使用场景及目标:适用于希望深入了解如何运用智能优化算法解决实际工程难题的人士;旨在帮助读者掌握PSO算法的具体应用方法,从而更好地应对配电网中分布式光伏系统的选址定容挑战。 其他说明:文中提供了完整的Matlab源代码片段,便于读者理解和复现研究结果;同时也提到了一些潜在改进方向,鼓励进一步探索和创新。
### Swin Transformer 的复现教程 #### 1. 模型概述 Swin Transformer 是一种分层视觉变换器 (Hierarchical Vision Transformer),它通过滑动窗口机制构建局部表示并支持跨窗口连接[^1]。该模型的核心组件包括分层设计、移位窗口 (Shifted Window) 和自注意力机制。 #### 2. 数据预处理 数据预处理阶段涉及将输入图像划分为多个 patch,并将其映射到 token 序列中。具体过程如下: - 将输入图像切分成大小为 \(P \times P\) 的 patches。 - 对每个 patch 进行线性嵌入操作,得到初始的 token 表示。 - 使用卷积下采样层进一步减少空间分辨率,形成多尺度特征图。 此阶段通常称为“阶段 1”,其中 transformer 块的数量为 \(H/4 \times W/4\),即每张图片被分解成若干 tokens[^2]。 #### 3. 移位窗口机制 为了提高效率和建模能力,Swin Transformer 引入了移位窗口策略。在标准窗口划分的基础上,每隔一层会调整窗口的位置以引入交叉窗口的信息交互。这种方法显著提升了性能,在 ImageNet-1K 图像分类任务上 top-1 准确率提高了 +1.1%,而在 COCO 目标检测任务中则分别提升 +2.8 box AP 和 +2.2 mask AP[^4]。 #### 4. PyTorch 实现代码 以下是基于 PyTorch 的 Swin Transformer 核心模块实现: ```python import torch from torch import nn class PatchEmbed(nn.Module): """Patch Embedding Layer""" def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96): super().__init__() self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) def forward(self, x): x = self.proj(x).flatten(2).transpose(1, 2) return x class Mlp(nn.Module): """Multilayer Perceptron""" def __init__(self, in_features, hidden_features=None, out_features=None): super().__init__() out_features = out_features or in_features hidden_features = hidden_features or in_features self.fc1 = nn.Linear(in_features, hidden_features) self.act = nn.GELU() self.fc2 = nn.Linear(hidden_features, out_features) def forward(self, x): x = self.fc1(x) x = self.act(x) x = self.fc2(x) return x class WindowAttention(nn.Module): """Window-based Multi-head Self Attention (MSA) module with relative position bias.""" def __init__(self, dim, window_size, num_heads): super().__init__() self.dim = dim self.window_size = window_size self.num_heads = num_heads head_dim = dim // num_heads self.scale = head_dim ** -0.5 self.qkv = nn.Linear(dim, dim * 3, bias=True) self.attn_drop = nn.Dropout(0.) self.proj = nn.Linear(dim, dim) def forward(self, x): B_, N, C = x.shape qkv = self.qkv(x).reshape(B_, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) q, k, v = qkv.unbind(0) attn = (q @ k.transpose(-2, -1)) * self.scale attn = attn.softmax(dim=-1) attn = self.attn_drop(attn) x = (attn @ v).transpose(1, 2).reshape(B_, N, C) x = self.proj(x) return x class SwinTransformerBlock(nn.Module): """Swin Transformer Block""" def __init__(self, dim, input_resolution, num_heads, window_size=7, shift_size=0): super().__init__() self.input_resolution = input_resolution self.window_size = window_size self.shift_size = shift_size if min(self.input_resolution) <= self.window_size: self.shift_size = 0 self.window_size = min(self.input_resolution) self.norm1 = nn.LayerNorm(dim) self.attn = WindowAttention( dim, window_size=(self.window_size, self.window_size), num_heads=num_heads ) self.norm2 = nn.LayerNorm(dim) mlp_hidden_dim = int(dim * 4) self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim) def forward(self, x): H, W = self.input_resolution B, L, C = x.shape assert L == H * W, "input feature has wrong size" shortcut = x x = self.norm1(x) x = x.view(B, H, W, C) # cyclic shift if self.shift_size > 0: shifted_x = torch.roll(x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2)) else: shifted_x = x # partition windows x_windows = shifted_x.unfold(1, self.window_size, self.window_size)\ .unfold(2, self.window_size, self.window_size) x_windows = x_windows.contiguous().view(-1, self.window_size*self.window_size, C) # attention and projection attn_windows = self.attn(x_windows) attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C) # reverse windows shifted_x = attn_windows.permute(0, 1, 2, 3).contiguous().view(B, H, W, C) # reverse cyclic shift if self.shift_size > 0: x = torch.roll(shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2)) else: x = shifted_x x = x.view(B, H*W, C) # FFN x = shortcut + x x = x + self.mlp(self.norm2(x)) return x class BasicLayer(nn.Module): """A basic Swin Transformer layer for one stage.""" def __init__(self, dim, depth, num_heads, window_size=7): super().__init__() self.blocks = nn.ModuleList([ SwinTransformerBlock( dim=dim, input_resolution=(window_size, window_size), num_heads=num_heads, window_size=window_size, shift_size=0 if i % 2 == 0 else window_size // 2 ) for i in range(depth)]) def forward(self, x): for blk in self.blocks: x = blk(x) return x class SwinTransformer(nn.Module): """Overall architecture of the Swin Transformer model.""" def __init__(self, img_size=224, patch_size=4, in_chans=3, num_classes=1000, embed_dim=96, depths=[2, 2, 6, 2], num_heads=[3, 6, 12, 24], window_size=7): super().__init__() self.patch_embed = PatchEmbed(img_size=img_size, patch_size=patch_size, in_chans=in_chans, embed_dim=embed_dim) dpr = [x.item() for x in torch.linspace(0, 0.1, sum(depths))] self.layers = nn.ModuleList() for i_layer in range(len(depths)): layer = BasicLayer( dim=int(embed_dim * 2 ** i_layer), depth=depths[i_layer], num_heads=num_heads[i_layer], window_size=window_size ) self.layers.append(layer) self.norm = nn.LayerNorm(int(embed_dim * 2 ** (len(depths)-1))) self.avgpool = nn.AdaptiveAvgPool1d(1) self.head = nn.Linear(int(embed_dim * 2 ** (len(depths)-1)), num_classes) if num_classes > 0 else nn.Identity() def forward(self, x): x = self.patch_embed(x) for layer in self.layers: x = layer(x) x = self.norm(x.mean(1)) x = self.head(x) return x ``` #### 5. 训练与验证流程 训练过程中可以使用常见的优化算法(如 Adam 或 SGD),并通过学习率调度器动态调整超参数。对于下游任务(如目标检测或语义分割),可以通过微调预训练权重来加速收敛。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劳治亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值