Skip to content

Commit 16a4ba1

Browse files
committed
Further deduplication of progressive / multi-image size training validation
1 parent bd3f4d7 commit 16a4ba1

4 files changed

Lines changed: 30 additions & 29 deletions

File tree

tests/test_scheduled_sampler.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ def test_constant_schedule_ignores_progressive_only_options():
8686
assert len(batch_sampler) > 0
8787

8888

89+
def test_progressive_schedule_requires_multiple_choices():
90+
with pytest.raises(ValueError, match='at least two'):
91+
ScheduledBatchSampler(
92+
SequentialSampler(range(32)),
93+
batch_sizes=(8,),
94+
choice_schedule='progressive',
95+
schedule_epochs=3,
96+
)
97+
98+
8999
def test_zero_weight_choices_are_excluded_from_progressive_random_mix_and_sample_budget():
90100
progressive_sampler = ScheduledBatchSampler(
91101
SequentialSampler(range(64)),
@@ -343,6 +353,22 @@ def test_create_loader_scheduled_resolutions_default_to_batch_size():
343353
assert all(images.shape[0] == 4 for images, _ in loader)
344354

345355

356+
@pytest.mark.parametrize('invalid_size', (0, (16, 0), (3, 16, 0)))
357+
def test_create_loader_rejects_nonpositive_scheduled_dimensions(invalid_size):
358+
with pytest.raises(ValueError, match='dimensions must be positive'):
359+
create_loader(
360+
_ImageDataset(),
361+
input_size=(3, 32, 32),
362+
batch_size=4,
363+
input_size_choices=(invalid_size, 16),
364+
is_training=True,
365+
no_aug=True,
366+
use_prefetcher=False,
367+
num_workers=0,
368+
persistent_workers=False,
369+
)
370+
371+
346372
def test_create_loader_progressive_resolutions_keep_default_batch_and_sample_counts():
347373
loader = create_loader(
348374
_ImageDataset(length=96),

timm/data/loader.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ def create_loader(
372372
raise ValueError('All scheduled input sizes must use the same number of channels.')
373373
else:
374374
raise ValueError('Scheduled input sizes must be scalars, HW tuples, or CHW tuples.')
375+
if any(dimension <= 0 for dimension in size):
376+
raise ValueError('All scheduled input size dimensions must be positive.')
375377
resolved_input_sizes.append(size)
376378

377379
if batch_size_choices is None:

timm/data/scheduled_sampler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ def __init__(
7070
if choice_schedule not in ('constant', 'progressive'):
7171
raise ValueError("choice_schedule must be 'constant' or 'progressive'.")
7272
if choice_schedule == 'progressive':
73+
if len(batch_sizes) < 2:
74+
raise ValueError('A progressive schedule requires at least two choices.')
7375
if schedule_epochs is None or int(schedule_epochs) != schedule_epochs or schedule_epochs <= 0:
7476
raise ValueError('schedule_epochs must be a positive integer for a progressive schedule.')
7577
if schedule_spread < 0:

train.py

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -502,35 +502,6 @@ def main():
502502
parser.error('--naflex-loader and --train-img-sizes are alternative loader modes.')
503503
if args.naflex_loader and args.use_multi_epochs_loader:
504504
parser.error('--use-multi-epochs-loader is not supported with --naflex-loader.')
505-
if args.train_img_sizes is not None and args.use_multi_epochs_loader:
506-
parser.error('--use-multi-epochs-loader is not supported with --train-img-sizes.')
507-
if args.train_img_sizes is not None:
508-
if any(size <= 0 for size in args.train_img_sizes):
509-
parser.error('--train-img-sizes values must be positive.')
510-
if args.train_batch_sizes is not None:
511-
if len(args.train_batch_sizes) != len(args.train_img_sizes):
512-
parser.error('--train-batch-sizes must have the same length as --train-img-sizes.')
513-
if any(batch_size <= 0 for batch_size in args.train_batch_sizes):
514-
parser.error('--train-batch-sizes values must be positive.')
515-
if args.train_size_probs is not None:
516-
if len(args.train_size_probs) != len(args.train_img_sizes):
517-
parser.error('--train-size-probs must have the same length as --train-img-sizes.')
518-
probs = torch.tensor(args.train_size_probs)
519-
if not torch.isfinite(probs).all() or (probs < 0).any() or probs.sum() <= 0:
520-
parser.error('--train-size-probs must be finite, non-negative, and have a positive sum.')
521-
if args.aug_splits > 0:
522-
parser.error('Augmentation splits are not supported with scheduled resolution training.')
523-
if args.train_size_schedule == 'progressive':
524-
if len(args.train_img_sizes) < 2:
525-
parser.error('Progressive resolution training requires at least two --train-img-sizes values.')
526-
if args.epochs <= 0:
527-
parser.error('--epochs must be positive for progressive resolution training.')
528-
if args.train_size_schedule_spread < 0:
529-
parser.error('--train-size-schedule-spread must be non-negative.')
530-
if not 0 <= args.train_size_random_mix <= 1:
531-
parser.error('--train-size-random-mix must be between 0 and 1.')
532-
if args.train_batches_per_epoch is not None and args.train_batches_per_epoch <= 0:
533-
parser.error('--train-batches-per-epoch must be positive.')
534505
device = utils.init_distributed_device(args)
535506
if args.distributed:
536507
_logger.info(

0 commit comments

Comments
 (0)