ВСЕ ЕЩЕ переоснащение классификации изображений для набора данных CheXpert - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь классифицировать изображения из набора данных CheXpert только по одному из наблюдений (Alectasis) и 2 класса классификации проблемы (1 верно, 0 ложно). Я предварительно обрабатываю изображения, изменяя их размер до 224x224 и нормализуя их. Я использовал 30 000 изображений для обучения (проверка 10%) и 7 500 тестовых изображений. В качестве модели я использую предварительно обученный ResNet34 на Imag eNet. При запуске модели происходит переоснащение: потери на обучение уменьшаются до 0,043, тогда как потери при проверке возрастают до 2,199, что приводит к точности теста 55,56%. Я пробовал следующие попытки предотвратить переоснащение:

# Попытка 1 : я использовал классификатор с выпадающими слоями

-> Потеря валидации уменьшилась вначале, но через 6 эпох он снова увеличивался

# Попытка 2 : Я добавил слои исключения во всей модели

-> Вначале потеря валидации уменьшилась, но модель сходилась очень медленно. Спустя несколько эпох потери при проверке увеличились, и модель также стала быстрее сходиться

# Попытка 3 : я заморозил все нелинейные слои и подогнал модель только к последнему линейному слою

- > Казалось, что сеть вообще не сходится, даже после 50 эпох

Превращение задачи классификации в задачу двоичной классификации также ничего не изменило. Попытка сделать то же самое с DenseNet121 также не сильно изменилось.

class ResNet(FitModule):
    def __init__(self, num_classes=2):
        super(ResNet, self).__init__()
        self.net = torchvision.models.resnet34(pretrained=True)
        # Change classifier
        kernel_count = self.net.fc.in_features
        self.net.fc = nn.Sequential(nn.Linear(kernel_count, 500), nn.Linear(500, num_classes))
        self.dropout = nn.Dropout(p=0.5)
        # Attempt 1: use classifier with dropout layers
        '''
        self.net.fc = nn.Sequential(
            nn.BatchNorm1d(kernel_count),
            nn.Dropout(p=0.5),
            nn.Linear(in_features=kernel_count, out_features=500),
            nn.ReLU(),
            nn.BatchNorm1d(500),
            nn.Dropout(p=0.5),
            nn.Linear(in_features=500, out_features=num_classes))
        '''


    def freeze_nonlinear_layers(self):
        self._freeze_layer(self.net.conv1)
        self._freeze_layer(self.net.bn1)
        self._freeze_layer(self.net.relu)
        self._freeze_layer(self.net.maxpool)
        self._freeze_layer(self.net.layer1)
        self._freeze_layer(self.net.layer2)
        self._freeze_layer(self.net.layer3)
        self._freeze_layer(self.net.layer4)
        self._freeze_layer(self.net.avgpool)


    def _freeze_layer(self, layer, freeze=True):
        if freeze:                              
            for p in layer.parameters():
                p.requires_grad = False
        else:                                   
            for p in layer.parameters():
                p.requires_grad = True

    def forward(self, inputs):
        # Attempt 2: build whole network with dropout layers
        '''
        out = self.net.conv1(inputs)
        out = self.net.bn1(out)
        out = self.net.relu(out)
        out = self.net.maxpool(out)
        out = self.dropout(out)
        out = self.net.layer1(out)
        out = self.dropout(out)
        out = self.net.layer2(out)
        out = self.dropout(out)
        out = self.net.layer3(out)
        out = self.dropout(out)
        out = self.net.layer4(out)
        out = self.dropout(out)
        out = self.net.avgpool(out)
        out = out.view(out.size(0), -1)
        out = self.net.fc(out)
        '''
        # Attempt 3: freeze nonlinear layers and only train last linear layer
        '''
        self.freeze_nonlinear_layers
        '''
        return out/self.net(inputs) # attempt 2/attempt 1,3

Подводя итог: либо сеть не сходится, либо возрастают потери при проверке и точность теста низкая.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Пожалуйста, попробуйте заморозить до уровня 3 и попробуйте обучить модель для первых 10 эпох. Если вы не видите проблемы переобучения, попробуйте снизить скорость обучения и действуйте соответственно. Сообщите нам, сработало ли это.

0 голосов
/ 11 июля 2020

Вы пробовали добавлять новые преобразования к изображениям поездов? Например, вы можете захотеть добавить случайное вращение или случайное горизонтальное отражение. Все доступные преобразования можно найти здесь преобразования pytorch . Это то, что я обычно делаю, если моя модель не подходит. Не добавляйте их в свой набор для проверки или тестирования, они предназначены только для обучающих изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...