我是Caffe的新手,现在我需要在卷积神经网络中修改ReLU图层中的阈值。我现在用来修改阈值的方法是编辑caffe/src/caffe/layers/relu_layer.cpp
中的C ++源代码,然后重新编译它。但是,每次调用ReLU时,这会将阈值更改为指定值。有没有办法在网络中的每个ReLU层中使用不同的值作为阈值?顺便说一句,我正在使用pycaffe接口,我找不到这样的方法。
最后,抱歉我的英语不好,如果有不清楚的地方,请告诉我,我会尽力详细描述。
答案 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
中编译pycaffe
和net.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"