定义一个继承自ConvLayer的类ConvLayerSE

class ConvLayerSE(ConvLayer): # 构造函数,net_depth为网络深度,dim为维度,kernel_size为卷积核大小,gate_act为门控激活函数,默认为Sigmoid def init(self, net_depth, dim, kernel_size=3, gate_act=nn.Sigmoid): # 调用父类的构造函数 super().init(net_depth, dim, kernel_size, gate_act) # 定义一个CALayer self.se = CALayer(dim)

# 前向传播函数,X为输入数据
def forward(self, X):
	# 计算Wv(X) * Wg(X)
	out = self.Wv(X) * self.Wg(X)
	# 投影操作
	out = self.proj(out)
	# 计算CALayer
	out = self.se(out)
	return out

定义一个继承自ConvLayer的类ConvLayerRS

class ConvLayerRS(ConvLayer): # 构造函数,net_depth为网络深度,dim为维度,kernel_size为卷积核大小,gate_act为门控激活函数,默认为Sigmoid def init(self, net_depth, dim, kernel_size=3, gate_act=nn.Sigmoid): # 调用父类的构造函数 super().init(net_depth, dim, kernel_size, gate_act) # 定义一个可训练参数nn.Parameter,初始值为1 self.scale = nn.Parameter(torch.ones(1))

# 前向传播函数,X为输入数据
def forward(self, X):
	# 计算Wv(X) * Wg(X)
	out = self.Wv(X) * self.Wg(X)
	# 投影操作
	out = self.proj(out)
	# 乘以可训练参数self.scale
	out = out * self.scale
	return out

定义一个继承自ConvLayer的类ConvLayerECA

class ConvLayerECA(ConvLayer): # 构造函数,net_depth为网络深度,dim为维度,kernel_size为卷积核大小,gate_act为门控激活函数,默认为Sigmoid def init(self, net_depth, dim, kernel_size=3, gate_act=nn.Sigmoid): # 调用父类的构造函数 super().init(net_depth, dim, kernel_size, gate_act) # 定义一个ECALayer self.ca = ECALayer(dim)

# 前向传播函数,X为输入数据
def forward(self, X):
	# 计算Wv(X) * Wg(X)
	out = self.Wv(X) * self.Wg(X)
	# 投影操作
	out = self.proj(out)
	# 计算ECALayer
	out = self.ca(out)
	return out

定义一个继承自nn.Module的类ConvLayerWithoutGating

class ConvLayerWithoutGating(nn.Module): # 构造函数,net_depth为网络深度,dim为维度,kernel_size为卷积核大小,gate_act为门控激活函数,默认为Sigmoid def init(self, net_depth, dim, kernel_size=3, gate_act=nn.Sigmoid): # 调用父类的构造函数 super().init() # 定义维度 self.dim = dim # 定义网络深度 self.net_depth = net_depth # 定义卷积核大小 self.kernel_size = kernel_size # 定义proj1 self.proj1 = nn.Sequential( nn.Conv2d(dim, dim, 1), nn.Conv2d(dim, dim, kernel_size=kernel_size, padding=kernel_size//2, groups=dim, padding_mode='reflect'), gate_act() if gate_act in [nn.Sigmoid, nn.Tanh, nn.GELU] else gate_act(inplace=True), nn.Conv2d(dim, dim, 1) ) # 定义proj2 self.proj2 = nn.Conv2d(dim, dim, 1) # 初始化权重 self.apply(self._init_weights)

# 初始化权重的函数
def _init_weights(self, m):
	if isinstance(m, nn.Conv2d):
		gain = (8 * self.net_depth) ** (-1/4)
		fan_in, fan_out = _calculate_fan_in_and_fan_out(m.weight)
		std = gain * math.sqrt(2.0 / float(fan_in + fan_out))
		trunc_normal_(m.weight, std=std)

		if m.bias is not None:
			nn.init.constant_(m.bias, 0)

# 前向传播函数,X为输入数据
def forward(self, X):
	# 计算proj1(X) + proj2(X)
	out = self.proj1(X) + self.proj2(X)
	return ou
请给下面每一行代码添加注释class ConvLayerSEConvLayer	def __init__self net_depth dim kernel_size=3 gate_act=nnSigmoid		super__init__net_depth dim kernel_size gate_act		selfse = CALayerdim	def forwardself X		out = s

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

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