Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文

Linux内核在启动过程中,驱动模块的加载顺序由initcall宏定义决定,如纯初始化、核心初始化等不同阶段。module_init对应的启动序号为6,在do_initcalls函数中执行。驱动的具体启动顺序在同一优先级下由Makefile中的.o文件链接次序决定。可通过system.map查看详细次序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序

 

#define pure_initcall(fn) __define_initcall("0",fn,0)

#define core_initcall(fn) __define_initcall("1",fn,1)

#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)

#define postcore_initcall(fn) __define_initcall("2",fn,2)

#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)

#define arch_initcall(fn) __define_initcall("3",fn,3)

### GAM 模型中的两层感知机结构及实现 GAM(Global Attention Mechanism)是一种用于提升卷积神经网络性能的注意力机制,其核心在于通过顺序处理通道和空间维度的信息来增强特征表达能力。在 GAM 的设计中,两层感知机被用来分别建模通道注意力和空间注意力。 #### 1. 通道注意力模块 通道注意力的核心是对输入特征图的不同通道的重要性进行加权调整。这通常由一个多层感知机(MLP)完成,具体过程如下: - 首先通过对全局平均池化操作提取每个通道的统计信息[^2]。 - 接着将这些统计信息送入一个小型 MLP 中,该 MLP 包含两个全连接层以及中间的激活函数(通常是 ReLU)。假设输入张量形状为 \(C \times H \times W\),则通道注意力部分可以表示为: ```python import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, channels, reduction_ratio=16): super(ChannelAttention, self).__init__() self.fc = nn.Sequential( nn.Linear(channels, channels // reduction_ratio), nn.ReLU(), nn.Linear(channels // reduction_ratio, channels), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() # Batch size, Channels, Height, Width avg_pool = x.mean(dim=(2, 3)) # Global Average Pooling (b,c) channel_attention = self.fc(avg_pool).view(b, c, 1, 1) # Apply MLP and reshape return x * channel_attention.expand_as(x) # Element-wise multiplication with input ``` 上述代码定义了一个简单的通道注意力模块,其中 `reduction_ratio` 控制了第一个全连接层的压缩比例。 --- #### 2. 空间注意力模块 空间注意力的目标是在不同位置之间分配权重,从而突出重要区域并抑制不重要的背景噪声。同样采用两层感知机的方式实现这一功能: - 输入经过最大池化和平均池化后得到的空间分布会被拼接在一起作为后续计算的基础数据。 - 这些数据随后进入另一个小型 MLP 来学习空间关系,并最终生成逐像素的注意力建议向量。 下面是对应的空间注意力模块实现方式: ```python class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) combined_feature_map = torch.cat([avg_out, max_out], dim=1) spatial_attention = self.conv(combined_feature_map) spatial_attention = self.sigmoid(spatial_attention) return x * spatial_attention ``` 这里利用了卷积代替传统的全连接层来进行局部模式的学习,同时保持较低参数数量以便于训练收敛。 --- #### 3. 组合应用 为了使整个 GAM 更高效,在实际部署过程中会串联起这两个子组件形成完整的架构。即先执行通道级运算再转向更细粒度的位置分析阶段;或者反过来亦可依据特定场景需求灵活调整优先次序。 综合来看,这种分而治之策略不仅简化了复杂度还提升了模型泛化力,尤其适合应用于目标检测等领域内的轻量化改造项目之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值