grad_output.zero_()
на месте и grad_output[:, i-1] = 0
.На месте означает «изменить тензор вместо того, чтобы возвращать новый, к которому применены модификации».Примером решения, которое не на месте, является torch.where
.Пример использования для обнуления 1-го столбца
import torch
t = torch.randn(3, 3)
ixs = torch.arange(3, dtype=torch.int64)
zeroed = torch.where(ixs[None, :] == 1, torch.tensor(0.), t)
zeroed
tensor([[-0.6616, 0.0000, 0.7329],
[ 0.8961, 0.0000, -0.1978],
[ 0.0798, 0.0000, -1.2041]])
t
tensor([[-0.6616, -1.6422, 0.7329],
[ 0.8961, -0.9623, -0.1978],
[ 0.0798, -0.7733, -1.2041]])
Обратите внимание, как t
сохраняет значения, которые были у него ранее, а zeroed
имеет значения, которые вы хотите.