hang: nnetbin/sat-nnet-train-frmshuff.cc注解3

进行数据混合

  1. 做数据混合的前提是(!crossvalidate && randomize)
  • 构造mask
```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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容