gpt4 book ai didi

machine-learning - 如何在Caffe中循环Blob变量的所有元素?

转载 作者:行者123 更新时间:2023-11-30 09:10:55 27 4
gpt4 key购买 nike

在 Caffe 中开发新的损失层,

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

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

enter image description here

并将结果赋值给该层bottom[0]->mutable_cpu_diff()中的相应元素。

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

enter image description here

但如您所知,这些变量是 4 维数组,我不清楚如何做到这一点。

我应该使用 Offset() 函数或类似的函数来循环这些变量的所有元素,类似于 this

有人可以向我解释一下或向我推荐有用的引用资料吗?

谢谢

最佳答案

首先,您应该将第二项的结果 (1/N^2\sum_i D_i) 存储到局部变量中。正如你already know ,这个总和可以使用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.

关于machine-learning - 如何在Caffe中循环Blob变量的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38718331/

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