caffe中最重要的两个部分就是forward和backward的过程,farward是根据输入数据正向预测输入属于哪一类;backward是根据输出的结果求得代价函数,然后根据代价函数反向求去其相对于各层网络参数的梯度的过程。我们先对farward过程做一下总结。
caffe中有两个过程会设计到farward,test和train,这里我们以train训练过程为例。
- int train() caffe.cpp Line 154:
这是train的入口函数,train函数里的操作这里我们掠过,我们主要进入训练的主体函数solver->Solve()函数(Line 220)。void Solver<Dtype>::Solve()函数是训练网络的入口函数,而我们的训练的主体函数就是在Line 293的Step()函数。 - 训练主体函数void Solver<Dtype>::Step():
进入这个函数之后,我们首先就要进行迭代的循环,以lenet网络训练为例,由于lenet是采用stochastic的训练方式,所以就必须进行多次迭代,当然每次迭代循环又会采用多个样本(batch)进行训练。在循环体内,程序就回进入forward过程了。程序如下:for (int i = 0; i < param_.iter_size(); ++i) { // iter_size=1 indicate update parameters for every sample loss += net_->ForwardBackward(); // forward and backward process } loss /= param_.iter_