关于Dropout caffe是怎么样实现了

caffe 在dropout是怎么实现随机,我只看到rand_vec_.Reshape(bottom[0]->num(), bottom[0]->channels(),
      bottom[0]->height(), bottom[0]->width());随机生成的实现是在哪里。
已邀请:

李扬 - 密码六个一

赞同来自: uestc_yang xinmiao 孙琳钧 kfsshalu

补充一下 dropout  GPU 实现里的随机。GPU 随机的实现和 CPU 随机的实现有些不同。
在 CPU 实现里通过 `caffe_rng_bernoulli(count, 1. - threshold_, mask)` 生成 0, 1 随机数,并放到 mask 里。
 
而在 GPU 实现里,首先丢弃概率 `0.5` 通过
 // dropout_layer.cpp
uint_thres_ = static_cast<unsigned int>(UINT_MAX * threshold_)

被转化成了一个非常大的数,具体等于 0.5 * UINT_MAX,(UINT_MAX = INT_MAX * 2 + 1)。

然后下面的代码
// dropout_layer.cu
unsigned int* mask =
static_cast<unsigned int*>(rand_vec_.mutable_gpu_data());
caffe_gpu_rng_uniform(count, mask);
用均匀分布,生成了一些非常大的数放在 mask 里,取值范围应界于[0, UINT_MAX]。
然后在 DropoutForward() 这个函数中,再将 mask 中的数与 uint_thres_进行比较,来生成真正的 0,1 掩码,如下:
// uint_thres_ 就是 threshold
CUDA_KERNEL_LOOP(index, n) {
out[index] = in[index] * (mask[index] > threshold) * scale;

shuokay

赞同来自: uestc_yang xjtuljy

template <typename Dtype>
void DropoutLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {
const Dtype* bottom_data = bottom[0]->cpu_data();
Dtype* top_data = top[0]->mutable_cpu_data();
unsigned int* mask = rand_vec_.mutable_cpu_data();
const int count = bottom[0]->count();
if (this->phase_ == TRAIN) {
// Create random numbers
caffe_rng_bernoulli(count, 1. - threshold_, mask);
for (int i = 0; i < count; ++i) {
top_data[i] = bottom_data[i] * mask[i] * scale_;
}
} else {
caffe_copy(bottom[0]->count(), bottom_data, top_data);
}
}


caffe_rng_bernoulli(count, 1. - threshold_, mask);

要回复问题请先登录注册