AI筑基录——注意力机制篇
前言回顾之前的内容我们介绍了神经网络的基础知识并且带着大家简单的完成了卷积神经网络的搭建接下来我们打算介绍一种优化方式——注意力机制注意此注意力并非 Transformer 中的注意力机制如果前面几期的内容没有看的可以点击下面的链接觉得内容有帮助的希望可以关注一下博主博主将持续更新专栏 AI筑基录AI筑基录——卷积神经网络篇-CSDN博客注意力机制在谈论注意力机制之前我们先明白注意力是什么我们生活中老师可能会说集中注意力看黑板这个时候我们的注意力通常就会落在黑板上面把关注的权重更多的放在黑板上面从而降低其他部分的权重注意力机制做的就是面对很多信息时模型自动判断哪些信息更重要并给重要信息更大的权重具体的做法就是通过加权的形式为什么需要注意力机制原因很简单因为不是每一个位置或者通道的信息都是重要的因此我们要把目光放在重要的区域所以我们需要注意力机制通道注意力机制经过 CNN 神经网路假设卷积层输出[ B,64,128,128 ]通道数是 64 对应特征图也是 64 张因为每一张特征图所代表的信息是不一样的于是通道注意力会为每一个通道生成一个权重通道注意力通常会先生成一个注意力权重接着广播乘法把每一个通道赋予对应的权重参数这样做形状不变但重要通道被增强不重要通道被抑制对于一个原始特征图 x[B, C, H, W] 每一个通道里面有 HxW个数为了判断整个通道重不重要首先需要把空间信息压缩掉常见方法是全局平均池化接着经过一个小的 MLP 层目的是学习各个通道之间存在什么关系以及最终应该给每个通道多大的权重最后经过 Sigmoid函数输出权重参数下面是 SE Attention 的代码示例class ChannelAttention(nn.Module): def __init__(self, channels, reduction16): super().__init__() hidden_channels max(channels // reduction, 1) # [B,C,H,W] - [B,C,1,1] self.avg_pool nn.AdaptiveAvgPool2d(1) # 用1×1卷积实现通道维度上的MLP self.mlp nn.Sequential( nn.Conv2d(channels, hidden_channels, kernel_size1), nn.ReLU(inplaceTrue), nn.Conv2d(hidden_channels, channels, kernel_size1) ) self.sigmoid nn.Sigmoid() def forward(self, x): weight self.avg_pool(x) weight self.mlp(weight) weight self.sigmoid(weight) return x * weight我们学习不要被动的接受内容我们不妨想一下由于采用了全局平均池化就算目标虽然在局部位置激活很强但是经过平均池化后目标特征可能被冲淡那么换句话全局池化适合小目标任务吗(因为背景信息占据主要内容)因此我们得换一个形式去描述通道那这个部分就是一个小小的优化过程了空间注意力机制前者解决哪一个通道重要空间注意力机制解决的就是哪个位置重要因此它首先是把通道数压缩一般采用的方法是分别沿通道最大池化和平均池化拼接后经过卷积层最后 Sigmoid 输出权重为什么要同时做平均和最大池化呢原因是平均池化可以表示这个位置在所有通道上的整体响应如何最大池化可以表示这个位置是否至少在某一个通道上产生了非常强的响应因此两者的结合会比只有一种表示的信息丰富代码示例class SpatialAttention(nn.Module): def __init__(self, kernel_size7): super().__init__() assert kernel_size in (3, 7) padding kernel_size // 2 self.conv nn.Conv2d( in_channels2, out_channels1, kernel_sizekernel_size, paddingpadding, biasFalse ) self.sigmoid nn.Sigmoid() def forward(self, x): # 沿通道维求平均 # [B,C,H,W] - [B,1,H,W] avg_out torch.mean(x, dim1, keepdimTrue) # 沿通道维取最大值 # [B,C,H,W] - [B,1,H,W] max_out, _ torch.max(x, dim1, keepdimTrue) # [B,1,H,W] [B,1,H,W] # - [B,2,H,W] pooled torch.cat([avg_out, max_out], dim1) # [B,2,H,W] - [B,1,H,W] weight self.conv(pooled) weight self.sigmoid(weight) return x * weightCBAM 注意力机制CBAM 注意力就是把前面两个合并在一起但是顺序一般固定为先通道注意力后空间注意力这个是研发者实验发现串联方式优于并行方式而在两种串联顺序中通道优先略好于空间优先代码示例import torch import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, channels, reduction16): super().__init__() hidden_channels max(channels // reduction, 1) self.avg_pool nn.AdaptiveAvgPool2d(1) self.max_pool nn.AdaptiveMaxPool2d(1) # 两个池化分支共享同一个MLP self.shared_mlp nn.Sequential( nn.Conv2d( channels, hidden_channels, kernel_size1, biasFalse ), nn.ReLU(inplaceTrue), nn.Conv2d( hidden_channels, channels, kernel_size1, biasFalse ) ) self.sigmoid nn.Sigmoid() def forward(self, x): # 两个分支都是 [B,C,H,W] - [B,C,1,1] avg_out self.shared_mlp(self.avg_pool(x)) max_out self.shared_mlp(self.max_pool(x)) weight self.sigmoid(avg_out max_out) # [B,C,H,W] * [B,C,1,1] return x * weight class SpatialAttention(nn.Module): def __init__(self, kernel_size7): super().__init__() assert kernel_size in (3, 7) padding kernel_size // 2 self.conv nn.Conv2d( 2, 1, kernel_sizekernel_size, paddingpadding, biasFalse ) self.sigmoid nn.Sigmoid() def forward(self, x): # 沿通道维压缩 avg_out torch.mean(x, dim1, keepdimTrue) max_out, _ torch.max(x, dim1, keepdimTrue) # [B,1,H,W] 和 [B,1,H,W] # - [B,2,H,W] pooled torch.cat([avg_out, max_out], dim1) # - [B,1,H,W] weight self.sigmoid(self.conv(pooled)) # [B,C,H,W] * [B,1,H,W] return x * weight class CBAM(nn.Module): def __init__(self, channels, reduction16, kernel_size7): super().__init__() self.channel_attention ChannelAttention( channels, reduction ) self.spatial_attention SpatialAttention( kernel_size ) def forward(self, x): # 先选择重要通道 x self.channel_attention(x) # 再选择重要空间位置 x self.spatial_attention(x) return x但是有一个点我们要注意不是说添加了对应的优化模块我们就一定可以涨点添加优化模块我们难免引入一个问题就是模型的参数量增加这个问题就会引出更多问题比如计算成本、拟合问题、存储问题等这也就是创新中常见的权衡所以就算没有涨点也很正常但是这也不代表我们这么做就是没有用我们可以注意力存图观察模型的注意主要是落在哪一个方面后面对其进一步做优化小思考我们不妨先归一这三个机制理想情况下我们是希望通道和空间都被赋予一个独立的权重这样做同一个空间位置对不同通道的重要性不同同一个通道在不同空间位置的重要性也不同但是直接预测成本太高(注意力图计算和内存成本)因此我们通常单独抓一个进行建模像是 CBAM 也是两者的近似组合现在的问题就是转化成为如何在低计算成本下建模更强的通道空间耦合关系呢大家有想法的可以在评论区讨论一下总结这一讲主要是介绍卷积神经网络的一个常见优化方式我们介绍了三种常见的注意力机制本源都是来自于我们卷积层输出维度产生的一般放置的位置是卷积层后面残差连接的前面AI筑基录的专栏会慢慢更新完带大家有体系的理解神经网络的由来制作不易喜欢博主文章的可以点赞收藏关注这些都是我持续更新的动力

相关新闻

嵌入式2英寸电容触摸屏驱动指南:SPI与I2C协同开发实战

嵌入式2英寸电容触摸屏驱动指南:SPI与I2C协同开发实战

1. 从“点一下”到“滑一下”:2英寸电容触摸屏的入门选择如果你玩过树莓派或者Arduino,大概率接触过那种需要按下去才有反应的电阻屏,或者干脆就是不带触摸的“裸屏”。最近几年,一种更接近我们手机体验的2英寸电容触摸LCD开始在小…

2026/10/15 7:22:36 阅读更多 →
PCA主成分分析实战:从鸢尾花数据集详解降维原理与标准化重要性

PCA主成分分析实战:从鸢尾花数据集详解降维原理与标准化重要性

1. 从一道经典例题切入:为什么PCA不是“降维魔法”? 如果你在数据科学或者机器学习的路上摸索过一阵子,大概率听说过PCA(主成分分析)这个名字。它常常被描述为一种“降维神器”或“特征提取工具”,听起来像…

2026/10/15 3:01:54 阅读更多 →
树莓派3.4英寸DSI LCD屏幕连接、驱动与优化全攻略

树莓派3.4英寸DSI LCD屏幕连接、驱动与优化全攻略

1. 项目概述:3.4英寸DSI LCD屏幕与树莓派的邂逅最近在捣鼓一个需要便携显示的项目,目光自然就落在了树莓派和各类小尺寸屏幕上。市面上HDMI接口的屏幕虽然通用,但接线繁琐、占用接口,对于追求极致简洁和低功耗的嵌入式应用来说&am…

2026/10/15 1:27:06 阅读更多 →

最新新闻

瑞萨RA4L1开发板e2studio环境搭建与最小系统验证实战

瑞萨RA4L1开发板e2studio环境搭建与最小系统验证实战

简介:本资源面向使用瑞萨RA4L1系列MCU进行嵌入式开发的工程师与学习者,基于e2studio集成开发环境,提供RA4L1评估套件的开发板测试工程。RA4L1基于支持TrustZone的Arm Cortex-M33内核,工作电压低至1.6V,待机电流低至1.6…

2026/10/15 13:04:28 阅读更多 →
Kubernetes Dashboard从入门到实战:部署、权限与排障全解析

Kubernetes Dashboard从入门到实战:部署、权限与排障全解析

Kubernetes图形化工具一直是实操中的重要一环。命令行的kubectl固然强大,但对于需要快速预览集群状态、排查异常、或者让团队成员低门槛接入的场景,一个趁手的图形界面能省下大量沟通成本。这次想聊的就是K8s生态里最经典的图形化工具:Dashbo…

2026/10/15 13:04:28 阅读更多 →
SQLite FTS5上下文模式:轻量级本地AI语义检索实践

SQLite FTS5上下文模式:轻量级本地AI语义检索实践

1. “context-mode”到底是什么?一个被误读的技术概念正在悄悄改变本地AI工作流最近在多个开发者社区、数据库工具讨论组和AI工程实践帖子里,频繁出现“context-mode”这个词。它既不是SQLite的官方术语,也不属于任何主流AI框架的内置模式&am…

2026/10/15 13:04:28 阅读更多 →
context-mode:运行时行为分派机制的设计与落地实践

context-mode:运行时行为分派机制的设计与落地实践

1. 从“context-mode”这个词说起:它到底在解决什么问题第一次看到“context-mode”这个标题,很多人会愣一下——它不像“XX管理系统”“XX爬虫框架”那样一眼能看出用途。我最初接触这个词是在做对话式应用的时候,当时团队里有人提出“要不要…

2026/10/15 13:04:28 阅读更多 →
SQLite上下文感知检索:基于FTS5与MCP的语义调度模式

SQLite上下文感知检索:基于FTS5与MCP的语义调度模式

1. “context-mode”到底是什么?别被术语唬住,它本质是种数据上下文调度策略“context-mode”这个词最近在开发者圈子里频繁出现,尤其和MCP、SQLite、FTS5、BM25这些词绑在一起刷屏。很多人第一反应是——又一个新出的AI协议?还是…

2026/10/15 13:04:28 阅读更多 →
emoji 图片与编码表维护指南:从豆腐块到精准匹配

emoji 图片与编码表维护指南:从豆腐块到精准匹配

简介:这份资源面向移动端开发者、前端工程师及文本处理研究者,系统整理了emoji表情的图形素材与编码对照数据,帮助解决跨平台表情显示异常、编码转换与数据库存储等实际问题。压缩包共468个文件,以467张png图片和1个sql数据库文件…

2026/10/15 13:03:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →