lironui / ABCNet

The semantic segmentation of remote sensing images
https://lironui.github.io/
GNU General Public License v3.0
28 stars 3 forks source link

代码训练有点小问题 #4

Open icey-zhang opened 1 year ago

icey-zhang commented 1 year ago

您好,您提供的链接没有关于ABCNet的训练代码,所以我自己写了一个,但是感觉这个模型定义是不是有点问题

class ABCNet(nn.Module):
    def __init__(self, band, n_classes):
        super(ABCNet, self).__init__()
        self.name = 'ABCNet'
        self.cp = ContextPath()
        self.sp = SpatialPath()
        self.fam = FeatureAggregationModule(256, 256)
        self.conv_out = Output(256, 256, n_classes, up_factor=8)
        if self.training:
            self.conv_out16 = Output(128, 64, n_classes, up_factor=8)
            self.conv_out32 = Output(128, 64, n_classes, up_factor=16)
        self.init_weight()

    def forward(self, x):
        H, W = x.size()[2:]
        feat_cp8, feat_cp16, feat_cp32 = self.cp(x)
        feat_sp = self.sp(x)
        feat_fuse = self.fam(feat_sp, feat_cp8)

        feat_out = self.conv_out(feat_fuse)
        if self.training:
            feat_out16 = self.conv_out16(feat_cp16)
            feat_out32 = self.conv_out32(feat_cp32)
            return feat_out, feat_out16, feat_out32
        # feat_out = feat_out.argmax(dim=1)
        return feat_out

这个网络训练的时候,进self.training的判断的时候,feat_cp16的大小是[4, 256, 32, 32],有256个通道。但是self.conv_out16定义的时候输出通道是128。feat_cp32的大小是[4, 512, 16, 16],有512个通道。但是self.conv_out16定义的时候输出通道还是128.(我网络进去的图的大小是[4, 3, 512, 512],是我哪操作不对吗?

lironui commented 1 year ago

不好意思刚看到您的issue,是我的问题。在做代码clean的时候保留了错误的版本,测试的时候只测试了eval没有测试train. 非常抱歉带来不便,已经修复了这个问题。