【发布时间】:2020-03-21 02:11:38
【问题描述】:
我想用 -5 替换二维张量中的所有 0。
使用数据框,我可以轻松做到这一点:
df = df.mask(df=0, -5)
但这不适用于张量。我试过了:
y = torch.where(y = 0, -5, y)
【问题讨论】:
标签: python tensorflow pytorch tensor
我想用 -5 替换二维张量中的所有 0。
使用数据框,我可以轻松做到这一点:
df = df.mask(df=0, -5)
但这不适用于张量。我试过了:
y = torch.where(y = 0, -5, y)
【问题讨论】:
标签: python tensorflow pytorch tensor
一般有两种方式。
上面由prhmma 给出的一个是使用像y[y == 0] = -5 这样的就地突变。它既好又高效,但会破坏 autograd 操作。所以如果你想让梯度流过 y,你不应该那样做。
另一种方法是使用torch.where,正如您所尝试的那样。正确的咒语是
y = torch.where(y == 0, torch.tensor(-5), y)
或者,如果您想与设备和数据类型无关
five = torch.tensor(-5, dtype=y.dtype, device=y.device)
y = torch.where(y == 0, five, y)
where 不接受标量这一事实是一个令人讨厌的剪纸,但这就是 ATM 的方式。请注意,虽然选择本身是离散的且显然不可微分,但此操作将使梯度流过两个操作数。
【讨论】:
y = -5 if x == 0 else x 在 0 处不可微分,它甚至都不是连续的。所以有效的反向传播是不可能的
很简单,就用这个
y[y==0]=-5
【讨论】: