Свертка 1x1 как слой классификации в Pytorch - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь классифицировать патчи изображений по 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, но безуспешно. Я также пробовал другие сети в своем цикле поезда, но этого не происходит.

Любая подсказка?

Спасибо

1 Ответ

0 голосов
/ 12 октября 2019

Наконец-то решил управлять собой. Это была инициализация весов последнего слоя

Best

...