[따로 명시하지 않으면 모든 Accuracy는 Top-5 Accuracy를 의미함]

cifar100_AlexNet1

→ 원래 AlexNet의 채널 수와 FCL레이어의 노드 수는 같게 유지하고 이미지의 크기의 차이를 고려하여 맥스 풀링 제거 및 커널 사이즈를 맞게 줄임

class AlexNet1(nn.Module):
    def __init__(self):
        super().__init__()
        # dimension equation = (image_size + 2*padding - kernel_size) / stride + 1
        self.feature_extractor = nn.Sequential(
            nn.Conv2d(3, 96, kernel_size=7, stride=3, padding=1),
            nn.Tanh(),
            # (32 + 2*1 - 7) / 3 + 1 = 10
            nn.Conv2d(96, 256, kernel_size=4),
            nn.Tanh(),
            # (10 - 4) / 1 + 1 = 7
            nn.Conv2d(256, 384, kernel_size=2),
            nn.Tanh(),
            # (7 - 2) / 1 + 1 = 6
            nn.Conv2d(384, 384, kernel_size=2),
            nn.Tanh(),
            # (6 - 1) / 1 + 1 = 5
            nn.Conv2d(384, 256, kernel_size=2),
            nn.Tanh(),
            # (5 - 1) / 1 + 1 = 4
        )

        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            nn.Linear(256 * 4 * 4, 4096),
            nn.Tanh(),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.Tanh(),
            nn.Linear(4096, 100),
        )

    def forward(self, x):
        x = self.feature_extractor(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

cifar100_AlexNet1_50epoch.png

결과: 마지막 에폭에서 Test Accuracy: 49%, Validation Accuracy: 53% 를 찍으며 성장 가능성을 보여줌

cifar100_AlexNet2

→ 성능 비교를 위해서 전에 cifar10 데이터셋에 사용했을 때 Top1 Accuracy 가 67% 나왔던 모델을 사용

class AlexNet2(nn.Module):
    def __init__(self):
        super().__init__()
        # dimension equation = (image_size + 2*padding - kernel_size) / stride + 1
        self.feature_extractor = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=4, stride=2),nn.ReLU(),
            # (32-4)/2+1 = 15
            nn.MaxPool2d(kernel_size=3, stride=2),
            # (15-3)/2+1 = 7
            nn.Conv2d(32, 128, kernel_size=5, padding=2),nn.ReLU(),
            # (7+2*2-5)/1 + 1 = 7
            nn.MaxPool2d(kernel_size=2, stride=1),
            # (7-2)/1+1 = 6
            nn.Conv2d(128, 196, kernel_size=3, padding=1),nn.ReLU(),
            # (6+2*1-3)/1+1 = 6
            nn.Conv2d(196, 196, kernel_size=3, padding=1),nn.ReLU(),
            # (6+2*1-3)/1+1 = 6
            nn.Conv2d(196, 128, kernel_size=3, padding=1),nn.ReLU(),
            # (6+2*1-3)/1+1 = 6
        )

        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            nn.Linear(128 * 6 * 6, 2048),
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(2048, 2048),
            nn.ReLU(),
            nn.Linear(2048, 100),
        )

    def forward(self, x):
        x = self.feature_extractor(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

cifar100_AlexNet2_50epoch.png

→ 처음에 제대로 훈련이 안되는가 싶더니 갑자기 잘 학습하기 시작함 (local minimum에 빠졌다가 나온것일까?)

→ 추가로 훈련시키는 모듈을 만들어서 50 epoch 더 훈련시켜봄

(아래 그림에서 epoch은 0이 아니라 50에서 시작하는걸로 알고 있으면 됨)

cifar100_AlexNet2_50+50epoch.png

→ Test Accuracy: 63.8% Max at 88 Epoch