x=torch.arange(24)
x.numel()
## 输出 24,也就是元素个数
X = x.reshape(4, 6)
4行6列二维张量
y = torch.tensor([[[1,2,3],[2,3,4],[4,3,2]],[[1,2,3],[4,5,6],[2,4,5]]])
2,3,3的三维张量
detach脱离计算图来算梯度
x.grad.zero_()
y = x * x
u = y.detach()
z = u * x
z.sum().backward()
x.grad == u
# tensor([True, True, True, True])
这里可以分离y来返回一个新变量u,该变量与y具有相同的值, 但丢弃计算图中如何计算y的任何信息。 换句话说,梯度不会向后流经u到x。 因此,下面的反向传播函数计算z=ux关于x的偏导数,同时将u作为常数处理, 而不是z=xxx关于x的偏导数。
由于记录了y的定义,我们可以随后在y上调用反向传播, 得到y=xx关于的x的导数,即2*x。
x.grad.zero_()
y.sum().backward()
x.grad == 2 * x