一.student
1.类所需参数
2.只传参数,未初始化
3.初始化后的self结构
4.计算学生空间注意力掩码
x表示输入的学生backbone特征。x(2,256,100,148),这里x的第零维是2,第一维是256,第二维是100,第三维是148。
(1)
代码执行前x(2,256,100,148)
代码执行后s(2,1,100,148)
该行代码实现以下公式。在x的第一维(256)上求平均值,保持维度。
(2)记录得到的学生空间注意力图的维度(2,1,100,148)
(3)
代码执行前s:(2,1,100,148)
代码执行后s:(2,14800)
该段代码将s的维度保持第零维不变,剩下自动计算,生成二维向量。
(4)
代码执行前s(2,14800)
代码执行后s(2,14800)
改行代码的作用是实现以下公式,黄色部分,这里没有计算teacher的空间注意力图。
(5)
代码执行前s(2,14800)
代码执行后s(2,1,100,148)
5.计算学生通道注意力掩码
(1)得到通道注意力图
运行后得到s(2,256)
(2)得到通道注意力掩码
运行后得到s(2,256,1,1)
6.通过通道自适应和池化学生特征。
x(2,256,100,148)
s_feat_adapt=(2,256,100,148)
s_channel_pool_adapt=(2,256)
7.通过空间自适应和池化学生特征
x(2,256,100,148)
s_spatial_pool=(2,1,100,148)
s_spatial_pool_adapt=(2,1,100,148)
8.计算非局部自适应
s_relation=(2,256,100,148)
s_relation_adapt=(2,256,100,148)
9.return
s_spatial_mask((2,1,100,148) s_channel_mask((2,256,1,1) s_channel_pool_adapt(2,256) s_spatial_pool_adapt(2,1,100,148) s_relation_adapt(2,256,100,148) s_feat_adapt(2,256,100,148)
二.teacher
1.初始化后的self结构
2.计算教师空间注意力掩码
上面第一行代码实现下图公式,第二三转换维度方便进行掩码计算。
代码运行前x(2,256,200,272)
代码运行后t_spatial_mask=(2,1,200,272), t_spatial_mask=(2,25400)
上面第一行代码实现下图公式,第二行转换维度
代码运行前t_spatial_mask=(2,25400)
代码运行后t_spatial_mask=(2,1,200,272)
3.计算教师通道注意力掩码
上面第一行代码实现以下公式
代码运行前x(2,256,200,272)
代码运行后t_channel_mask=(2,256,1,1) t_channel_mask=(2,256)
上面第一行代码实现以下公式
代码运行前t_channel_mask=(2,256)
代码运行后t_channel_mask=(2,256,1,1)
4.通过空间自适应和池化学生特征。
运行前维度x=(2,256,200,272)
运行后维度t_spatial_pool=(2,1,200,272)
5.计算非局部关系。
运行前维度x=(2,256,200,272)
运行后维度t_relation=(2,256,200,272)
6.return
t_spatial_mask(2,1,200,272) t_channel_mask(2,256,1,1) t_spatial_pool(2,1,200,272) t_relation(2,256,200,272) x(2,256,200,272)