关于backward函数的用法:
分别是out为标量和矢量时候的情况:
import torch
x = torch.tensor([1, 2, 3], dtype=torch.float, requires_grad=True)
y = x + 3
z = y * 3
# out为标量
# out = z.mean()
# print(out)
# out.backward()
# print(out)
# print("input data:", x.data)
# print("input gradient:", x.grad)
# print("元素个数:", x.numel())
# out为矢量
out = z ** 3
print(out)
out.backward(torch.ones_like(out))
print(out)
print("input data:", x.data)
print("output gradient:", x.grad)
torch中sum()函数
import torch
x = torch.tensor([1, 2, 3, 4, 5, 6, 7])
y = torch.tensor([1, 3, 2, 4, 5, 7, 6])
z = (x == y).sum() # 求解x,y中相等项数之和
print("x==y : ", x == y)
print(z) # 返回的是一个张量
print(z.item()) # 返回的是一个数值
结果如下:
x==y : tensor([ True, False, False, True, True, False, False])
tensor(3)
3
torch中的with torch.no_grad() 的作用:
由于torch中的tensor有一个requires_grad参数,若一个tensor的requires_grad=True,则 在进行反向传播算法时,就会自动求导,详参见上面的backward函数用法。若一个tensor的requires_grad=True,则依赖其的其他tensor的requires_grad=True,尽管该tensor依赖的其他的tensor的requires_grad=False。
当tensor的requires_grad=False时,反向传播时就不会自动求导了,极大地节约了内存。
而 with torch.no_grad()函数,可以让其间的tensor的requires_grad=False,尽管其依赖的tensor的requires_grad=True。示例如下:
import torch
x = torch.tensor([1, 2, 3], dtype=torch.float, requires_grad=True)
y = torch.tensor([4, 3, 2], dtype=torch.float, requires_grad=False)
z = x + y
print("z.requires_grad:", z.requires_grad)
with torch.no_grad():
out = x + y
print("out.requires_grad:", out.requires_grad)
print("out.grad_fn:", out.grad_fn)
print("out.requires_grad:", out.requires_grad)
结果如下:
z.requires_grad: True
out.requires_grad: False
out.grad_fn: None
out.requires_grad: False
观察可以发现,z的requires_grad=True,而在 with torch.no_grad()语句下,out的requires_grad=False,且out的求梯度的函数grad_fn为空。