loss_layer.cpp
来源:互联网 发布:javascript xml dom 编辑:程序博客网 时间:2024/05/22 00:07
loss_layer.cpp
#include <algorithm>#include <vector>#include "caffe/layers/loss_layer.hpp"namespace caffe {template <typename Dtype>void LossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // LossLayers have a non-zero (1) loss by default. if (this->layer_param_.loss_weight_size() == 0) { this->layer_param_.add_loss_weight(Dtype(1)); }}template <typename Dtype>void LossLayer<Dtype>::Reshape( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK_EQ(bottom[0]->shape(0), bottom[1]->shape(0)) << "The data and label should have the same first dimension."; vector<int> loss_shape(0); // Loss layers output a scalar; 0 axes. top[0]->Reshape(loss_shape);}template <typename Dtype>Dtype LossLayer<Dtype>::GetNormalizer( const LossParameter_NormalizationMode normalization_mode, const int outer_num, const int inner_num, const int valid_count) { Dtype normalizer; switch (normalization_mode) { case LossParameter_NormalizationMode_FULL: normalizer = Dtype(outer_num * inner_num); break; case LossParameter_NormalizationMode_VALID: if (valid_count == -1) { normalizer = Dtype(outer_num * inner_num); } else { normalizer = Dtype(valid_count); } break; case LossParameter_NormalizationMode_BATCH_SIZE: normalizer = Dtype(outer_num); break; case LossParameter_NormalizationMode_NONE: normalizer = Dtype(1); break; default: LOG(FATAL) << "Unknown normalization mode: " << LossParameter_NormalizationMode_Name(normalization_mode); } // Some users will have no labels for some examples in order to 'turn off' a // particular loss in a multi-task setup. The max prevents NaNs in that case. return std::max(Dtype(1.0), normalizer);}INSTANTIATE_CLASS(LossLayer);} // namespace caffe
loss_layer.hpp
#ifndef CAFFE_LOSS_LAYER_HPP_#define CAFFE_LOSS_LAYER_HPP_#include <vector>#include "caffe/blob.hpp"#include "caffe/layer.hpp"#include "caffe/proto/caffe.pb.h"namespace caffe {const float kLOG_THRESHOLD = 1e-20;/** * @brief An interface for Layer%s that take two Blob%s as input -- usually * (1) predictions and (2) ground-truth labels -- and output a * singleton Blob representing the loss. * * LossLayers are typically only capable of backpropagating to their first input * -- the predictions. */template <typename Dtype>class LossLayer : public Layer<Dtype> { public: explicit LossLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); /** * Read the normalization mode parameter and compute the normalizer based * on the blob size. If normalization_mode is VALID, the count of valid * outputs will be read from valid_count, unless it is -1 in which case * all outputs are assumed to be valid. */ Dtype GetNormalizer( const LossParameter_NormalizationMode normalization_mode, const int outer_num, const int inner_num, const int valid_count); virtual inline int ExactNumBottomBlobs() const { return 2; } /** * @brief For convenience and backwards compatibility, instruct the Net to * automatically allocate a single top Blob for LossLayers, into which * they output their singleton loss, (even if the user didn't specify * one in the prototxt, etc.). */ virtual inline bool AutoTopBlobs() const { return true; } virtual inline int ExactNumTopBlobs() const { return 1; } /** * We usually cannot backpropagate to the labels; ignore force_backward for * these inputs. */ virtual inline bool AllowForceBackward(const int bottom_index) const { return bottom_index != 1; }};} // namespace caffe#endif // CAFFE_LOSS_LAYER_HPP_
caffe.proto部分源码
// Message that stores parameters shared by loss layersmessage LossParameter { // If specified, ignore instances with the given label. optional int32 ignore_label = 1; // How to normalize the loss for loss layers that aggregate across batches, // spatial dimensions, or other dimensions. Currently only implemented in // SoftmaxWithLoss and SigmoidCrossEntropyLoss layers. enum NormalizationMode { // Divide by the number of examples in the batch times spatial dimensions. // Outputs that receive the ignore label will NOT be ignored in computing // the normalization factor. FULL = 0; // Divide by the total number of output locations that do not take the // ignore_label. If ignore_label is not set, this behaves like FULL. VALID = 1; // Divide by the batch size. BATCH_SIZE = 2; // Do not normalize the loss. NONE = 3; } // For historical reasons, the default normalization for // SigmoidCrossEntropyLoss is BATCH_SIZE and *not* VALID. optional NormalizationMode normalization = 3 [default = VALID]; // Deprecated. Ignored if normalization is specified. If normalization // is not specified, then setting this to false will be equivalent to // normalization = BATCH_SIZE to be consistent with previous behavior. optional bool normalize = 2;}
阅读全文
0 0
- loss_layer.cpp
- caffe源码阅读9-loss_layer.hpp+各cpp
- cpp
- CPP
- CPP
- cpp
- cpp
- CPP
- CPP
- ClientSockThread.cpp&&ClientUrlThread.cpp
- cpp调用其他cpp
- ex34a.cpp&&ex34aDoc.cpp&&ex34aView.cpp
- MainFrm.cpp&&ServerThread.cpp&&SheetConfig.cpp
- CPP thread
- cpp->html
- CFaderWnd.cpp
- PasswordReminder.cpp
- object.cpp
- IDEA MAVEN 容易出现的错误
- Linux下不重启永久修改hostname
- 可扩展标记语言XML()
- Linux oracle sqlplus环境里使用上下左右箭头和删除键---oracle
- 道路分组
- loss_layer.cpp
- 测试开发-iOS测试之移动端测试用例设计总结
- ES6-正则的扩展-Unicode 属性类
- c3p0详细配置
- 如何使用UDP协议给飞秋发送消息
- caffe代码学习方法
- C#学习笔记:文件操作
- Javassist基础与实践
- JUnit4第一章