我知道完全卷积网络可以用于图像分割和类似的,但我想知道你是否也可以将它们应用于简单的图像分类任务。如果是这样,正确的方法是什么(在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
或类似的。这是一种正确的方法还是出于某种原因这很糟糕?