如何遍历 Caffe 中 Blob 变量的所有元素?

How to loop over all the elements of a Blob variable in Caffe?

在 Caffe 中处理新的损失层,

我在 diff_.cpu_data() 中有一些值,让我们将其中的每个元素命名为 Di :

现在,我想为每个 Di 计算此函数:

并将结果赋给图层bottom[0]->mutable_cpu_diff()中对应的元素

如您所见,对于第二项,无需循环输入和输出变量(diff_.cpu_data & bottom[0]->mutable_cpu_diff()),而在第一项中,我需要访问输入变量中每个元素的值,那么我当然需要将函数的结果分配给输出变量的相应元素,如果它们是二维数组,显然我可以这样做:

但是如您所知,这些变量是 4 维数组,我不清楚如何操作。

我应该使用 Offset() 函数或类似的函数来遍历类似于 this 的那些变量的所有元素吗?

有人可以向我解释一下或者给我一个有用的参考吗?

谢谢,

首先,您应该将第二项的结果 (1/N^2 \sum_i D_i) 存储到局部变量中。正如您 ,可以使用 caffe_cpu_dot.

计算此总和

因此您的代码可能类似于:

vector<Dtype> mult_data( diff_.count(), Dtype(1) );
const Dtype* Di = diff_.cpu_data();
Dtype const_sum = caffe_cpu_dot( diff_.count(), &mult_data[0], Di );
Dtype N = diff_.count();
const_sum /= N*N; // divide by N^2

现在您可以遍历所有项目(假设 bottom[0]->count()==diff_.count()):

Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
for (int i=0; i<diff_.count(); i++) {
  bottom_diff[i] = 2*Di[i]/N - const_sum;
}

或者,如果您想要更多类似 "blas" 的内容:

caffe_copy(diff_.count(), Di, bottom_diff);  // copy Di to bottom_diff
caffe_scal(diff_.count(), Dtype(2.0/N), bottom_diff);  // bottom_diff is now (2/N)*Di
caffe_add_scalar(diff_.count(), -const_sum, bottom_diff);  // subtract the second term from all the elements.