这是一个非常简单的例子:
进口火炬
x = torch.tensor([1。,2.,3.,4.,5。],requires_grad = True)y = torch.tensor([2。,2.,2.,2.,2。],requires_grad = True)z = torch.tensor([1。,1.,0.,0.,0。] ……
不,当达到零时,pytorch不会修剪任何后续计算。更糟糕的是,由于浮点运算如何工作,所有后续乘以零将花费与任何常规乘法大致相同的时间。
对于某些情况,有一些方法,例如,如果你想使用蒙面损失你可以 的 组 强> 屏蔽的输出为零,或者将它们从梯度中分离出来。
这个例子清楚地区分了:
def time_backward(do_detach): x = torch.tensor(torch.rand(100000000), requires_grad=True) y = torch.tensor(torch.rand(100000000), requires_grad=True) s2 = torch.sum(x * y) s1 = torch.sum(x * y) if do_detach: s2 = s2.detach() s = s1 + 0 * s2 t = time.time() s.backward() print(time.time() - t) time_backward(do_detach= False) time_backward(do_detach= True)
输出:
0.502875089645 0.198422908783