请给下面每一行代码添加注释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
定义一个继承自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
原文地址: https://www.cveoy.top/t/topic/cx2p 著作权归作者所有。请勿转载和采集!