用 N 遍历 C,产生漏算或越界
LRN 规范把输入定义为 `(N, C, D1, ..., Dn)`,归一化窗口应沿通道轴 `C` 滑动;旧参考实现却用 `range(x.shape[0])` 遍历 batch 数,再把循环索引写到 `square_sum[:, c, :, :]` 的通道位置。当 `N < C` 时部分通道永远保持零归一化和,当 `N > C` 时则会越过通道边界;硬编码四维切片还拒绝规范允许的 3D、5D 等输入。
面向机器学习模型互操作的开放标准与参考实现,定义统一的计算图、算子规范和序列化格式,并提供模型检查、形状推断、参考执行器与后端一致性测试,连接训练框架、编译器和推理运行时。
LRN 的邻域窗口只能沿通道轴移动;batch 数与空间维数量都不应该改变要归一化哪些通道。
window = channels around cfor c in range(x.shape[0])channel_count = x.shape[1]sum(x[:, begin:end, ...]², axis=1)LRN 规范把输入定义为 `(N, C, D1, ..., Dn)`,归一化窗口应沿通道轴 `C` 滑动;旧参考实现却用 `range(x.shape[0])` 遍历 batch 数,再把循环索引写到 `square_sum[:, c, :, :]` 的通道位置。当 `N < C` 时部分通道永远保持零归一化和,当 `N > C` 时则会越过通道边界;硬编码四维切片还拒绝规范允许的 3D、5D 等输入。
LRN 对每个 batch 和空间位置独立计算相邻通道的平方和,因此循环边界与窗口上下限都只能来自 `x.shape[1]`。空间维数量并不参与通道选择,应该通过省略号原样传递;输出缓冲区也应继承输入的形状与 dtype,避免实现额外制造维度和类型假设。
引入 `channel_count = x.shape[1]`,按通道数迭代并以同一计数裁剪窗口,使用 `square_sum[:, c, ...] = sum(x[:, begin:end, ...] ** 2, axis=1)` 统一处理任意空间维;最低秩约束从固定 4D 改为至少包含 batch 与 channel 的 2D。同步更新生成的后端用例,并新增奇偶窗口、边界通道、3D/4D/5D、零通道以及 float16、float32、float64、bfloat16 覆盖。
LRN 参考执行器现在在 batch 与 channel 数不相等时仍会完整归一化每个通道,不再留下错误零值或触发越界;同一实现也忠实支持规范中的任意空间维输入和全部支持 dtype。参考执行器测试 310 项通过、4 项跳过,LRN 后端测试 2 项通过、2 项跳过,完整 lint 同步通过。