前言:该篇文章不定时更新,当有心得体会,讲及时更新,多是细节以及我不明白的部分的讲解。
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());
}
}