【发布时间】:2021-06-27 19:07:38
【问题描述】:
我有一个形状为 (100, 16, 16) 的张量 A 和一个形状为 (100) 的张量 B,其中 100 是批量大小。我想创建一个形状为(100, 16, 16) 的A 的二进制掩码,其中在掩码的每个元素(元素的形状为(1, 16, 16))中,如果该元素大于计算的分位数值,则值为1,否则0。张量 B 中的每个元素依次表示 A 中每个单独元素的百分位值。如果 B 只是一个标量,我可以使用:
flat_A = torch.reshape(A, (100, -1))
quants = torch.quantile(flat_A, B, dim=1)
quants = torch.reshape(quants, (100, 1, 1))
mask = torch.where(A >= quants, 1, 0)
# quants will have shape (100, 1, 1)
问题是:如果 B 是形状为 (100) 的一维张量,就像我上面所说的,我如何计算 A 中每个单独元素的百分位值?我尝试了以下方法,但结果看起来不像我预期的那样:
>>> torch.quantile(flat_A, B, dim=1).shape
torch.Size([100, 100])
>>> torch.quantile(flat_A, B, dim=0).shape
torch.Size([100, 256])
我认为结果的形状应该是(100),所以我可以使用mask = torch.where(A >= quants, 1, 0),还是我误解了?
为了更多的上下文,这个问题也是我之前here的标量B值问题的扩展。
【问题讨论】: