Skip to content

fix: handle singleton channel dim in expand_as_one_hot (closes #36) - #38

Open
rtmalikian wants to merge 1 commit into
black0017:masterfrom
rtmalikian:fix/expand-one-hot-singleton-channel
Open

fix: handle singleton channel dim in expand_as_one_hot (closes #36)#38
rtmalikian wants to merge 1 commit into
black0017:masterfrom
rtmalikian:fix/expand-one-hot-singleton-channel

Conversation

@rtmalikian

Copy link
Copy Markdown

Summary

Fixes #36expand_as_one_hot() silently returns a 5D target tensor unchanged when it has a singleton channel dimension ([B, 1, D, H, W]), causing the shape assertion in _AbstractDiceLoss.forward() to fail.

Root Cause

In lib/losses3D/basic.py, expand_as_one_hot() has an early return:

if input.dim() == 5:
    return input  # assumes already one-hot

When the target arrives as [B, 1, D, H, W] (5D with a singleton channel from the DataLoader), this returns it unchanged. The subsequent assertion input.size() == target.size() then fails because the model output is [B, C, D, H, W] but the target is [B, 1, D, H, W].

Fix

Modified the 5D check to handle three cases:

  1. Channel count matches C → return as-is (already one-hot, original fast path)
  2. Singleton channel (dim 1 == 1) → squeeze to 4D and proceed with one-hot expansion
  3. Any other channel count → raise a clear ValueError

Verification

Tested with:

  • 4D target [B, D, H, W] — original behavior preserved ✅
  • 5D singleton target [B, 1, D, H, W] — correctly expanded to one-hot ✅
  • 5D already one-hot [B, C, D, H, W] — returned as-is ✅
  • Wrong channel count — clear error message ✅
  • Exact shapes from issue AssertionError: 'input' and 'target' must have the same shape #36: input [4,4,128,128,48], target [4,1,128,128,48] — loss computed successfully ✅
  • GeneralizedDiceLoss — also works with the fix ✅

About the Author: Raphael Malikian — Clinical AI Solutions Architect. I specialise in building and fixing AI/ML systems for healthcare, including vector databases, RAG pipelines, and clinical NLP. If you need help with your project or think I can add value to your organisation, feel free to reach out — I'd love to connect.

📧 rtmalikian@gmail.com
🔗 GitHub: https://github.com/rtmalikian
🔗 LinkedIn: http://www.linkedin.com/in/raphael-t-malikian-mbbs-bsc-hons-71075436a


Disclosure: This code was developed with assistance from mimo-2.5-pro (Xiaomi) via Hermes Agent (Nous Research). All changes were reviewed, tested against the actual codebase, and verified for correctness.

…017#36)

When the target tensor arrives as 5D with a singleton channel dimension
(e.g. [B, 1, D, H, W] from a DataLoader), expand_as_one_hot previously
returned it unchanged because it only checked input.dim() == 5. This
caused the assertion in _AbstractDiceLoss.forward() to fail since
[B, C, D, H, W] != [B, 1, D, H, W].

Fix: when the input is 5D with 1 channel, squeeze to 4D before
proceeding with one-hot expansion. If the input already has C channels,
return as-is (preserving the original fast path). If the channel count
is neither 1 nor C, raise a clear ValueError.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AssertionError: 'input' and 'target' must have the same shape

1 participant