{"record":{"id":"628bc70fe2a47268","repo":"keras-team/keras","slug":"patches-has-unexpected-rank-for-3d-channels-firs","errorCode":null,"errorMessage":"`patches` has unexpected rank for 3D channels_first reconstruction. Expected 4 (unbatched) or 5 (batched). Received shape: {patches.shape}","messagePattern":"`patches` has unexpected rank for 3D channels_first reconstruction\\. Expected 4 \\(unbatched\\) or 5 \\(batched\\)\\. Received shape: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/ops/image.py","lineNumber":1346,"sourceCode":"        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(\n                \"`patches` has unexpected rank for 3D channels_first \"\n                \"reconstruction. Expected 4 (unbatched) or 5 (batched). \"\n                f\"Received shape: {patches.shape}\"\n            )\n        result = _reconstruct_patches_3d(\n            patches, size, output_size, strides, padding, \"channels_last\"\n        )\n        if len(result.shape) == 4:\n            return backend.numpy.transpose(result, axes=(3, 0, 1, 2))\n        return backend.numpy.transpose(result, axes=(0, 4, 1, 2, 3))\n\n    pD, pH, pW = size\n    D, H, W = output_size\n\n    if len(patches.shape) not in (4, 5):\n        raise ValueError(\n            \"`patches` has unexpected rank for 3D reconstruction. \"\n            \"Expected 4 (unbatched) or 5 (batched). \"","sourceCodeStart":1328,"sourceCodeEnd":1364,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/ops/image.py#L1328-L1364","documentation":"For data_format='channels_first', 3D reconstruct_patches first transposes your patches from (flat, gD, gH, gW) or (B, flat, gD, gH, gW) into channels-last layout. If patches has any other rank (e.g. you already passed channels-last rank-5 patches together with channels_first), the transpose is impossible and it raises.","triggerScenarios":"reconstruct_patches(patches, ..., data_format='channels_first') with patches of rank 3 or 6, or with channels-last style (B,gD,gH,gW,C) rank-5 patches.","commonSituations":"Mixing layout conventions between extract and reconstruct; passing patches already transposed; loading patches saved in channels_last while the model config says channels_first.","solutions":["Feed the same layout extract_patches produced: flat-dim-first (rank 4 unbatched / rank 5 batched) when using channels_first","Or drop data_format (use channels_last) and pass (B,gD,gH,gW,C) patches","Check len(patches.shape) before the call"],"exampleFix":"# before\nreconstruct_patches(patches_cl, size, out, data_format='channels_first')\n# patches_cl has shape (B, gD, gH, gW, C)\n\n# after\nreconstruct_patches(patches_cl, size, out)  # channels_last default","handlingStrategy":"validation","validationCode":"if data_format == 'channels_first':\n    assert len(patches.shape) in (4, 5), 'need (flat,gD,gH,gW) or (B,flat,gD,gH,gW)'","typeGuard":"def channels_first_3d_ok(patches) -> bool:\n    return len(patches.shape) in (4, 5)","tryCatchPattern":null,"preventionTips":["Keep extract and reconstruct on the same data_format","Document the expected patches layout next to the producer"],"tags":["keras","image","patches","data-format","rank-error"],"backgroundTag":"tensor-rank-mismatch","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}