caffe定制欧几里得层

时间:2018-07-03 20:25:14

标签: c++ machine-learning deep-learning caffe euclidean-distance

我需要使用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]之间计算点积。有什么建议吗?

0 个答案:

没有答案