caffe 源码的解读(2)lossFunction

我们在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同名了。改掉好了。

你可能感兴趣的:(caffe)