我需要使用caffe框架做一件相当简单的事情。我想创建一个新的自定义c ++欧几里得层。当该层的相应值低于特定值时,应将bottom [1] BLOB(地面真实数据)的所有值设置为bottom [0] BLOB的相应值。然后,将在此修改的bottom [1]和bottom [0]之间计算L2损耗。同样,backward_cpu()也需要修改。
这可以通过在Matlab / Python中找到低于此阈值的bottom [0]索引来轻松完成。但是如何使用caffe框架的BLOB在c ++中高效地对此进行编码,这超出了我的能力,尤其是因为我还将需要GPU实现。我可以顺序地遍历BLOB的所有元素,但是那样效率很低。我可以将BLOB数据转换为vector <>,它可以在c ++下更有效地处理吗?
例如,关于cpu_forward代码:
//client.test.js
describe('contentful client', () => {
let contentful;
let initializeClient;
beforeEach(() => {
jest.mock('contentful');
contentful = require('contentful');
initializeClient = require('./client').default;
});
it('should initialize the contentful client with the correct params', async () => {
initializeClient();
expect(contentful.createClient).toHaveBeenCalledWith({
space: 'w20789877',
accessToken: '883829200101001047474747737'
});
});
});
不幸的是,我不太了解以下几行如何计算欧几里得成本S = ∑i =(yi-h(xi))^ 2以便更改代码:
template <typename Dtype>
void EuclideanLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {
int count = bottom[0]->count();
threshold = 60;
caffe_sub(
count,
bottom[0]->cpu_data(),
bottom[1]->cpu_data(),
diff_.mutable_cpu_data());
float* data = blob->mutable_cpu_data();
for (int i =0; i < count; i++) {
if data[1][i] < threshold {
data[1][i] = data[0][i];
}
}
Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data());
Dtype loss = dot / bottom[0]->num() / Dtype(2);
top[0]->mutable_cpu_data()[0] = loss;
}
我希望现在在更改的bottom [1]和bottom [0]之间计算点积。有什么建议吗?