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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值