{"record":{"id":"e264e7a20097cd59","repo":"keras-team/keras","slug":"invalid-output-size-expected-length-3-d-h-w","errorCode":null,"errorMessage":"Invalid `output_size`. Expected length 3 (D, H, W). Got: output_size={output_size}","messagePattern":"Invalid `output_size`\\. Expected length 3 \\(D, H, W\\)\\. Got: output_size=(.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/ops/image.py","lineNumber":1328,"sourceCode":"                f\"size * grid. Got output_size=({H},{W}), \"\n                f\"grid=({gH},{gW}), size=({pH},{pW}).\"\n            )\n\n    if _unbatched:\n        x = backend.numpy.squeeze(x, axis=0)\n    return x\n\n\ndef _reconstruct_patches_3d(\n    patches,\n    size,\n    output_size,\n    strides=None,\n    padding=\"valid\",\n    data_format=None,\n):\n    if len(output_size) != 3:\n        raise ValueError(\n            \"Invalid `output_size`. Expected length 3 (D, H, W). \"\n            f\"Got: output_size={output_size}\"\n        )\n    if padding not in (\"same\", \"valid\"):\n        raise ValueError(\n            f\"Invalid `padding`. Expected 'same' or 'valid'. Got: {padding}\"\n        )\n    _validate_reconstruct_strides(size, strides, \"reconstruct_patches\")\n    data_format = backend.standardize_data_format(data_format)\n    if data_format == \"channels_first\":\n        # Reconstruct in channels_last layout, then move channels back.\n        # Patches are (flat, gD, gH, gW) unbatched or (B, flat, gD, gH, gW).\n        if len(patches.shape) == 4:\n            patches = backend.numpy.transpose(patches, axes=(1, 2, 3, 0))\n        elif len(patches.shape) == 5:\n            patches = backend.numpy.transpose(patches, axes=(0, 2, 3, 4, 1))\n        else:\n            raise ValueError(","sourceCodeStart":1310,"sourceCodeEnd":1346,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/ops/image.py#L1310-L1346","documentation":"The 3D branch of keras.ops.image.reconstruct_patches requires output_size as a 3-element sequence (D, H, W). It raises when len(output_size) != 3, before touching tensors, because the target volume shape is undefined.","triggerScenarios":"reconstruct_patches on rank-5 (batched 3D) or rank-4 (unbatched 3D) patches with output_size of length 2 or 4, e.g. (28,28) or (D,H,W,C).","commonSituations":"Porting 2D reconstruction code to 3D volumes (medical CT/MRI, video) and not extending output_size; including a channel or batch entry in output_size; passing a numpy array where a typo drops an element.","solutions":["Pass exactly three spatial ints: output_size=(D,H,W), no batch/channel axes","Confirm the patches tensor really is the 3D kind (rank 5 batched / rank 4 unbatched)","Add an assert len(output_size)==3 guard in the data pipeline"],"exampleFix":"# before\nreconstruct_patches(patches, size=(4,8,8), output_size=(28,28))\n\n# after\nreconstruct_patches(patches, size=(4,8,8), output_size=(16,28,28))","handlingStrategy":"validation","validationCode":"if len(output_size) != 3:\n    raise ValueError('output_size must be (D,H,W)')","typeGuard":"def is_3d_output_size(output_size) -> bool:\n    return hasattr(output_size, '__len__') and len(output_size) == 3","tryCatchPattern":null,"preventionTips":["Mirror the dimensionality of size and output_size","Add length asserts in preprocessing pipelines"],"tags":["keras","image","patches","argument-shape","input-validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}