在Caffe框架中修改ReLU中的阈值

时间:2016-11-12 11:50:29

标签: neural-network deep-learning caffe pycaffe

我是Caffe的新手,现在我需要在卷积神经网络中修改ReLU图层中的阈值。我现在用来修改阈值的方法是编辑caffe/src/caffe/layers/relu_layer.cpp中的C ++源代码,然后重新编译它。但是,每次调用ReLU时,这会将阈值更改为指定值。有没有办法在网络中的每个ReLU层中使用不同的值作为阈值?顺便说一句,我正在使用pycaffe接口,我找不到这样的方法。

最后,抱歉我的英语不好,如果有不清楚的地方,请告诉我,我会尽力详细描述。

2 个答案:

答案 0 :(得分:3)

是的,你可以。在src/caffe/proto中添加一行:

message ReLUParameter {
  ...
  optional float threshold = 3 [default = 0]; #add this line
  ... 
}

并在src/caffe/layers/relu_layer.cpp中进行一些小修改:

template <typename Dtype>
void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
    const vector<Blob<Dtype>*>& top) {
  ...
  Dtype threshold = this->layer_param_.relu_param().threshold(); //add this line
  for (int i = 0; i < count; ++i) {
    top_data[i] = (bottom_data[i] > threshold) ? (bottom_data[i] - threshold) : 
                  (negative_slope * (bottom_data[i] - threshold));
  }
}

template <typename Dtype>
void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
    const vector<bool>& propagate_down,
    const vector<Blob<Dtype>*>& bottom) {
  if (propagate_down[0]) {
    ...
    Dtype threshold = this->layer_param_.relu_param().threshold(); //this line
    for (int i = 0; i < count; ++i) {
      bottom_diff[i] = top_diff[i] * ((bottom_data[i] > threshold)
          + negative_slope * (bottom_data[i] <= threshold));
    }
  }
}

同样在src/caffe/layers/relu_layer.cu中代码应该像this

在您的caffe中编译pycaffenet.prototxt后,您可以编写relu图层,如:

layer {
  name: "threshold_relu"
  type: "ReLU"
  relu_param: {threshold: 1 #e.g. you want this relu layer to have a threshold 1}
  bottom: "input"
  top: "output"
}

答案 1 :(得分:3)

如果我理解你的“ReLU with threshold”基本上是

f(x) = x-threshold if x>threshold, 0 otherwise

您可以通过添加"Bias"图层轻松实现它,该图层会在常规threshold图层之前从输入中减去"ReLU"