Cheat sheet for caffe / pycaffe?

mcExchange picture mcExchange · Sep 3, 2015 · Viewed 26.3k times · Source

Does anyone know whether there is a cheat sheet for all important pycaffe commands? I was so far using caffe only via Matlab interface and terminal + bash scripts.

I wanted to shift towards using ipython and work through the ipython notebook examples. However I find it hard to get an overview of all the functions that are inside the caffe module for python. (I'm also quite new to python).

Answer

Flavio Ferrara picture Flavio Ferrara · Sep 10, 2015

The pycaffe tests and this file are the main gateway to the python coding interface.

First of all, you would like to choose whether to use Caffe with CPU or GPU. It is sufficient to call caffe.set_mode_cpu() or caffe.set_mode_gpu(), respectively.

Net

The main class that the pycaffe interface exposes is the Net. It has two constructors:

net = caffe.Net('/path/prototxt/descriptor/file', caffe.TRAIN)

which simply create a Net (in this case using the Data Layer specified for training), or

net = caffe.Net('/path/prototxt/descriptor/file', '/path/caffemodel/weights/file', caffe.TEST)

which creates a Net and automatically loads the weights as saved in the provided caffemodel file - in this case using the Data Layer specified for testing.

A Net object has several attributes and methods. They can be found here. I will cite just the ones I use more often.

You can access the network blobs by means of Net.blobs. E.g.

data = net.blobs['data'].data
net.blobs['data'].data[...] = my_image
fc7_activations = net.blobs['fc7'].data

You can access the parameters (weights) too, in a similar way. E.g.

nice_edge_detectors = net.params['conv1'].data
higher_level_filter = net.params['fc7'].data

Ok, now it's time to actually feed the net with some data. So, you will use backward() and forward() methods. So, if you want to classify a single image

net.blobs['data'].data[...] = my_image
net.forward() # equivalent to net.forward_all()
softmax_probabilities = net.blobs['prob'].data

The backward() method is equivalent, if one is interested in computing gradients.

You can save the net weights to subsequently reuse them. It's just a matter of

 net.save('/path/to/new/caffemodel/file')

Solver

The other core component exposed by pycaffe is the Solver. There are several types of solver, but I'm going to use only SGDSolver for the sake of clarity. It is needed in order to train a caffe model. You can instantiate the solver with

solver = caffe.SGDSolver('/path/to/solver/prototxt/file')

The Solver will encapsulate the network you are training and, if present, the network used for testing. Note that they are usually the same network, only with a different Data Layer. The networks are accessible with

 training_net = solver.net
 test_net = solver.test_nets[0] # more than one test net is supported

Then, you can perform a solver iteration, that is, a forward/backward pass with weight update, typing just

 solver.step(1)

or run the solver until the last iteration, with

 solver.solve()

Other features

Note that pycaffe allows you to do more stuff, such as specifying the network architecture through a Python class or creating a new Layer type. These features are less often used, but they are pretty easy to understand by reading the test cases.