【发布时间】:2019-11-25 18:02:15
【问题描述】:
我有一个大小为 (1000, 30, 16, 16) 的张量。我正在做关于如何规范化它的实验。我正在尝试跨案例标准化,可能是频率轴等。
以下作品:
a = np.random.rand(1000, 30, 16, 16)
a - a.mean(axis=(0, )) #==> it works
a - a.mean(axis=(0, 1)) #==> successful broadcast
a - a.mean(axis=(0, 1, 2)) #==> works well
a - a.mean(axis=(0, 1, 2, 3)) #==> succesful broadcast of scalar mean to all a values
#Those however fail:
a - a.mean(axis=(2, 3))
#OR:
a - a.mean(axis=(0, 2, 3))
我明白了:
ValueError: 操作数不能与形状一起广播 (1000, 30, 16, 16) (30,)
它似乎在简单的情况下成功完成了缺少的轴,例如 (30, 16, 16)
(16, 16)
(16,)
(1,)
但是当缺少的轴在右边而不是左边时失败,例如: (1000, 30) 并且无法将其广播到 (1000, 30, 16, 16)。
具体来说我的问题是,我如何规定广播是如何进行的? 比如我有 (30,) 我想广播到 (1000, 30, 16, 16)
由于广播失败,它会引发错误。我有一个 hacky 解决方案,它排列轴并制作 (30,) 排在最后,以便广播工作,但我想知道是否有办法规定应该如何进行广播。此外,为什么这不是自动完成的?
【问题讨论】: