[英]Using Chain of Responsibility pattern in machine learning
我已經閱讀了很多機器學習的C ++和Java代碼,其中每個隱藏層都在for循環內調用。 為什么從未使用過“責任鏈 ”模式? 它的缺點是什么?
-經典方法:
std::vector<Layer> layers(10);
for(Layer& hidden : layers)
hidden.activation();
-帶有責任鏈:
std::vector<Layer*> layers();
// ... init layers vector ...
layers[0]->nextLayer(layers[1]);
layers[1]->nextLayer(layers[2]);
layers[2]->nextLayer(layers[3]);
// and so on...
layers[0]->activation();
在圖層中:
Layer::activation()
{
// do something
nextLayer->activation();
}
謝謝。
for循環的優點在於,每次調用for循環時, layers
集合可能會有所不同。 “缺點”是確保for循環可以在集合的每個項目上調用成員函數。
可以使“責任鏈”模式在整個集合中“迭代”,但是很難更改集合並必須更新項目之間的所有鏈接。 另外,由於這是遞歸,因此可能會導致堆棧溢出!
但是,當終止循環時,“責任鏈”確實很出色:任何成員都可以決定自己處理呼叫並立即返回,或者直接轉發到下一個項目。
為什么通過創建列表並將其稱為“責任鏈”來使簡單代碼復雜化?
std::vector<Layer> layers(10);
for(Layer& hidden : layers)
{
// prepare for activation aka do something
hidden.activation();
}
您不喜歡這種方法嗎?
第一個例子; 每層完全獨立於下一層。 這意味着它們對其他層一無所知-它們可能存在或可能不存在; 並且只需要專注於單一責任。
第二; 這些圖層現在不僅知道還有其他圖層,而且還知道這是一個鏈表。 如果第2層和第3層彼此獨立但僅依賴1層怎么辦? 表達這種能力的能力已經喪失。 最終,控制圖層的項目不再具有存儲所需功能的能力,這導致設計不佳,因為它正朝着上帝的目標努力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.