在机器学习中使用责任链模式

时间:2018-03-09 10:17:45

标签: c++ design-patterns machine-learning software-design

我已经阅读了很多机器学习的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();
}

谢谢。

3 个答案:

答案 0 :(得分:2)

for循环的优点是每次调用for循环时layers集合可能不同。缺点&#39;是的,for循环保证在集合的每个项目上调用成员函数。

责任链模式可以进行“迭代”。通过集合,但很难更改集合,并必须更新项目之间的所有链接。另外,由于这是递归,你可能会出现堆栈溢出!

然而,在终止循环时,责任链真的很闪亮:任何成员都可以决定自己处理呼叫并立即返回,或者只是转发到下一个项目。

答案 1 :(得分:0)

为什么要通过创建列表并调用它来简化简单代码&#34;责任链&#34;?

std::vector<Layer> layers(10);
for(Layer& hidden : layers)
{
  // prepare for activation aka do something
  hidden.activation();
}

你对此方法不喜欢什么?

答案 2 :(得分:0)

第一个例子;每一层完全独立于下一层。这意味着他们对其他层一无所知 - 它们可能存在也可能不存在;并且只需要专注于单一的责任。

第二个;这些图层现在不仅知道有其他图层,而且还知道它是一个链表。如果第2层和第3层彼此独立但仅依赖于1,该怎么办?表示失败的能力。最终,控制图层的项目不再具有以任何方式存储它们的能力,导致它是一个糟糕的设计,因为它正在朝向上帝对象。