如何遍历 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.
在 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.