未验证 提交 6375ad39 编写于 作者: K Kaipeng Deng 提交者: GitHub

[cherry-pick] lr scheduler epoch2step (#28056)

* hapi/model step learning rate on batch end. test=develop
上级 11adb0f3
...@@ -453,6 +453,12 @@ class StaticGraphAdapter(object): ...@@ -453,6 +453,12 @@ class StaticGraphAdapter(object):
if len(name) > 0: if len(name) > 0:
rets.insert(i, feed[name]) rets.insert(i, feed[name])
# step learning rate scheduler on each batch end
if self.model._optimizer and \
isinstance(self.model._optimizer._learning_rate,
paddle.optimizer.lr.LRScheduler):
self.model._optimizer._learning_rate.step()
# LoDTensor cannot be fetch as numpy directly # LoDTensor cannot be fetch as numpy directly
rets = [np.array(v) for v in rets] rets = [np.array(v) for v in rets]
if self.mode == 'test': if self.mode == 'test':
...@@ -652,6 +658,13 @@ class DynamicGraphAdapter(object): ...@@ -652,6 +658,13 @@ class DynamicGraphAdapter(object):
self.model._optimizer.minimize(final_loss) self.model._optimizer.minimize(final_loss)
self.model.network.clear_gradients() self.model.network.clear_gradients()
# step learning rate scheduler on each batch end
if self.model._optimizer and \
isinstance(self.model._optimizer._learning_rate,
paddle.optimizer.lr.LRScheduler):
self.model._optimizer._learning_rate.step()
metrics = [] metrics = []
for metric in self.model._metrics: for metric in self.model._metrics:
metric_outs = metric.compute(*(to_list(outputs) + labels)) metric_outs = metric.compute(*(to_list(outputs) + labels))
......
...@@ -33,7 +33,7 @@ from paddle.nn.layer.loss import CrossEntropyLoss ...@@ -33,7 +33,7 @@ from paddle.nn.layer.loss import CrossEntropyLoss
from paddle.metric import Accuracy from paddle.metric import Accuracy
from paddle.vision.datasets import MNIST from paddle.vision.datasets import MNIST
from paddle.vision.models import LeNet from paddle.vision.models import LeNet
from paddle.io import DistributedBatchSampler from paddle.io import DistributedBatchSampler, Dataset
from paddle.hapi.model import prepare_distributed_context from paddle.hapi.model import prepare_distributed_context
from paddle.fluid.dygraph.jit import declarative from paddle.fluid.dygraph.jit import declarative
from paddle.fluid.dygraph.dygraph_to_static.program_translator import ProgramTranslator from paddle.fluid.dygraph.dygraph_to_static.program_translator import ProgramTranslator
...@@ -295,6 +295,15 @@ class MyModel(paddle.nn.Layer): ...@@ -295,6 +295,15 @@ class MyModel(paddle.nn.Layer):
return y return y
class MyDataset(Dataset):
def __getitem__(self, idx):
return np.random.random(size=(20,)).astype(np.float32), \
np.random.randint(0, 10, size=(1,)).astype(np.int64)
def __len__(self):
return 40
class TestModelFunction(unittest.TestCase): class TestModelFunction(unittest.TestCase):
def set_seed(self, seed=1024): def set_seed(self, seed=1024):
paddle.manual_seed(seed) paddle.manual_seed(seed)
...@@ -599,6 +608,56 @@ class TestModelFunction(unittest.TestCase): ...@@ -599,6 +608,56 @@ class TestModelFunction(unittest.TestCase):
shutil.rmtree(save_dir) shutil.rmtree(save_dir)
class TestModelWithLRScheduler(unittest.TestCase):
def test_fit(self):
def make_optimizer(parameters=None):
base_lr = 1e-3
momentum = 0.9
weight_decay = 5e-4
boundaries = [5, 8]
values = [base_lr * (0.1**i) for i in range(len(boundaries) + 1)]
learning_rate = paddle.optimizer.lr.PiecewiseDecay(
boundaries=boundaries, values=values)
learning_rate = paddle.optimizer.lr.LinearWarmup(
learning_rate=learning_rate,
warmup_steps=4,
start_lr=base_lr / 5.,
end_lr=base_lr,
verbose=True)
optimizer = paddle.optimizer.Momentum(
learning_rate=learning_rate,
weight_decay=weight_decay,
momentum=momentum,
parameters=parameters)
return optimizer
# dynamic test
device = paddle.set_device('cpu')
fluid.enable_dygraph(device)
net = MyModel()
inputs = [InputSpec([None, 20], 'float32', 'x')]
labels = [InputSpec([None, 1], 'int64', 'label')]
optim = make_optimizer(net.parameters())
model = Model(net, inputs, labels)
model.prepare(optimizer=optim, loss=CrossEntropyLoss(reduction="sum"))
dataset = MyDataset()
model.fit(dataset, dataset, batch_size=4, epochs=10, num_workers=0)
# static test
paddle.enable_static()
net = MyModel()
inputs = [InputSpec([None, 20], 'float32', 'x')]
labels = [InputSpec([None, 1], 'int64', 'label')]
optim = make_optimizer(net.parameters())
model = Model(net, inputs, labels)
model.prepare(optimizer=optim, loss=CrossEntropyLoss(reduction="sum"))
dataset = MyDataset()
model.fit(dataset, dataset, batch_size=4, epochs=10, num_workers=0)
class TestRaiseError(unittest.TestCase): class TestRaiseError(unittest.TestCase):
def test_input_without_name(self): def test_input_without_name(self):
net = MyModel() net = MyModel()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册