Я пытаюсь классифицировать патчи изображений по 10 различным категориям, используя нейронную сеть. Моя идея (заимствованная из этой статьи состоит в том, чтобы использовать первые 5 уровней предварительно обученной сети VGG и применить свертку 1x1 к этому кодеру. Итак, учитывая первые 5 уровней сети VGG:
Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace=True)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace=True)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(6): ReLU(inplace=True)
(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(8): ReLU(inplace=True)
(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU(inplace=True)
(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(13): ReLU(inplace=True)
(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(15): ReLU(inplace=True)
(16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(18): ReLU(inplace=True)
(19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(20): ReLU(inplace=True)
(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(22): ReLU(inplace=True)
(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(25): ReLU(inplace=True)
(26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(27): ReLU(inplace=True)
(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(29): ReLU(inplace=True)
(30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
Как добавить слой для классификации каждой активации по n_classes? Я пытаюсь свернуть 1x1 от 512 (количество фильтров в последнем слое) до n_classes, что-то вроде этого:
nn.Sequential(
nn.Conv2d(in_channels=512, out_channels=n_classes, kernel_size=1),
nn.Softmax(dim=1)
)
Эта сеть выдает (batch_size, n_classes H // 32, W // 32) выходные данные. Однако все выходные данные для каждого класса равны для данного изображения, я имею в виду, что для данного пакета, B и класса C, все значениятакие же.
Я пробовал тренироваться с CrossEntropyLoss и даже конвертировать в логиты и применять BCELoss, но безуспешно. Я также пробовал другие сети в своем цикле поезда, но этого не происходит.
Любая подсказка?
Спасибо