作者回复: hi,原因是如果在forward中使用了nn调用网络中的层的话,它默认会放在cpu上计算。 解决的办法就是把bn和relu放到__init__中,如下代码所示。 class Block(nn.Module): def __init__(self, in_channels, features): super().__init__() self.features = features self.conv1 = nn.Conv2d( in_channels=in_channels, out_channels=features, kernel_size=3, padding='same', ) self.bn1 = nn.BatchNorm2d(num_features=self.features) self.relu1 = nn.ReLU() self.conv2 = nn.Conv2d( in_channels=features, out_channels=features, kernel_size=3, padding='same', ) self.bn2 = nn.BatchNorm2d(num_features=self.features) self.relu2 = nn.ReLU() def forward(self, input): x = self.conv1(input) x = self.bn1(x) x = self.relu1(x) x = self.conv2(x) x = self.bn2(x) x = self.relu2(x) return x 同理U-Net中的pooling也要放到__init__()中。
作者回复: ^^ 感谢支持,加油
作者回复: hello,你好,我传到这里了。 https://github.com/syuu1987/geekTime-semantic-segmentation/tree/main
作者回复: hi 你好。感谢你的留言。 这块可能我误导你了,都是一样的。 Python3中super().__init__()代替了Python2中的super(class_name,self).__init__()
作者回复: hello,小物体分割不好的一个原因是在backbone的特征提取过程中,小物体的信息已经被忽略了。 举个例子,假设输入是256x256的数据,经过多层的特征提取后特征图依次为128x128,64x64,32x32,16x16。有可能小物体的信息在32x32那里就消失了。 从这个角度出发,可以看看能不能调整网络最小的特征图的大小,来解决小物体分割不好的问题(比如Unet中,删除最后一次下采样)。另外,你也要看看小物体是不是resize到训练数据尺寸的时候已经没有了。
作者回复: 感觉不像过拟合。数据标的没有问题吗?可以看看前几个epoch结果什么样子。
作者回复: 理论上,代码是肯定能执行通过的。不过我对视频没有研究,不知道分割效果如何。
作者回复: 您好,多分类时让网络最终输出的个数等于类别数,然后加softmax即可。
作者回复: hi,你好。感谢留言。 这个尺寸是取决于网络的设计。 256x256的分割结果是可以resize回1024x640的。 当然,如果你设计的网络的输入输出支持1024x640的等比例缩放,也是可以的。
作者回复: Hi, 你好,感谢你的留言。 看起来是你要调用你训练了51个epoch的模型,可以看看你保存或者调用的路径写没写错。