我读过许多机器学习的C++和Java代码,其中每个隐藏层在for循环中被调用。为什么从来没有使用过响应性模式链?它的不前卫是什么?
-Classic方法:
std::vector<Layer> layers(10);
for(Layer& hidden : layers)
hidden.activation();-With响应链:
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();
}谢谢。
发布于 2018-03-09 10:26:27
for循环的优点是每次调用for循环时,layers集合可能是不同的。“缺点”是保证for循环对集合的每个项调用成员函数。
责任链模式可以通过集合进行“迭代”,但是很难更改集合,并且必须更新项之间的所有链接。而且,由于这是递归,所以可能会出现堆栈溢出!
但是,在终止循环时,责任链确实会发光:任何成员都可以决定自己处理调用本身并立即返回,或者直接转发到下一项。
发布于 2018-03-09 10:24:55
为什么要通过创建列表并称之为“责任链”来使简单的代码复杂化呢?
std::vector<Layer> layers(10);
for(Layer& hidden : layers)
{
// prepare for activation aka do something
hidden.activation();
}你不喜欢这种方法吗?
发布于 2018-03-09 10:27:24
第一个例子;每个层完全独立于下一个层。这意味着他们对其他层一无所知--他们可能存在,也可能不存在;只需要专注于单一的责任。
第二层;这些层现在不仅知道还有其他层,而且还知道它是一个链接列表。如果第二层和第三层相互独立,但仅仅依赖于1,又会怎样呢?失去了代表这一点的能力。最终,控制这些层的项不再能够以它想要的方式存储它们,导致它成为一个糟糕的设计,因为它正在朝着一个上帝对象工作。
https://stackoverflow.com/questions/49191461
复制相似问题