diff --git a/doc/doc_ch/config.md b/doc/doc_ch/config.md index bee2637094b1386210677788f0944d232f7ff82c..5e57909659c5f6246229902ae138d6cbdd63f133 100644 --- a/doc/doc_ch/config.md +++ b/doc/doc_ch/config.md @@ -60,6 +60,8 @@ | beta1 | 设置一阶矩估计的指数衰减率 | 0.9 | \ | | beta2 | 设置二阶矩估计的指数衰减率 | 0.999 | \ | | decay | 是否使用decay | \ | \ | -| function(decay) | 设置decay方式 | cosine_decay | 目前只支持cosin_decay | -| step_each_epoch | 每个epoch包含多少次迭代 | 20 | 计算方式:total_image_num / (batch_size_per_card * card_size) | -| total_epoch | 总共迭代多少个epoch | 1000 | 与Global.epoch_num 一致 | +| function(decay) | 设置decay方式 | - | 目前支持cosine_decay与piecewise_decay | +| step_each_epoch | 每个epoch包含多少次迭代, cosine_decay时有效 | 20 | 计算方式:total_image_num / (batch_size_per_card * card_size) | +| total_epoch | 总共迭代多少个epoch, cosine_decay时有效 | 1000 | 与Global.epoch_num 一致 | +| boundaries | 学习率下降时的迭代次数间隔, piecewise_decay时有效 | - | 参数为列表形式 | +| decay_rate | 学习率衰减系数, piecewise_decay时有效 | - | \ | diff --git a/doc/doc_en/config_en.md b/doc/doc_en/config_en.md index ffead1ee335a3d2f10491792a23a69e0f22a1755..66578424a60488a986eaff6fe937e4ffbc1bf59e 100644 --- a/doc/doc_en/config_en.md +++ b/doc/doc_en/config_en.md @@ -60,6 +60,8 @@ Take `rec_icdar15_train.yml` as an example: | beta1 | Set the exponential decay rate for the 1st moment estimates | 0.9 | \ | | beta2 | Set the exponential decay rate for the 2nd moment estimates | 0.999 | \ | | decay | Whether to use decay | \ | \ | -| function(decay) | Set the decay function | cosine_decay | Only support cosine_decay | -| step_each_epoch | The number of steps in an epoch. | 20 | Calculation :total_image_num / (batch_size_per_card * card_size) | -| total_epoch | The number of epochs | 1000 | Consistent with Global.epoch_num | +| function(decay) | Set the decay function | cosine_decay | Support cosine_decay and piecewise_decay | +| step_each_epoch | The number of steps in an epoch. Used in cosine_decay | 20 | Calculation :total_image_num / (batch_size_per_card * card_size) | +| total_epoch | The number of epochs. Used in cosine_decay | 1000 | Consistent with Global.epoch_num | +| boundaries | The step intervals to reduce learning rate. Used in piecewise_decay | - | The format is list | +| decay_rate | Learning rate decay rate. Used in piecewise_decay | - | \ | diff --git a/ppocr/data/rec/img_tools.py b/ppocr/data/rec/img_tools.py index d41abd9ba5c867853984b4b3b4c9eda41ebeff7c..0835603b5896a4f7ab946c4a694dcbec3f853a54 100755 --- a/ppocr/data/rec/img_tools.py +++ b/ppocr/data/rec/img_tools.py @@ -360,7 +360,7 @@ def process_image(img, text = char_ops.encode(label) if len(text) == 0 or len(text) > max_text_length: logger.info( - "Warning in ppocr/data/rec/img_tools.py:line362: Wrong data type." + "Warning in ppocr/data/rec/img_tools.py: Wrong data type." "Excepted string with length between 1 and {}, but " "got '{}'. Label is '{}'".format(max_text_length, len(text), label)) diff --git a/ppocr/optimizer.py b/ppocr/optimizer.py index f5f4958351239a413fa2cb19dec4a068f1bb44f4..eb1037c2053de30dacb82c889a02f023683d25d3 100755 --- a/ppocr/optimizer.py +++ b/ppocr/optimizer.py @@ -36,17 +36,28 @@ def AdamDecay(params, parameter_list=None): l2_decay = params.get("l2_decay", 0.0) if 'decay' in params: + supported_decay_mode = ["cosine_decay", "piecewise_decay"] params = params['decay'] decay_mode = params['function'] - step_each_epoch = params['step_each_epoch'] - total_epoch = params['total_epoch'] + 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) - else: - logger.info("Only support Cosine decay currently") + 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.Adam( learning_rate=base_lr, beta1=beta1,