定义一个求和融合层的类

class SumFusion(nn.Module): def init(self, dim): super(SumFusion, self).init()

# 定义前向传播函数
def forward(self, in_feats):
	return sum(in_feats)

定义一个拼接融合层的类

class CatFusion(nn.Module): def init(self, dim, height=2): super(CatFusion, self).init() self.height = height # 定义一个卷积层,将拼接后的特征图进行降维 self.conv = nn.Conv2d(dim * height, dim, kernel_size=1)

# 定义前向传播函数
def forward(self, in_feats):
	in_feats = torch.cat(in_feats, dim=1)
	out = self.conv(in_feats)
	return out

定义一个通道注意力机制模块

class CALayer(nn.Module): def init(self, channel, reduction=8): super(CALayer, self).init() d = max(channel // reduction, 4)

	# 定义一个自适应平均池化层,将特征图降到1x1大小
	self.avg_pool = nn.AdaptiveAvgPool2d(1)
	# 定义一个通道注意力机制的结构,包括两个卷积层和一个sigmoid函数
	self.ca = nn.Sequential(
			nn.Conv2d(channel, d, 1, bias=False),
			nn.ReLU(inplace=True),
			nn.Conv2d(d, channel, 1, bias=False),
			nn.Sigmoid()
	)

# 定义前向传播函数
def forward(self, x):
	y = self.avg_pool(x)
	y = self.ca(y)
	return x * y

定义一个空间注意力机制模块

class ECALayer(nn.Module): def init(self, channel, k_size=3): super(ECALayer, self).init() # 定义一个自适应平均池化层,将特征图降到1x1大小 self.avg_pool = nn.AdaptiveAvgPool2d(1) # 定义一个一维卷积层,用于计算每个通道的权重 self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False) # 定义一个sigmoid函数,将权重归一化到0~1之间 self.sigmoid = nn.Sigmoid()

# 定义前向传播函数
def forward(self, x):
    y = self.avg_pool(x)
    # 将y的形状从 [batch_size, channel, 1, 1] 转换为 [batch_size, channel, 1]
    y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
    y = self.sigmoid(y)
    # 将权重扩展到每个像素点,并与原特征图相乘,得到加强后的特征图
    return x * y.expand_as(x
请给下面每一行代码进行注释class SumFusionnnModule	def __init__self dim		superSumFusion self__init__#	def forwardself in_feats		return sumin_featsclass CatFusionnnModule	def __init__self dim height=2		superCatFusio

原文地址: https://www.cveoy.top/t/topic/cxGe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录