caffe源码之心得

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

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());
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值