@@ -365,8 +365,6 @@ class LinearCyclicalScheduler(CyclicalScheduler):
365
365
366
366
.. testcode:: 1
367
367
368
- from ignite.handlers.param_scheduler import LinearCyclicalScheduler
369
-
370
368
# Linearly increases the learning rate from 0.0 to 1.0 and back to 0.0
371
369
# over a cycle of 4 iterations
372
370
scheduler = LinearCyclicalScheduler(default_optimizer, "lr", 0.0, 1.0, 4)
@@ -389,8 +387,6 @@ def print_lr():
389
387
390
388
.. testcode:: 2
391
389
392
- from ignite.handlers.param_scheduler import LinearCyclicalScheduler
393
-
394
390
optimizer = torch.optim.SGD(
395
391
[
396
392
{"params": default_model.base.parameters(), "lr": 0.001},
@@ -400,19 +396,19 @@ def print_lr():
400
396
401
397
# Linearly increases the learning rate from 0.0 to 1.0 and back to 0.0
402
398
# over a cycle of 4 iterations
403
- scheduler1 = LinearCyclicalScheduler(optimizer, "lr", 0.0, 1.0, 4, param_group_index=0)
399
+ scheduler1 = LinearCyclicalScheduler(optimizer, "lr (base) ", 0.0, 1.0, 4, param_group_index=0)
404
400
405
- # Linearly increases the learning rate from 1 .0 to 0.0 and back to 0.1
401
+ # Linearly increases the learning rate from 0 .0 to 0.1 and back to 0.0
406
402
# over a cycle of 4 iterations
407
- scheduler2 = LinearCyclicalScheduler(optimizer, "lr", 0.0, 0.1, 4, param_group_index=1)
403
+ scheduler2 = LinearCyclicalScheduler(optimizer, "lr (fc) ", 0.0, 0.1, 4, param_group_index=1)
408
404
409
405
default_trainer.add_event_handler(Events.ITERATION_STARTED, scheduler1)
410
406
default_trainer.add_event_handler(Events.ITERATION_STARTED, scheduler2)
411
407
412
408
@default_trainer.on(Events.ITERATION_COMPLETED)
413
409
def print_lr():
414
- print(optimizer.param_groups[0]["lr"],
415
- optimizer.param_groups[1]["lr"])
410
+ print(optimizer.param_groups[0]["lr (base) "],
411
+ optimizer.param_groups[1]["lr (fc) "])
416
412
417
413
default_trainer.run([0] * 9, max_epochs=1)
418
414
@@ -460,33 +456,67 @@ class CosineAnnealingScheduler(CyclicalScheduler):
460
456
usually be the number of batches in an epoch.
461
457
462
458
Examples:
463
- .. code-block:: python
464
459
465
- from ignite.handlers.param_scheduler import CosineAnnealingScheduler
460
+ .. testsetup:: *
466
461
467
- scheduler = CosineAnnealingScheduler(optimizer, 'lr', 1e-1, 1e-3, len(train_loader))
468
- trainer.add_event_handler(Events.ITERATION_STARTED, scheduler)
469
- #
470
- # Anneals the learning rate from 1e-1 to 1e-3 over the course of 1 epoch.
471
- #
462
+ default_trainer = get_default_trainer()
472
463
473
- .. code-block:: python
464
+ .. testcode:: 1
465
+
466
+ # CosineAnnealing increases the learning rate from 0.0 to 1.0
467
+ # over a cycle of 4 iterations
468
+ scheduler = CosineAnnealingScheduler(default_optimizer, "lr", 0.0, 1.0, 4)
469
+
470
+ default_trainer.add_event_handler(Events.ITERATION_STARTED, scheduler)
471
+
472
+ @default_trainer.on(Events.ITERATION_COMPLETED)
473
+ def print_lr():
474
+ print(default_optimizer.param_groups[0]["lr"])
475
+
476
+ default_trainer.run([0] * 9, max_epochs=1)
474
477
475
- from ignite.handlers.param_scheduler import CosineAnnealingScheduler
476
- from ignite.handlers.param_scheduler import LinearCyclicalScheduler
478
+ .. testoutput:: 1
477
479
478
- optimizer = SGD(
480
+ 0.0
481
+ 0.1464...
482
+ 0.4999...
483
+ 0.8535...
484
+ ...
485
+
486
+ .. testcode:: 2
487
+
488
+ optimizer = torch.optim.SGD(
479
489
[
480
- {"params": model .base.parameters(), 'lr' : 0.001},
481
- {"params": model .fc.parameters(), 'lr' : 0.01},
490
+ {"params": default_model .base.parameters(), "lr" : 0.001},
491
+ {"params": default_model .fc.parameters(), "lr" : 0.01},
482
492
]
483
493
)
484
494
485
- scheduler1 = LinearCyclicalScheduler(optimizer, 'lr', 1e-7, 1e-5, len(train_loader), param_group_index=0)
486
- trainer.add_event_handler(Events.ITERATION_STARTED, scheduler1, "lr (base)")
495
+ # CosineAnnealing increases the learning rate from 0.0 to 1.0
496
+ # over a cycle of 4 iterations
497
+ scheduler1 = CosineAnnealingScheduler(optimizer, "lr (base)", 0.0, 1.0, 4, param_group_index=0)
487
498
488
- scheduler2 = CosineAnnealingScheduler(optimizer, 'lr', 1e-5, 1e-3, len(train_loader), param_group_index=1)
489
- trainer.add_event_handler(Events.ITERATION_STARTED, scheduler2, "lr (fc)")
499
+ # CosineAnnealing increases the learning rate from 0.0 to 0.1
500
+ # over a cycle of 4 iterations
501
+ scheduler2 = CosineAnnealingScheduler(optimizer, "lr (fc)", 0.0, 0.1, 4, param_group_index=1)
502
+
503
+ default_trainer.add_event_handler(Events.ITERATION_STARTED, scheduler1)
504
+ default_trainer.add_event_handler(Events.ITERATION_STARTED, scheduler2)
505
+
506
+ @default_trainer.on(Events.ITERATION_COMPLETED)
507
+ def print_lr():
508
+ print(optimizer.param_groups[0]["lr (base)"],
509
+ optimizer.param_groups[1]["lr (fc)"])
510
+
511
+ default_trainer.run([0] * 9, max_epochs=1)
512
+
513
+ .. testoutput:: 2
514
+
515
+ 0.0 0.0
516
+ 0.1464... 0.01464...
517
+ 0.4999... 0.04999...
518
+ 0.8535... 0.08535...
519
+ ...
490
520
491
521
.. [Smith17] Smith, Leslie N. "Cyclical learning rates for training neural networks."
492
522
Applications of Computer Vision (WACV), 2017 IEEE Winter Conference on. IEEE, 2017
@@ -513,21 +543,39 @@ class ConcatScheduler(ParamScheduler):
513
543
`engine.state.param_history`, (default=False).
514
544
515
545
Examples:
516
- .. code-block:: python
517
546
518
- from ignite.handlers.param_scheduler import ConcatScheduler
519
- from ignite.handlers.param_scheduler import LinearCyclicalScheduler
520
- from ignite.handlers.param_scheduler import CosineAnnealingScheduler
547
+ .. testsetup::
521
548
522
- scheduler_1 = LinearCyclicalScheduler(optimizer, "lr", start_value=0.1, end_value=0.5, cycle_size=60)
523
- scheduler_2 = CosineAnnealingScheduler(optimizer, "lr", start_value=0.5, end_value=0.01, cycle_size=60)
549
+ default_trainer = get_default_trainer()
550
+
551
+ .. testcode::
524
552
525
- combined_scheduler = ConcatScheduler(schedulers=[scheduler_1, scheduler_2], durations=[30, ] )
526
- trainer.add_event_handler(Events.ITERATION_STARTED, combined_scheduler )
527
- #
528
- # Sets the Learning rate linearly from 0.1 to 0.5 over 30 iterations. Then
529
- # starts an annealing schedule from 0.5 to 0.01 over 60 iterations.
553
+ scheduler_1 = LinearCyclicalScheduler(default_optimizer, "lr", 0.0, 1.0, 8 )
554
+ scheduler_2 = CosineAnnealingScheduler(default_optimizer, "lr", 1.0, 0.2, 4 )
555
+
556
+ # Sets the Learning rate linearly from 0.0 to 1.0 over 4 iterations. Then
557
+ # starts an annealing schedule from 1.0 to 0.2 over the next 4 iterations.
530
558
# The annealing cycles are repeated indefinitely.
559
+ combined_scheduler = ConcatScheduler(schedulers=[scheduler_1, scheduler_2], durations=[4, ])
560
+
561
+ default_trainer.add_event_handler(Events.ITERATION_STARTED, combined_scheduler)
562
+
563
+ @default_trainer.on(Events.ITERATION_COMPLETED)
564
+ def print_lr():
565
+ print(default_optimizer.param_groups[0]["lr"])
566
+
567
+ default_trainer.run([0] * 8, max_epochs=1)
568
+
569
+ .. testoutput::
570
+
571
+ 0.0
572
+ 0.25
573
+ 0.5
574
+ 0.75
575
+ 1.0
576
+ 0.8828...
577
+ 0.6000...
578
+ 0.3171...
531
579
532
580
.. versionadded:: 0.4.5
533
581
"""
0 commit comments