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