Caffe中的网络模型是利用文本protocol buffer(prototxt)语言定义的,学习好的模型会被序列化地存储在二进制protocol buffer(binaryproto).caffemodel文件中。使用这种方式的一个好处是可用多种语言实现高效的接口,尤其是C++和Python,这也使得Caffe模型有较好的灵活性与扩展性。另外,层和相应的参数都定义在caffe.proto文件中。
Net::Forward()和Net::Backward()方法实现网络的前传和后传;Layer::Foward()和Layer::Backward()计算每一层的前传后传。另外,每一层都有forward_{cpu,gpu}和backward_{cpu,gpu}方法来适应不同的计算模式,但是由于条件限制或者为了使用便利,一个层可能仅实现了CPU或GPU模式。
Solver作为一个优化器,在其优化一个模型时,首先通过调用前传来获得输出和损失,然后调用反传产生模型的梯度,将梯度与全职更新后相结合来最小化损失。Solver、网络和层之间的分工使得Caffe可以模块化并且开源。
Caffe模型的学习被分为两个部分:由Solver进行优化、更新参数;由Net计算出loss和gradient。Caffe支持的solvers包括:Stochastic Gradient Descent(SGD),AdaDelta,Adaptive Gradient(AdaGrad),Adam,Nesterov's Accelerated Gradient(Nesterov),RMSprop.