源碼解讀
class ContextGuidedBlock_Down(nn.Module):"""the size of feature map divided 2, (H,W,C)---->(H/2, W/2, 2C)"""def __init__(self, nIn, dilation_rate=2, reduction=16):"""args:nIn: the channel of input feature mapnOut: the channel of output feature map, and nOut=2*nIn"""super().__init__()nOut = nIn * 2self.conv1x1 = ConvBNPReLU(nIn, nOut, 3, 2) # size/2, channel: nIn--->nOutself.F_loc = ChannelWiseConv(nOut, nOut, 3, 1)self.F_sur = ChannelWiseDilatedConv(nOut, nOut, 3, 1, dilation_rate)self.bn = nn.BatchNorm2d(2 * nOut, eps=1e-3)self.act = nn.PReLU(2 * nOut)self.reduce = Conv(2 * nOut, nOut, 1, 1) # reduce dimension: 2*nOut--->nOutself.F_glo = FGlo(nOut, reduction)def forward(self, input):output = self.conv1x1(input)loc = self.F_loc(output)sur = self.F_sur(output)joi_feat = torch.cat([loc, sur], 1) # the joint featurejoi_feat = self.bn(joi_feat)joi_feat = self.act(joi_feat)joi_feat = self.reduce(joi_feat) # channel= nOutoutput = self.F_glo(joi_feat) # F_glo is employed to refine the joint featurereturn output
模塊:ConvBNPReLU,是一個卷積層,沒有偏置項,先卷積,在歸一化,在經過PReLU激活函數。
模塊:ChannelWiseConv,是一個通道卷積操作。在標準的卷積中,每個卷積核都會跨輸入特征圖的所有通道進行卷積操作,這意味著輸出的每個通道都是來自輸入的所有通道的信息融合。在通道卷積中,每個卷積核只在對應的單個輸入通道上操作,而不是跨通道。因此,每個輸出通道的特征僅由對應的單個輸入通道計算得出。通道卷積,對應的參數量更少,適合于移動端和嵌入式的部署。
模塊:ChannelWiseDilatedConv,是一個空洞卷積,空洞卷積適用于處理具有層次化結構或多尺度特征的任務,捕捉更廣泛的上下文信息。相當于擴大了卷積核,擴大的部分補0。
Relu與PRelu激活函數的對比。
模塊:FGlo,nn.AdaptiveAvgPool2d(1)
?是 PyTorch 中的一個自適應平均池化層,其目的是對輸入的特征圖進行全局平均池化操作,將空間特征轉換成全局特征,使得網絡能夠處理不同尺寸的輸入。nn.Linear()就是一個線性變換,相當于線性代數中矩陣的乘法。
總:卷積模塊ContextGuidedBlock_Down,更易用于捕獲局部特征、周圍上下文和全局上下文,并將這些信息融合起來以提高準確性。
修改
yaml文件
task.py文件