[ src/nnetbin ] nnet-train-frmshuff

Perform one iteration (epoch) of Neural Network training with mini-batch Stochastic Gradient Descent. The training targets are usually pdf-posteriors, prepared by ali-to-post.

Usage:  nnet-train-frmshuff [options]    []
e.g.: nnet-train-frmshuff scp:feats.scp ark:posterior.ark nnet.init nnet.iter1
// main loop
while (!feature_reader.Done()) {
    //填满各个randomizer
    for ( ; !feature_reader.Done(); feature_reader.Next()) {
        // 一次循环读一句话
        
        // 特征放在feature_randomizer里
        // targets放在targets_randomizer里
        // 每一帧、每一句相关的weights放在weights_randomizer里
        
        // 如果feature_randomizer被填满的话,退出该for循环,进行一次训练
        // feature_randomizer的大小由相关NnetDataRandomizerOptions类的成员变量randomizer_size(默认初始化为32768)决定
        // 也就是feature_randomizer中一共可以存放32768帧,存满后就进行训练
        // 可以通过参数 --randomizer-size指定其大小
    }
    
    // 对feature_randomizer里的帧进行随机重排
    // 对target_randomizer和weights_randomizer也进行随机重排
    
    // 对randomizer里的数据进行训练(使用mini-batches)
    // 几个randomizer的Next()将指向实际数据开始位置的指针移动一个minibatch的大小
    for ( ; !feature_randomizer.Done(); feature_randomizer.Next(),
                                        targets_randomizer.Next(),
                                        weights_randomizer.Next()){
        // 拿出一个minibatch大小的feature/target对
        
        // 跑网络的前向
        nnet.Propagate(nnet_in, &nnet_out);
        
        // 根据目标函数的类型,估计前向输出和实际target的diff
        // 支持的目标函数类型:交叉熵xent,mse和multitask
        // 以xent为例:
        xent.Eval(frm_weights, nnet_out, nnet_tgt, &obj_diff);
        
        // 跑网络的反向(如果不是cv(交叉验证))
        nnet.Backpropagate(obj_diff, NULL);
        
        // 如果是第一个minibatch,打印网络的相关信息
    }
}
// 如果是最后一个minibatch,打印网络的相关信息

// 将nnet写到文件(如果不是cv)

// 打印和目标函数相关的一些信息

所有的Randmoizer都根据mask进行随机化

/**
 * Generates randomly ordered vector of indices,
 */
class RandomizerMask
/**                                                             
 * Shuffles rows of a matrix according to the indices in the mask, 
 */                                                         
class MatrixRandomizer

下一步学习重点:
Nnet类的几个成员函数(nnet/nnet-nnet.h)

// 跑网络的前向
nnet.Propagate(nnet_in, &nnet_out);
// 根据目标函数的类型,估计前向输出和实际target的diff
// 支持的目标函数类型:交叉熵xent,mse和multitask
// 以xent为例:
xent.Eval(frm_weights, nnet_out, nnet_tgt, &obj_diff);
// 跑网络的反向(如果不是做cv(交叉验证))
nnet.Backpropagate(obj_diff, NULL);

你可能感兴趣的:([ src/nnetbin ] nnet-train-frmshuff)