您可以使用完全卷积网络进行二元分类吗?

数据挖掘 图像分类 卷积神经网络 火炬
2021-10-03 12:36:26

我知道完全卷积网络可以用于图像分割和类似的,但我想知道你是否也可以将它们应用于简单的图像分类任务。如果是这样,正确的方法是什么(在pytorch中)?

想象一下,我们有大小为 30x30 的猫和狗的 RGB 图像以及以下(演示)网络。

class NormalNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.first_layer = nn.Conv2d(3, 1, (3, 3))
        self.fc = nn.Linear(784, 2)

    def forward(self, x):
        x = self.first_layer(x)
        x = x.reshape(-1, 784) 
        return self.fc(x)


class FullyConvolutionalNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer = nn.Conv2d(3, 2, (30, 30))

    def forward(self, x):
        x = self.layer(x)
        return x.reshape(-1, 2)

然后你可以使用:

sample_image = torch.rand((10, 3, 30, 30))
normal_network = NormalNetwork()
fully_convolutional_network = FullyConvolutionalNetwork()
ret1 = normal_network(sample_image)
ret2 = fully_convolutional_network(sample_image)

并且这两个网络都会返回一个维度的张量,torch.Size([10, 2])然后可以将其馈入一个BCELoss或类似的。这是一种正确的方法还是出于某种原因这很糟糕?

1个回答

首先,这是您问题的答案:YES

您的代码中有一个 CNN(卷积神经网络)的开头。只是不要忘记在卷积层之后添加激活函数(通常是 ReLU)。

另一个非常规的事情是您使用 2 个输出进行二进制分类,这不是要走的路,我们宁愿使用1 个输出通过 sigmoid 函数,如果是猫则为 1,如果是狗则为 0(或相反)。我们应用 BCE 损失来训练网络。

我会为您的任务使用迁移学习(使用预训练架构),VGG 或 ResNet 是在分类任务上运行良好的架构。我们通常对这些预训练模型进行微调,以获得分类任务的最佳结果。是一个 Kaggle,可以帮助您了解如何使用 Pytorch 进行操作。

希望这可以帮助。