您的位置:首页 > Web前端

caffe 源码的解读(2)lossFunction

2017-02-27 10:38 246 查看
我们在loss层经常看到的函数:

caffe_cpu_axpby(const int N,
const float alpha, const float* X,
const folat beta,  float* Y)
//这个函数在caffe的util下面的match-functions.cpp里面
//Y=alpha * X +beta*Y
//也就是blob里面的data部分减去diff部分

/* example of caffe_cpu_axpby */
68     ┊   caffe_cpu_axpby(
69     ┊   ┊ channels,
70     ┊   ┊ alpha,
71     ┊   ┊ diff_.cpu_data(),
72     ┊   ┊ Dtype(1.0),
73     ┊   ┊ bout + (j*channels));
Dtype* bout = bottom[0]->mutable_cpu_diff();


在caffe实现新增加一个loss层的时候,往往会用到caffe_cpu_scale()函数来缩放一个向量。

这其中有个问题需要注意:假设我想将向量 X 的所有元素乘以-1。结果存放到 Y 中。调用方式:

【X】caffe_cpu_scale(channels,-1,X.cpu_data(),Y.mutable_cpu_data());

【X】caffe_cpu_scale(channels,-1.0,X.cpu_data(),Y.mutable_cpu_data());

【V】caffe_cpu_scale(channels,Dtype(-1.0),X.cpu_data(),Y.mutable_cpu_data());

channels 代表X向量的长度。这种写法时错误的。因为这时候编译器认为-1是int型。我们知道caffe的Dtype实际上只支持两种类型(float,double)。当写-1.0的时候编译器认为时double型。这都是错误的。因为没有编译之前,不可以确定类型。这也是为什么我们看到caffe对参数的初始化的方式都是Dtype(number)的写法。

caffe中自己添加一个新的loss层,编译的时候出现:“Class×× is not a template type”

首先查看自己编写的类模板是不是有问题,我的代码是照着别的loss层写的。自己检查了一遍,没有问题。然后还是编译不通过。

然后尝试着屏蔽代码,最后屏蔽的只剩下一行,还是有问题!!

最后发现:是我定义的层的类名,与caffe.proto中定义的message同名了。改掉好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: