I created a "Python"
layer "myLayer"
in caffe, and use it in the net train_val.prototxt
I insert the layer like this:
layer {
name: "my_py_layer"
type: "Python"
bottom: "in"
top: "out"
python_param {
module: "my_module_name"
layer: "myLayer"
}
include { phase: TRAIN } # THIS IS THE TRICKY PART!
}
Now, my layer only participates in the TRAIN
ing phase of the net,
how can I know that in my layer's setup
function??
class myLayer(caffe.Layer):
def setup(self, bottom, top):
# I want to know here what is the phase?!!
...
PS,
I posted this question on "Caffe Users" google group as well. I'll udpdate if anything pops there.
As pointed out by galloguille, caffe is now exposing
phase
to the python layer class. This new feature makes this answer a bit redundant. Still it is useful to know about theparam_str
in caffe python layer for passing other parameters to the layer.Original answer:
AFAIK there is no trivial way of getting the phase. However, one can pass arbitrary parameters from the net prototxt to python. This can be done using the
param_str
parameters of thepython_param
.Here's how it's done:
In python, you get
param_str
in the layer'ssetup
function:This is a very good workaround, but if you are only interested in passing the
phase
as a parameter, now you can access the phase as an attribute of the layer. This feature was merged just 6 days ago https://github.com/BVLC/caffe/pull/3995.Specific commit: https://github.com/BVLC/caffe/commit/de8ac32a02f3e324b0495f1729bff2446d402c2c
With this new feature you just need to use the attribute
self.phase
. For example you can do the following: