huggingface/pytorch-image-models · error · ValueError

schedule_epochs must be a positive integer for a progressive

Error message

schedule_epochs must be a positive integer for a progressive schedule.

What it means

For choice_schedule='progressive', schedule_epochs defines over how many epochs the batch size grows and must be a positive integer; None, 0, negative, or fractional values are rejected.

Source

Thrown at timm/data/scheduled_sampler.py:76

            schedule_random_mix: float = 0.1,
    ) -> None:
        if not hasattr(sampler, '__len__'):
            raise TypeError('ScheduledBatchSampler requires a sampler with a length.')
        if len(sampler) <= 0:
            raise ValueError('ScheduledBatchSampler requires a non-empty sampler.')
        if not batch_sizes:
            raise ValueError('batch_sizes must contain at least one value.')
        if any(int(batch_size) != batch_size or batch_size <= 0 for batch_size in batch_sizes):
            raise ValueError('All scheduled batch sizes must be positive integers.')
        if num_batches is not None and (int(num_batches) != num_batches or num_batches <= 0):
            raise ValueError('num_batches must be a positive integer when specified.')
        if choice_schedule not in ('constant', 'progressive'):
            raise ValueError("choice_schedule must be 'constant' or 'progressive'.")
        if choice_schedule == 'progressive':
            if len(batch_sizes) < 2:
                raise ValueError('A progressive schedule requires at least two choices.')
            if schedule_epochs is None or int(schedule_epochs) != schedule_epochs or schedule_epochs <= 0:
                raise ValueError('schedule_epochs must be a positive integer for a progressive schedule.')
            if schedule_spread < 0:
                raise ValueError('schedule_spread must be non-negative.')
            if not 0 <= schedule_random_mix <= 1:
                raise ValueError('schedule_random_mix must be between 0 and 1.')

        self.sampler = sampler
        self.batch_sizes = tuple(int(batch_size) for batch_size in batch_sizes)
        self.choice_weights = self._normalize_choice_weights(choice_weights)
        self._active_choices = tuple(
            choice_index
            for choice_index, choice_weight in enumerate(self.choice_weights)
            if choice_weight > 0
        )
        self.seed = seed
        self.drop_last = drop_last
        self.shuffle_schedule = shuffle_schedule
        self.choice_schedule = choice_schedule
        self.schedule_epochs = int(schedule_epochs) if schedule_epochs is not None else None

View on GitHub (pinned to 9a5261e31b)

Solutions

  1. Set an explicit positive integer, e.g. schedule_epochs=20.
  2. If computed, round and clamp: max(1, round(frac * total_epochs)).

Example fix

# before
ScheduledBatchSampler(s, batch_sizes=[64,256], choice_schedule='progressive')

# after
ScheduledBatchSampler(s, batch_sizes=[64,256], choice_schedule='progressive', schedule_epochs=20)
Defensive patterns

Strategy: validation

Validate before calling

if choice_schedule == 'progressive':
    assert schedule_epochs is not None and int(schedule_epochs) == schedule_epochs > 0

Prevention

When it happens

Trigger: choice_schedule='progressive' with schedule_epochs omitted (defaults to None) or set to 0/10.5/-3.

Common situations: Enabling progressive mode without reading the required extra params; computing epochs from a fraction of total epochs (0.5*epochs) without rounding; config defaults of None leaking through.

Related errors


AI-assisted analysis of huggingface/pytorch-image-models@9a5261e31b (2026-08-27). Data as JSON: /api/errors/f0beee5df10ea4cb. Report an issue: GitHub.