test_optimizer.py 2.66 KB
Newer Older
facebook-github-bot's avatar
facebook-github-bot committed
1
2
3
4
#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved


5
import random
facebook-github-bot's avatar
facebook-github-bot committed
6
import unittest
Yanghan Wang's avatar
Yanghan Wang committed
7

facebook-github-bot's avatar
facebook-github-bot committed
8
import d2go.runner.default_runner as default_runner
Yanghan Wang's avatar
Yanghan Wang committed
9
10
11
import torch
from d2go.optimizer import build_optimizer_mapper

facebook-github-bot's avatar
facebook-github-bot committed
12
13
14
15

class TestArch(torch.nn.Module):
    def __init__(self):
        super().__init__()
16
        self.conv = torch.nn.Conv2d(3, 4, kernel_size=5, stride=1, padding=1)
facebook-github-bot's avatar
facebook-github-bot committed
17
18
19
        self.bn = torch.nn.BatchNorm2d(4)
        self.relu = torch.nn.ReLU(inplace=True)
        self.avgpool = torch.nn.AdaptiveAvgPool2d((1, 1))
20
        self.linear = torch.nn.Linear(4, 1)
facebook-github-bot's avatar
facebook-github-bot committed
21
22
23
24
25
26

    def forward(self, x):
        ret = self.conv(x)
        ret = self.bn(ret)
        ret = self.relu(ret)
        ret = self.avgpool(ret)
27
28
        ret = torch.transpose(ret, 1, 3)
        ret = self.linear(ret)
facebook-github-bot's avatar
facebook-github-bot committed
29
30
        return ret

Yanghan Wang's avatar
Yanghan Wang committed
31

facebook-github-bot's avatar
facebook-github-bot committed
32
def _test_each_optimizer(cfg):
33
34
    print("Solver: " + str(cfg.SOLVER.OPTIMIZER))

facebook-github-bot's avatar
facebook-github-bot committed
35
    model = TestArch()
36
    criterion = torch.nn.BCEWithLogitsLoss()
facebook-github-bot's avatar
facebook-github-bot committed
37
38
    optimizer = build_optimizer_mapper(cfg, model)
    optimizer.zero_grad()
39
40
41
42
43
44
45

    random.seed(20210912)
    for _ in range(2500):
        target = torch.empty(1, 1, 1, 1).fill_(random.randint(0, 1))
        x = torch.add(torch.rand(1, 3, 16, 16), 2 * target)
        y_pred = model(x)
        loss = criterion(y_pred, target)
facebook-github-bot's avatar
facebook-github-bot committed
46
47
48
        loss.backward()
        optimizer.step()

49
50
51
52
53
54
55
56
57
58
    n_correct = 0
    for _ in range(200):
        target = torch.empty(1, 1, 1, 1).fill_(random.randint(0, 1))
        x = torch.add(torch.rand(1, 3, 16, 16), 2 * target)
        y_pred = torch.round(torch.sigmoid(model(x)))
        if y_pred == target:
            n_correct += 1

    print("Correct prediction rate {0}.".format(n_correct / 200))

facebook-github-bot's avatar
facebook-github-bot committed
59

Yanghan Wang's avatar
Yanghan Wang committed
60
class TestOptimizer(unittest.TestCase):
61
    def test_all_optimizers(self):
facebook-github-bot's avatar
facebook-github-bot committed
62
63
        runner = default_runner.Detectron2GoRunner()
        cfg = runner.get_default_cfg()
Yanghan Wang's avatar
Yanghan Wang committed
64
        multipliers = [None, [{"conv": 0.1}]]
facebook-github-bot's avatar
facebook-github-bot committed
65

66
        for optimizer_name in ["SGD", "AdamW", "SGD_MT", "AdamW_MT"]:
facebook-github-bot's avatar
facebook-github-bot committed
67
            for mult in multipliers:
68
                cfg.SOLVER.BASE_LR = 0.01
facebook-github-bot's avatar
facebook-github-bot committed
69
70
71
72
73
74
75
76
                cfg.SOLVER.OPTIMIZER = optimizer_name
                cfg.SOLVER.MULTIPLIERS = mult
                _test_each_optimizer(cfg)

    def test_full_model_grad_clipping(self):
        runner = default_runner.Detectron2GoRunner()
        cfg = runner.get_default_cfg()

77
        for optimizer_name in ["SGD", "AdamW", "SGD_MT", "AdamW_MT"]:
78
            cfg.SOLVER.BASE_LR = 0.02
facebook-github-bot's avatar
facebook-github-bot committed
79
80
81
82
83
            cfg.SOLVER.CLIP_GRADIENTS.CLIP_VALUE = 0.2
            cfg.SOLVER.CLIP_GRADIENTS.ENABLED = True
            cfg.SOLVER.CLIP_GRADIENTS.CLIP_TYPE = "full_model"
            cfg.SOLVER.OPTIMIZER = optimizer_name
            _test_each_optimizer(cfg)