进行数据混合
- 做数据混合的前提是(!crossvalidate && randomize)
```C++
const std::vector<int32>& mask = randomizer_mask.Generate(feature_randomizer.NumFrames());
a.声明randomizer_mask对象
NnetRandomizerOptions rnd_opts;
NnetRandomizerOptions为struct且其中有三个成员变量:randomizer_size规定randomizer存的帧数;
randomizer_seed为随机数种子;minibatch_size为一次nnet前向的输入帧数
RandomizerMask randomizer_mask(rnd_opts);
定义:
RandomizerMask( const NnetDataRandomizerOptions &conf) { Init(conf); }
void Init(const NnetDataRandomizerOptions& conf) { srand(conf.randomizer_seed); }
这一步init用随机种子触发随机数发生器,为random_shuffle准备。
b.产生mask序列
const std::vector<int32>& RandomizerMask::Generate(int32 mask_size) {
mask_.resize(mask_size);
for (int32 i=0; i<mask_size; i++) mask_[i]=i;
std::random_shuffle(mask_.begin(), mask_.end()); //with built-in random generator
return mask_;
}
调用标准库的random_shuffle生成随机序列。
```
- 随机化(Randomize()函数)
将数序输入放入data_aux_中;将mask拷贝到CuArray<int32>中;cu::Randomize(data_aux_, mask_in_gpu, &data_)将data_aux_中顺序数据,按mask_in_gpu放入data_中,mask_in_gpu相当于index.