caffe源码之心得

来源:互联网 发布:正在设置您的mac要多久 编辑:程序博客网 时间:2024/06/03 16:44

前言:该篇文章不定时更新,当有心得体会,讲及时更新,多是细节以及我不明白的部分的讲解。


batchsize及Iter_size理解

caffe训练的时候存在batchsize,例如batichsize=32,计算最终的loss是讲32个输入的loss取平均,得到最终的loss,再用该loss进行反向传播。该部分的代码在softmax_loss_layer.cpp

for (int i = 0; i < outer_num_; ++i) {for (int j = 0; j < inner_num_; j++) {  const int label_value = static_cast<int>(label[i * inner_num_ + j]);  if (has_ignore_label_ && label_value == ignore_label_) {    continue;  }  DCHECK_GE(label_value, 0);  DCHECK_LT(label_value, prob_.shape(softmax_axis_));  loss -= log(std::max(prob_data[i * dim + label_value * inner_num_ + j],                       Dtype(FLT_MIN)));  ++count;}  }  if (normalize_) {top[0]->mutable_cpu_data()[0] = loss / count;  } else {top[0]->mutable_cpu_data()[0] = loss / outer_num_;  }

caffe的solver文件中存在iter_size参数,在caffe的Solver.cpp源码中可以轻易得到,iter_size是不断的运行

for (int i = 0; i < param_.iter_size(); ++i) {  loss += net_->ForwardBackward(bottom_vec);}

多次运行上述的代码,多次进行网络的反向传播和正向传播,将loss求和,取平均loss /= param_.iter_size(),再用此loss反向传播调节参数。因此loss经过了两次平均,第一次是batchsize时平均,第二次是iter_size时的平均。
iter_size相当于拓展了batchsize,若iter_size=2,则总的batchsize=32*2=64。

batchsize与epoch

batchsize是指:每次训练的图片数量。epoch:指训练完一轮所有的数据。
在caffe中,batchsize与epoch如何操作?
实际上,一次epoch指读取完txt文件。当读完全部文件,则重新开始下一轮的epoch。如果batchsize与epoch不是整数倍的关系,则在epoch完成时,batchsize仍有剩余数据未进入网络,下一轮的epoch的部分数据当做batchsize一部分。
下一轮的epoch开始时,若有shuttle,整个数据会重新随机排列。

layer->lines_id_++;if (layer->lines_id_ >= chunks_size) {  // We have reached the end. Restart from the first.  DLOG(INFO) << "Restarting data prefetching from start.";  layer->lines_id_ = 0;  if (layer->layer_param_.image_data_param().shuffle()){      std::random_shuffle(layer->shuffle_index_.begin(), layer->shuffle_index_.end());  }}
原创粉丝点击