對pytroch中torch.autograd.backward的思考
反向傳遞法則是深度學習中最為重要的一部分,torch中的backward可以對計算圖中的梯度進行計算和累積
這裡通過一段程式來演示基本的backward操作以及需要注意的地方
>>> import torch
>>> from torch.autograd import Variable
>>> x = Variable(torch.ones(2,2), requires_grad=True)
>>> y = x + 2
>>> y.grad_fn
Out[6]: <torch.autograd.function.AddConstantBackward at 0x229e7068138>
>>> y.grad
>>> z = y*y*3
>>> z.grad_fn
Out[9]: <torch.autograd.function.MulConstantBackward at 0x229e86cc5e8>
>>> z
Out[10]:
Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
>>> out = z.mean()
>>> out.grad_fn
Out[12]: <torch.autograd.function.MeanBackward at 0x229e86cc408>
>>> out.backward() # 這裡因為out為scalar標量,所以引數不需要填寫
>>> x.grad
Out[19]:
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
>>> out # out為標量
Out[20]:
Variable containing:
27
[torch.FloatTensor of size 1]
>>> x = Variable(torch.Tensor([2,2,2]), requires_grad=True)
>>> y = x*2
>>> y
Out[52]:
Variable containing:
4
4
4
[torch.FloatTensor of size 3]
>>> y.backward() # 因為y輸出為非標量,求向量間元素的梯度需要對所求的元素進行標註,用相同長度的序列進行標註
Traceback (most recent call last):
File "C:UsersdellAnaconda3envsmy-pytorchlibsite-packagesIPythoncoreinteractiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-53-95acac9c3254>", line 1, in <module>
y.backward()
File "C:UsersdellAnaconda3envsmy-pytorchlibsite-packages orchautogradvariable.py", line 156, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph, retain_variables)
File "C:UsersdellAnaconda3envsmy-pytorchlibsite-packages orchautograd\__init__.py", line 86, in backward
grad_variables, create_graph = _make_grads(variables, grad_variables, create_graph)
File "C:UsersdellAnaconda3envsmy-pytorchlibsite-packages orchautograd\__init__.py", line 34, in _make_grads
raise RuntimeError("grad can be implicitly created only for scalar outputs")
RuntimeError: grad can be implicitly created only for scalar outputs
>>> y.backward(torch.FloatTensor([0.1, 1, 10]))
>>> x.grad #注意這裡的0.1,1.10為梯度求值比例
Out[55]:
Variable containing:
0.2000
2.0000
20.0000
[torch.FloatTensor of size 3]
>>> y.backward(torch.FloatTensor([0.1, 1, 10]))
>>> x.grad # 梯度累積
Out[57]:
Variable containing:
0.4000
4.0000
40.0000
[torch.FloatTensor of size 3]
>>> x.grad.data.zero_() # 梯度累積進行清零
Out[60]:
0
0
0
[torch.FloatTensor of size 3]
>>> x.grad # 累積為空
Out[61]:
Variable containing:
0
0
0
[torch.FloatTensor of size 3]
>>> y.backward(torch.FloatTensor([0.1, 1, 10]))
>>> x.grad
Out[63]:
Variable containing:
0.2000
2.0000
20.0000
[torch.FloatTensor of size 3]
相關文章
- 對“微信十年產品思考”的思考
- 對開源的冷思考
- 我對測試的思考
- 我對運維的思考運維
- 精讀《對 Markdown 的思考》
- 面對物件的思考 (轉)物件
- 專案開發中對成長的一些思考
- 從網路小說中得到對於科幻題材的思考
- 對 Strong-Weak Dance的思考
- 對Spring IOC容器的思考Spring
- 我對人生的一點思考
- 對“芝諾悖論”的思考
- 對數字孿生的思考
- 對Elasticsearch生命週期的思考Elasticsearch
- 對前端質量保障的思考前端
- 對微型專案管理的思考專案管理
- 對中國3G的思考
- 對於人工智慧的思考人工智慧
- 對 Strong-Weak Dance 的思考
- Jmservice對於服務的思考
- 面對物件的思考(二) (轉)物件
- 再次對於Matrix 的思考 (轉)
- 對於單頁應用中如何監聽 URL 變化的思考
- 對於“AI威脅論”的思考AI
- 對專案管理的一點思考專案管理
- 對ThreadLocal的一些思考thread
- 漫談對大資料的思考大資料
- 對資料中臺的梳理與思考
- 對容器映象的思考和討論
- 針對小手指的設計思考
- 對於人生的一些思考
- 對查詢資料庫中第M到N條記錄的思考資料庫
- 由mv命令引發的對inode的思考
- 對HashMap的思考及手寫實現HashMap
- 對快取擊穿的一點思考快取
- 我對移動端架構的思考架構
- 非對稱加密演算法的思考加密演算法
- 對優秀程式設計師的思考程式設計師