autograd實現
思路:
步驟一:從某個葉節點開始,將其壓入隊尾
步驟二:彈出隊首節點作為當前節點。先求出當前節點對於各個父節點的梯度,父節點加上這個梯度之後出度也隨之減一,當某個父節點出度為零時,將其加入佇列中。重複步驟二。
std::vector <std::vector <double>> nn::graph::compute_gradients (nn::var::iterator tar, const std::vector <nn::var::iterator> &var_list) {
var *target = tar.reference;
auto outdegrees = find_outdegrees (target);
std::unordered_map <var*, std::vector <double>> gradients;
std::queue <var*> q;
gradients[target] = {1.0};
q.push (target);
while (q.size()) {
auto node = q.front ();
q.pop ();
if (node -> operation == nullptr)
continue;
auto input_gradients = node -> operation -> grad (gradients[node]);
for (size_t i = 0; i < input_gradients.size(); i++) {
var *in_node = (node -> inputs)[i];
add_to_vector (gradients[in_node], input_gradients[i]);
outdegrees[in_node]--;
if (outdegrees[in_node] == 0)
q.push (in_node);
}
}
std::vector <std::vector <double>> result;
for (auto &i : var_list)
result.push_back (gradients[i.reference]);
clear ();
return result;
}
相關文章
- 06_pytorch的autograd操作PyTorch
- pytorch程式碼示例筆記 -- AutogradPyTorch筆記
- PyTorch 介紹 | AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRADPyTorch
- [原始碼解析] PyTorch 分散式 Autograd (5) ---- 引擎(上)原始碼PyTorch分散式
- [原始碼解析] PyTorch 分散式 Autograd (6) ---- 引擎(下)原始碼PyTorch分散式
- [原始碼解析] PyTorch 分散式 Autograd (1) ---- 設計原始碼PyTorch分散式
- [原始碼解析] PyTorch 分散式 Autograd (4) ---- 如何切入引擎原始碼PyTorch分散式
- [原始碼解析] PyTorch 分散式 Autograd (2) ---- RPC基礎原始碼PyTorch分散式RPC
- [原始碼解析] PyTorch 分散式(14) --使用 Distributed Autograd 和 Distributed Optimizer原始碼PyTorch分散式
- [原始碼解析] PyTorch 分散式 Autograd (3) ---- 上下文相關原始碼PyTorch分散式
- AOP如何實現及實現原理
- vue 實現原理及簡單示例實現Vue
- pytorch實現yolov3(3) 實現forwardPyTorchYOLOForward
- 動手實現一個localcache - 實現篇
- C均值聚類 C實現 Python實現聚類Python
- 訊息的即時推送——net實現、websocket實現以及socket.io實現Web
- Promise實現Promise
- jwt實現JWT
- asyncToGenerator 實現
- 實現 strStr()
- ALU實現
- Vue實現左右選單聯動實現(更新)Vue
- Golang 實現 Redis(5): 使用跳錶實現 SortedSetGolangRedis
- linux實現DNS輪詢實現負載平衡LinuxDNS負載
- 簡易實現 HTTPS (一) 自動實現 sslHTTP
- java實現兩個文字相似度 simHash 實現Java
- Spring實現IOC容器的兩種實現方式Spring
- Python實現火柴人的設計與實現Python
- GO實現Redis:GO實現Redis叢集(5)GoRedis
- 簡單介紹numpy實現RNN原理實現RNN
- Docker實現服務發現Docker
- etcd實現服務發現
- android圖片裁剪拼接實現(二):觸控實現Android
- 從零實現Vue的元件庫(十六)- Dropdown 實現Vue元件
- 從零實現Vue的元件庫(九)- InputNumber 實現Vue元件
- 從零實現Vue的元件庫(二)- Slider 實現Vue元件IDE
- 從零實現Vue的元件庫(一)- Toast 實現Vue元件AST
- 從零實現Vue的元件庫(十二)- Table 實現Vue元件