💡💡💡Эта статья относится к эксклюзивному усовершенствованию оригинала: Многомерный. модуль совместного внимания MCA,Насильственный подъем,Эффект мгновенного убийстваECA、SRM、CBAMполный инноваций, может быть непосредственно использован в качестве точки инноваций
。
Многомерный модуль совместного внимания MCA | Персональный тест для достижения резкого увеличения нескольких наборов данных, настоятельно рекомендуется, эксклюзивный первый выпуск;
бумага:https://www.sciencedirect.com/science/article/abs/pii/S0952197623012630
Рисунок 1: Схематическое сравнение предлагаемого многомерного модуля совместного внимания (d) с модулем ECA (a), SRM (b) и CBAM (c).
Рисунок 2: Общая архитектура предлагаемого модуля MCA с тремя ветвями.
Верхняя ветвь используется для фиксации взаимодействий между объектами в пространственном измерении W. Аналогичным образом, средняя ветвь используется для фиксации взаимодействий между объектами в пространственном измерении H. Нижняя ветвь отвечает за захват взаимодействия между каналами. В первых двух ветвях мы используем операции перестановки для выявления долгосрочных зависимостей между измерением канала и любым пространственным измерением. Наконец, результаты всех трех ветвей агрегируются путем простого усреднения на этапе интегрирования.
Рисунок 3: Архитектура исходного остаточного блока (слева), MCA, интегрированного в базовый остаточный блок (в центре), и MCA, интегрированного в остаточный блок с узким местом (справа).
Основной код:
class MCALayer(nn.Module):
def __init__(self, inp, no_spatial=True):
"""Constructs a MCA module.
Args:
inp: Number of channels of the input feature maps
no_spatial: whether to build channel dimension interactions
"""
super(MCALayer, self).__init__()
lambd = 1.5
gamma = 1
temp = round(abs((math.log2(inp) - gamma) / lambd))
kernel = temp if temp % 2 else temp - 1
self.h_cw = MCAGate(3)
self.w_hc = MCAGate(3)
self.no_spatial = no_spatial
if not no_spatial:
self.c_hw = MCAGate(kernel)
def forward(self, x):
x_h = x.permute(0, 2, 1, 3).contiguous()
x_h = self.h_cw(x_h)
x_h = x_h.permute(0, 2, 1, 3).contiguous()
x_w = x.permute(0, 3, 2, 1).contiguous()
x_w = self.w_hc(x_w)
x_w = x_w.permute(0, 3, 2, 1).contiguous()
if not self.no_spatial:
x_c = self.c_hw(x)
x_out = 1 / 3 * (x_c + x_h + x_w)
else:
x_out = 1 / 2 * (x_h + x_w)
return x_out
Подробности см.:
https://cv2023.blog.csdn.net/article/details/131959116