caffe源码——Euclidean Loss是怎么实现的
来源:互联网 发布:linux proc 编辑:程序博客网 时间:2024/06/14 10:00
引用:
http://blog.csdn.net/fangjin_kl/article/details/54131144
损失函数:
对的偏导:
对的偏导:-
forward_cpu:
template <typename Dtype>void EuclideanLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { int count = bottom[0]->count(); caffe_sub( count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), diff_.mutable_cpu_data());//diff_ = bottom[0] - bottom[1] Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data()); // dot = ||diff_||^2 Dtype loss = dot / bottom[0]->num() / Dtype(2);//输出的loss top[0]->mutable_cpu_data()[0] = loss;}
backward_cpu:
template <typename Dtype>void EuclideanLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { for (int i = 0; i < 2; ++i) { if (propagate_down[i]) {//对于输入的label bottom propagate_dowm 为0 const Dtype sign = (i == 0) ? 1 : -1;//由于diff_ = bottom[0] - bottom[1] const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num(); caffe_cpu_axpby( bottom[i]->count(), // count alpha, // alpha diff_.cpu_data(), // a Dtype(0), // beta bottom[i]->mutable_cpu_diff()); // b }//bottom[i]->mutable_cpu_diff()) = alpha*diff_.cpu_data() }}forward_cpu里就是按照损失函数的样式计算损失,并且将损失保存到top[0]->cpu_data()[0]中。其中有用的是计算得到的diff_->cpu_data()。
backward_cpu里的两个for循环就是就是分别计算对的偏导和对对的偏导,其中sign是正负号,用于控制是对还是对求偏导,而top[0]->cpu_diff()[0]是在网络的定义中(即prototxt文件中),loss层的定义中设置的loss_weight:1.0,即top[0]->cpu_diff()[0]=1.0,则alpha就是1/n或者-1/n,而diff_.cpu_data()=-,caffe_cpu_axpby()得到了1*(-)/n即对的偏导,和-1*(-)/n即对的偏导,并把结果存到bottom[i]->cpu_diff()中,用以传向前面的层。
http://blog.csdn.net/seashell_9/article/details/68064294
0 0
- caffe源码——Euclidean Loss是怎么实现的
- caffe euclidean loss ignore label
- Caffe解惑:Caffe中是如何控制loss的
- 详解softmax与softmax loss的前后向推导及caffe源码实现
- Caffe入门(5)——Loss
- caffe的matlab接口实现绘画accuracy和loSS
- Caffe中增加新的layer以及Caffe中triplet loss layer的实现
- 如何在caffe中增加layer以及caffe中triplet loss layer的实现
- 如何在caffe中增加layer以及caffe中triplet loss layer的实现
- 如何在caffe中增加layer以及caffe中triplet loss layer的实现
- 如何在caffe中增加layer以及caffe中triplet loss layer的实现
- ubuntu下caffe清理空间&caffe在训练的时候loss不继续下降了应该怎么做
- Caffe——绘制loss和accuracy曲线
- caffe loss
- caffe loss
- caffe loss
- Caffe loss
- Handle通信具体到源码,是怎么实现的
- Navicat premium将oracle数据表迁移至mysql
- ES6
- Activity和Fragment相互通信或者改变UI
- haproxy监控页面添加及参数简介
- linux centos 7开启特定端口防火墙
- caffe源码——Euclidean Loss是怎么实现的
- 软件设计师考试笔记:UML统一建模语言
- Java生成二维码(zxing方式)
- ES6 -- Proxy搭档:Reflect
- Spark学习—RDD编程
- Redis 更新缓存问题解决
- java学习笔记---Socket应用网络通信
- __attribute__((mode(TI))) (128位)
- 配置方法数超过 64K 的应用