const float kLOG_THRESHOLD = 1e-20;
+/* AccuracyLayer
+ Note: not an actual loss layer! Does not implement backwards step.
+ Computes the accuracy of argmax(a) with respect to b.
+*/
+template <typename Dtype>
+class AccuracyLayer : public Layer<Dtype> {
+ public:
+ explicit AccuracyLayer(const LayerParameter& param)
+ : Layer<Dtype>(param) {}
+ virtual void SetUp(const vector<Blob<Dtype>*>& bottom,
+ vector<Blob<Dtype>*>* top);
+
+ virtual inline LayerParameter_LayerType type() const {
+ return LayerParameter_LayerType_ACCURACY;
+ }
+
+ virtual inline int ExactNumBottomBlobs() const { return 2; }
+ virtual inline int ExactNumTopBlobs() const { return 1; }
+
+ protected:
+ virtual Dtype Forward_cpu(const vector<Blob<Dtype>*>& bottom,
+ vector<Blob<Dtype>*>* top);
+ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
+ const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {
+ NOT_IMPLEMENTED;
+ }
+
+ int top_k_;
+};
+
/* LossLayer
Takes two inputs of same num (a and b), and has no output.
The gradient is propagated to a.
}
};
-// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer.
-template <typename Dtype> class SoftmaxLayer;
-
-/* SoftmaxWithLossLayer
- Implements softmax and computes the loss.
-
- It is preferred over separate softmax + multinomiallogisticloss
- layers due to more numerically stable gradients.
+/* EuclideanLossLayer
+ Compute the L_2 distance between the two inputs.
- In test, this layer could be replaced by simple softmax layer.
+ loss = (1/2 \sum_i (a_i - b_i)^2)
+ a' = 1/I (a - b)
*/
template <typename Dtype>
-class SoftmaxWithLossLayer : public Layer<Dtype> {
+class EuclideanLossLayer : public LossLayer<Dtype> {
public:
- explicit SoftmaxWithLossLayer(const LayerParameter& param)
- : Layer<Dtype>(param), softmax_layer_(new SoftmaxLayer<Dtype>(param)) {}
- virtual void SetUp(const vector<Blob<Dtype>*>& bottom,
+ explicit EuclideanLossLayer(const LayerParameter& param)
+ : LossLayer<Dtype>(param), diff_() {}
+ virtual void FurtherSetUp(const vector<Blob<Dtype>*>& bottom,
vector<Blob<Dtype>*>* top);
virtual inline LayerParameter_LayerType type() const {
- return LayerParameter_LayerType_SOFTMAX_LOSS;
+ return LayerParameter_LayerType_EUCLIDEAN_LOSS;
}
- virtual inline int MaxTopBlobs() const { return 2; }
- // We cannot backpropagate to the labels; ignore force_backward for these
- // inputs.
+ // Unlike most loss layers, in the EuclideanLossLayer we can backpropagate
+ // to both inputs.
virtual inline bool AllowForceBackward(const int bottom_index) const {
- return bottom_index != 1;
- }
-
- protected:
- virtual Dtype Forward_cpu(const vector<Blob<Dtype>*>& bottom,
- vector<Blob<Dtype>*>* top);
- virtual Dtype Forward_gpu(const vector<Blob<Dtype>*>& bottom,
- vector<Blob<Dtype>*>* top);
- virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
- const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
- virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
- const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
-
- shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_;
- // prob stores the output probability of the layer.
- Blob<Dtype> prob_;
- // Vector holders to call the underlying softmax layer forward and backward.
- vector<Blob<Dtype>*> softmax_bottom_vec_;
- vector<Blob<Dtype>*> softmax_top_vec_;
-};
-
-/* SigmoidCrossEntropyLossLayer
-*/
-template <typename Dtype>
-class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> {
- public:
- explicit SigmoidCrossEntropyLossLayer(const LayerParameter& param)
- : LossLayer<Dtype>(param),
- sigmoid_layer_(new SigmoidLayer<Dtype>(param)),
- sigmoid_output_(new Blob<Dtype>()) {}
- virtual void FurtherSetUp(const vector<Blob<Dtype>*>& bottom,
- vector<Blob<Dtype>*>* top);
-
- virtual inline LayerParameter_LayerType type() const {
- return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS;
+ return true;
}
protected:
virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
- shared_ptr<SigmoidLayer<Dtype> > sigmoid_layer_;
- // sigmoid_output stores the output of the sigmoid layer.
- shared_ptr<Blob<Dtype> > sigmoid_output_;
- // Vector holders to call the underlying sigmoid layer forward and backward.
- vector<Blob<Dtype>*> sigmoid_bottom_vec_;
- vector<Blob<Dtype>*> sigmoid_top_vec_;
+ Blob<Dtype> diff_;
};
-/* EuclideanLossLayer
- Compute the L_2 distance between the two inputs.
-
- loss = (1/2 \sum_i (a_i - b_i)^2)
- a' = 1/I (a - b)
+/* HingeLossLayer
*/
template <typename Dtype>
-class EuclideanLossLayer : public LossLayer<Dtype> {
+class HingeLossLayer : public LossLayer<Dtype> {
public:
- explicit EuclideanLossLayer(const LayerParameter& param)
- : LossLayer<Dtype>(param), diff_() {}
- virtual void FurtherSetUp(const vector<Blob<Dtype>*>& bottom,
- vector<Blob<Dtype>*>* top);
+ explicit HingeLossLayer(const LayerParameter& param)
+ : LossLayer<Dtype>(param) {}
virtual inline LayerParameter_LayerType type() const {
- return LayerParameter_LayerType_EUCLIDEAN_LOSS;
- }
- // Unlike most loss layers, in the EuclideanLossLayer we can backpropagate
- // to both inputs.
- virtual inline bool AllowForceBackward(const int bottom_index) const {
- return true;
+ return LayerParameter_LayerType_HINGE_LOSS;
}
protected:
virtual Dtype Forward_cpu(const vector<Blob<Dtype>*>& bottom,
vector<Blob<Dtype>*>* top);
- virtual Dtype Forward_gpu(const vector<Blob<Dtype>*>& bottom,
- vector<Blob<Dtype>*>* top);
virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
- virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
- const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
-
- Blob<Dtype> diff_;
};
/* InfogainLossLayer
Blob<Dtype> infogain_;
};
-/* HingeLossLayer
+/* MultinomialLogisticLossLayer
*/
template <typename Dtype>
-class HingeLossLayer : public LossLayer<Dtype> {
+class MultinomialLogisticLossLayer : public LossLayer<Dtype> {
public:
- explicit HingeLossLayer(const LayerParameter& param)
+ explicit MultinomialLogisticLossLayer(const LayerParameter& param)
: LossLayer<Dtype>(param) {}
+ virtual void FurtherSetUp(const vector<Blob<Dtype>*>& bottom,
+ vector<Blob<Dtype>*>* top);
virtual inline LayerParameter_LayerType type() const {
- return LayerParameter_LayerType_HINGE_LOSS;
+ return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS;
}
protected:
const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
};
-/* MultinomialLogisticLossLayer
+/* SigmoidCrossEntropyLossLayer
*/
template <typename Dtype>
-class MultinomialLogisticLossLayer : public LossLayer<Dtype> {
+class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> {
public:
- explicit MultinomialLogisticLossLayer(const LayerParameter& param)
- : LossLayer<Dtype>(param) {}
+ explicit SigmoidCrossEntropyLossLayer(const LayerParameter& param)
+ : LossLayer<Dtype>(param),
+ sigmoid_layer_(new SigmoidLayer<Dtype>(param)),
+ sigmoid_output_(new Blob<Dtype>()) {}
virtual void FurtherSetUp(const vector<Blob<Dtype>*>& bottom,
vector<Blob<Dtype>*>* top);
virtual inline LayerParameter_LayerType type() const {
- return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS;
+ return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS;
}
protected:
virtual Dtype Forward_cpu(const vector<Blob<Dtype>*>& bottom,
vector<Blob<Dtype>*>* top);
+ virtual Dtype Forward_gpu(const vector<Blob<Dtype>*>& bottom,
+ vector<Blob<Dtype>*>* top);
virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
+ virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
+ const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
+
+ shared_ptr<SigmoidLayer<Dtype> > sigmoid_layer_;
+ // sigmoid_output stores the output of the sigmoid layer.
+ shared_ptr<Blob<Dtype> > sigmoid_output_;
+ // Vector holders to call the underlying sigmoid layer forward and backward.
+ vector<Blob<Dtype>*> sigmoid_bottom_vec_;
+ vector<Blob<Dtype>*> sigmoid_top_vec_;
};
-/* AccuracyLayer
- Note: not an actual loss layer! Does not implement backwards step.
- Computes the accuracy of argmax(a) with respect to b.
+// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer.
+template <typename Dtype> class SoftmaxLayer;
+
+/* SoftmaxWithLossLayer
+ Implements softmax and computes the loss.
+
+ It is preferred over separate softmax + multinomiallogisticloss
+ layers due to more numerically stable gradients.
+
+ In test, this layer could be replaced by simple softmax layer.
*/
template <typename Dtype>
-class AccuracyLayer : public Layer<Dtype> {
+class SoftmaxWithLossLayer : public Layer<Dtype> {
public:
- explicit AccuracyLayer(const LayerParameter& param)
- : Layer<Dtype>(param) {}
+ explicit SoftmaxWithLossLayer(const LayerParameter& param)
+ : Layer<Dtype>(param), softmax_layer_(new SoftmaxLayer<Dtype>(param)) {}
virtual void SetUp(const vector<Blob<Dtype>*>& bottom,
vector<Blob<Dtype>*>* top);
virtual inline LayerParameter_LayerType type() const {
- return LayerParameter_LayerType_ACCURACY;
+ return LayerParameter_LayerType_SOFTMAX_LOSS;
+ }
+ virtual inline int MaxTopBlobs() const { return 2; }
+ // We cannot backpropagate to the labels; ignore force_backward for these
+ // inputs.
+ virtual inline bool AllowForceBackward(const int bottom_index) const {
+ return bottom_index != 1;
}
-
- virtual inline int ExactNumBottomBlobs() const { return 2; }
- virtual inline int ExactNumTopBlobs() const { return 1; }
protected:
virtual Dtype Forward_cpu(const vector<Blob<Dtype>*>& bottom,
vector<Blob<Dtype>*>* top);
+ virtual Dtype Forward_gpu(const vector<Blob<Dtype>*>& bottom,
+ vector<Blob<Dtype>*>* top);
virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
- const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {
- NOT_IMPLEMENTED;
- }
+ const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
+ virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
+ const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom);
- int top_k_;
+ shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_;
+ // prob stores the output probability of the layer.
+ Blob<Dtype> prob_;
+ // Vector holders to call the underlying softmax layer forward and backward.
+ vector<Blob<Dtype>*> softmax_bottom_vec_;
+ vector<Blob<Dtype>*> softmax_top_vec_;
};
} // namespace caffe