{"record":{"id":"5ff7f535cdf85df2","repo":"rohitg00/ai-engineering-from-scratch","slug":"causal-mask-shape-tuple-mask-shape-does-not-mat","errorCode":null,"errorMessage":"causal mask shape {tuple(mask.shape)} does not match (n, n) = ({n}, {n})","messagePattern":"causal mask shape (.+?) does not match \\(n, n\\) = \\((.+?), (.+?)\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"phases/19-capstone-projects/61-cross-attention-fusion/code/main.py","lineNumber":71,"sourceCode":"class CausalSelfAttention(nn.Module):\n    def __init__(self, cfg: DecoderConfig) -> None:\n        super().__init__()\n        self.cfg = cfg\n        self.qkv = nn.Linear(cfg.hidden, cfg.hidden * 3, bias=True)\n        self.out = nn.Linear(cfg.hidden, cfg.hidden, bias=True)\n        self.drop = nn.Dropout(cfg.dropout)\n        self.scale = 1.0 / math.sqrt(cfg.head_dim)\n\n    def forward(self, x: torch.Tensor, mask: torch.Tensor | None = None) -> torch.Tensor:\n        b, n, d = x.shape\n        h, hd = self.cfg.heads, self.cfg.head_dim\n        qkv = self.qkv(x).reshape(b, n, 3, h, hd).permute(2, 0, 3, 1, 4)\n        q, k, v = qkv[0], qkv[1], qkv[2]\n\n        scores = (q @ k.transpose(-2, -1)) * self.scale\n        if mask is not None:\n            if mask.shape != (n, n):\n                raise ValueError(\n                    f\"causal mask shape {tuple(mask.shape)} does not match (n, n) = ({n}, {n})\"\n                )\n            scores = scores.masked_fill(~mask.unsqueeze(0).unsqueeze(0), float(\"-inf\"))\n        attn = F.softmax(scores, dim=-1)\n        out = (attn @ v).transpose(1, 2).reshape(b, n, d)\n        return self.drop(self.out(out))\n\n\nclass CrossAttention(nn.Module):\n    \"\"\"Multi-head cross-attention.\n\n    Query comes from text tokens; key and value come from image memory.\n    Supports a kv_cache argument so the projection of image memory can be\n    computed once and reused across decode steps.\n    \"\"\"\n\n    def __init__(self, cfg: DecoderConfig) -> None:\n        super().__init__()","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/19-capstone-projects/61-cross-attention-fusion/code/main.py#L53-L89","documentation":"Error \"causal mask shape {tuple(mask.shape)} does not match (n, n) = ({n}, {n})\" thrown in rohitg00/ai-engineering-from-scratch.","triggerScenarios":"Thrown at phases/19-capstone-projects/61-cross-attention-fusion/code/main.py:71 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}