optimizer.py 3.83 KB
Newer Older
LDOUBLEV's avatar
LDOUBLEV committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import paddle.fluid as fluid
littletomatodonkey's avatar
littletomatodonkey committed
18
19
from paddle.fluid.regularizer import L2Decay

tink2123's avatar
tink2123 committed
20
21
22
from ppocr.utils.utility import initial_logger

logger = initial_logger()
LDOUBLEV's avatar
LDOUBLEV committed
23
24
25
26
27
28
29
30
31
32
33
34
35


def AdamDecay(params, parameter_list=None):
    """
    define optimizer function
    args:
        params(dict): the super parameters
        parameter_list (list): list of Variable names to update to minimize loss
    return:
    """
    base_lr = params['base_lr']
    beta1 = params['beta1']
    beta2 = params['beta2']
littletomatodonkey's avatar
littletomatodonkey committed
36
37
    l2_decay = params.get("l2_decay", 0.0)

tink2123's avatar
tink2123 committed
38
    if 'decay' in params:
licx's avatar
licx committed
39
        supported_decay_mode = ["cosine_decay", "piecewise_decay"]
tink2123's avatar
tink2123 committed
40
41
        params = params['decay']
        decay_mode = params['function']
licx's avatar
licx committed
42
43
44
        assert decay_mode in supported_decay_mode, "Supported decay mode is {}, but got {}".format(
            supported_decay_mode, decay_mode)

tink2123's avatar
tink2123 committed
45
        if decay_mode == "cosine_decay":
licx's avatar
licx committed
46
47
            step_each_epoch = params['step_each_epoch']
            total_epoch = params['total_epoch']
tink2123's avatar
tink2123 committed
48
49
50
51
            base_lr = fluid.layers.cosine_decay(
                learning_rate=base_lr,
                step_each_epoch=step_each_epoch,
                epochs=total_epoch)
licx's avatar
licx committed
52
53
54
55
56
57
58
59
60
        elif decay_mode == "piecewise_decay":
            boundaries = params["boundaries"]
            decay_rate = params["decay_rate"]
            values = [
                base_lr * decay_rate**idx
                for idx in range(len(boundaries) + 1)
            ]
            base_lr = fluid.layers.piecewise_decay(boundaries, values)

LDOUBLEV's avatar
LDOUBLEV committed
61
62
63
64
    optimizer = fluid.optimizer.Adam(
        learning_rate=base_lr,
        beta1=beta1,
        beta2=beta2,
littletomatodonkey's avatar
littletomatodonkey committed
65
        regularization=L2Decay(regularization_coeff=l2_decay),
LDOUBLEV's avatar
LDOUBLEV committed
66
67
        parameter_list=parameter_list)
    return optimizer
licx's avatar
licx committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108


def RMSProp(params, parameter_list=None):
    """
    define optimizer function
    args:
        params(dict): the super parameters
        parameter_list (list): list of Variable names to update to minimize loss
    return:
    """
    base_lr = params.get("base_lr", 0.001)
    l2_decay = params.get("l2_decay", 0.00005)

    if 'decay' in params:
        supported_decay_mode = ["cosine_decay", "piecewise_decay"]
        params = params['decay']
        decay_mode = params['function']
        assert decay_mode in supported_decay_mode, "Supported decay mode is {}, but got {}".format(
            supported_decay_mode, decay_mode)

        if decay_mode == "cosine_decay":
            step_each_epoch = params['step_each_epoch']
            total_epoch = params['total_epoch']
            base_lr = fluid.layers.cosine_decay(
                learning_rate=base_lr,
                step_each_epoch=step_each_epoch,
                epochs=total_epoch)
        elif decay_mode == "piecewise_decay":
            boundaries = params["boundaries"]
            decay_rate = params["decay_rate"]
            values = [
                base_lr * decay_rate**idx
                for idx in range(len(boundaries) + 1)
            ]
            base_lr = fluid.layers.piecewise_decay(boundaries, values)

    optimizer = fluid.optimizer.RMSProp(
        learning_rate=base_lr,
        regularization=fluid.regularizer.L2Decay(regularization_coeff=l2_decay))
        
    return optimizer