{"record":{"id":"416932f5c1a04811","repo":"keras-team/keras","slug":"asked-to-retrieve-element-idx-but-the-sequence","errorCode":null,"errorMessage":"Asked to retrieve element {idx}, but the Sequence has length {length}","messagePattern":"Asked to retrieve element (.+?), but the Sequence has length (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/legacy/preprocessing/image.py","lineNumber":59,"sourceCode":"        super().__init__(**kwargs)\n        self.n = n\n        self.batch_size = batch_size\n        self.seed = seed\n        self.shuffle = shuffle\n        self.batch_index = 0\n        self.total_batches_seen = 0\n        self.lock = threading.Lock()\n        self.index_array = None\n        self.index_generator = self._flow_index()\n\n    def _set_index_array(self):\n        self.index_array = np.arange(self.n)\n        if self.shuffle:\n            self.index_array = np.random.permutation(self.n)\n\n    def __getitem__(self, idx):\n        if idx >= len(self):\n            raise ValueError(\n                \"Asked to retrieve element {idx}, \"\n                \"but the Sequence \"\n                \"has length {length}\".format(idx=idx, length=len(self))\n            )\n        if self.seed is not None:\n            np.random.seed(self.seed + self.total_batches_seen)\n        self.total_batches_seen += 1\n        if self.index_array is None:\n            self._set_index_array()\n        index_array = self.index_array[\n            self.batch_size * idx : self.batch_size * (idx + 1)\n        ]\n        return self._get_batches_of_transformed_samples(index_array)\n\n    def __len__(self):\n        return (self.n + self.batch_size - 1) // self.batch_size  # round up\n\n    def on_epoch_end(self):","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/legacy/preprocessing/image.py#L41-L77","documentation":"keras.utils.Sequence (legacy image preprocessing Iterator) bounds-checks __getitem__: requesting a batch index >= the number of batches raises this ValueError. It guards index_array access so an out-of-range request fails fast instead of returning garbage.","triggerScenarios":"Calling iterator[i] or Sequence.__getitem__ with idx >= number of batches; using a len computed before changing batch_size; iterating with a hardcoded range after the dataset shrinks.","commonSituations":"Custom training loops that compute steps_per_epoch from an older batch_size, resuming after reducing the dataset, multiprocessing workers with cached lengths.","solutions":["Index with idx < len(sequence) - derive bounds from len(seq) or floor(n / batch_size)","Recompute steps_per_epoch whenever batch_size or dataset size changes","Iterate with enumerate(sequence) instead of manual indices"],"exampleFix":"# before\nfor i in range(1000):\n    batch = seq[i]\n\n# after\nfor i in range(len(seq)):\n    batch = seq[i]","handlingStrategy":"type-guard","validationCode":"assert 0 <= idx < len(seq)","typeGuard":"def valid_index(seq, i): return isinstance(i, int) and 0 <= i < len(seq)","tryCatchPattern":"try:\n    batch = seq[idx]\nexcept ValueError as e:\n    if 'has length' in str(e):\n        raise IndexError(f'{idx} out of range for {len(seq)} batches') from e\n    raise","preventionTips":["Always derive loop bounds from len(sequence), never hardcode","Recompute lengths after any change to batch_size or dataset size"],"tags":["keras","sequence","index-error","out-of-range"],"backgroundTag":"index-out-of-bounds","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}