gpt4 book ai didi

machine-learning - 当有多个分支时,caffe如何计算梯度?

转载 作者:行者123 更新时间:2023-11-30 09:16:18 25 4
gpt4 key购买 nike

我现在正在阅读 Caffe 源代码,我突然想到了这个问题。

caffe/relu_layer.cpp为例。计算梯度时,由

void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down,
const vector<Blob<Dtype>*>& bottom) {
if (propagate_down[0]) {
const Dtype* bottom_data = bottom[0]->cpu_data();
const Dtype* top_diff = top[0]->cpu_diff();
Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
const int count = bottom[0]->count();
Dtype negative_slope = this->layer_param_.relu_param().negative_slope();
for (int i = 0; i < count; ++i) {
bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0)
+ negative_slope * (bottom_data[i] <= 0));
}
}
}

我们可以看到bottom_diff最后被赋值了一个值,表明该值是对应底部blob的梯度。

但是,当多个层将一个 blob 作为输入时,例如,在一个 blob 上堆叠多个 ReLU 层,Caffe 如何处理梯度计算?第一个 ReLU 层修改 bottom_diff,第二个 ReLU 层似乎只是覆盖它,而不是添加两个梯度。

我没有看到任何地方执行梯度求和,我很困惑。如果我错过了一些重要的事情,请告诉我,非常感谢。

最佳答案

当顶部 Blob 用于多个底部时,Caffe 会自动插入分割层。这是在 Net<Dtype>::Init(...) 内完成的调用InsertSplits(...)来自caffe/utils/insert_splits.cpp .

示例:

原网在NetParameter protobuf对象(这里的节点是层):

data ---> conv1 -> conv2 -> ...
\-> somelayer -> ...

Net Layer Net::Init() 之后内存中的 s :

data -> split ---> conv1 -> conv2 -> ...
\-> somelayer -> ...

(顺便说一下,一个有趣的细节:激活中的 .diffBlobs 分配给 Backward() ,而层可学习参数中的 .diffBackward() 添加。)

关于machine-learning - 当有多个分支时,caffe如何计算梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55247054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com