requires_grad: 如果需要為張量計算梯度,則為True,否則為False,我們使用pytorch創建tensor時,可以指定requires_grad為True(默認為False),
grad_fn: grad_fn用來記錄變數是怎么來的,方便計算梯度,y = x*3,grad_fn記錄了y由x計算的程序,
grad:當執行完了backward()之后,通過x.grad查看x的梯度值,
創建一個Tensor并設定requires_grad=True,requires_grad=True說明該變數需要計算梯度,
>>x = torch.ones(2, 2, requires_grad=True)
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
>>print(x.grad_fn) # None
>>y = x + 2
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward>)
>>print(y.grad_fn) # <AddBackward object at 0x1100477b8>
由于x是直接創建的,所以它沒有grad_fn,而y是通過一個假發操作創建的,所以y有grad_fn
像x這種直接創建的稱為葉子節點,葉子節點對應的grad_fn是None,
requires_grad屬性是可以改變的
通過.requires_grad_()來用in-place的方式改變requires_grad屬性:
>>a = torch.randn(2, 2) # 缺失情況下默認 requires_grad = False
>>a = ((a * 3) / (a - 1))
>>print(a.requires_grad) # False
>>a.requires_grad_(True)
>>print(a.requires_grad) # True
執行下列操作之后
>>z = y * y * 3
>>out = z.mean()
>>print(z, out)
當我們對out使用backward()方法后,就可以查看x的梯度值
>>out.backward() # 等價于 out.backward(torch.tensor(1.))
>>print(x.grad)
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
注意:grad在反向傳播程序中是累加的(accumulated),這意味著每一次運行反向傳播,梯度都會累加之前的梯度,所以一般在反向傳播之前需把梯度清零,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250691.html
標籤:python
下一篇:了解js逆向的第一天
