[ 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] <feature-rspecifier> <targets-rspecifier> <model-in> [<model-out>]
e.g.: nnet-train-frmshuff scp:feats.scp ark:posterior.ark nnet.init nnet.iter1
// main loop
while (!feature_reader.Done()) {
    //填滿(mǎn)各個(gè)randomizer
    for ( ; !feature_reader.Done(); feature_reader.Next()) {
        // 一次循環(huán)讀一句話
        
        // 特征放在feature_randomizer里
        // targets放在targets_randomizer里
        // 每一幀、每一句相關(guān)的weights放在weights_randomizer里
        
        // 如果feature_randomizer被填滿(mǎn)的話,退出該for循環(huán),進(jìn)行一次訓(xùn)練
        // feature_randomizer的大小由相關(guān)NnetDataRandomizerOptions類(lèi)的成員變量randomizer_size(默認(rèn)初始化為32768)決定
        // 也就是feature_randomizer中一共可以存放32768幀,存滿(mǎn)后就進(jìn)行訓(xùn)練
        // 可以通過(guò)參數(shù) --randomizer-size指定其大小
    }
    
    // 對(duì)feature_randomizer里的幀進(jìn)行隨機(jī)重排
    // 對(duì)target_randomizer和weights_randomizer也進(jìn)行隨機(jī)重排
    
    // 對(duì)randomizer里的數(shù)據(jù)進(jìn)行訓(xùn)練(使用mini-batches)
    // 幾個(gè)randomizer的Next()將指向?qū)嶋H數(shù)據(jù)開(kāi)始位置的指針移動(dòng)一個(gè)minibatch的大小
    for ( ; !feature_randomizer.Done(); feature_randomizer.Next(),
                                        targets_randomizer.Next(),
                                        weights_randomizer.Next()){
        // 拿出一個(gè)minibatch大小的feature/target對(duì)
        
        // 跑網(wǎng)絡(luò)的前向
        nnet.Propagate(nnet_in, &nnet_out);
        
        // 根據(jù)目標(biāo)函數(shù)的類(lèi)型,估計(jì)前向輸出和實(shí)際target的diff
        // 支持的目標(biāo)函數(shù)類(lèi)型:交叉熵xent,mse和multitask
        // 以xent為例:
        xent.Eval(frm_weights, nnet_out, nnet_tgt, &obj_diff);
        
        // 跑網(wǎng)絡(luò)的反向(如果不是cv(交叉驗(yàn)證))
        nnet.Backpropagate(obj_diff, NULL);
        
        // 如果是第一個(gè)minibatch,打印網(wǎng)絡(luò)的相關(guān)信息
    }
}
// 如果是最后一個(gè)minibatch,打印網(wǎng)絡(luò)的相關(guān)信息

// 將nnet寫(xiě)到文件(如果不是cv)

// 打印和目標(biāo)函數(shù)相關(guān)的一些信息

所有的Randmoizer都根據(jù)mask進(jìn)行隨機(jī)化

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

下一步學(xué)習(xí)重點(diǎn):
Nnet類(lèi)的幾個(gè)成員函數(shù)(nnet/nnet-nnet.h)

// 跑網(wǎng)絡(luò)的前向
nnet.Propagate(nnet_in, &nnet_out);
// 根據(jù)目標(biāo)函數(shù)的類(lèi)型,估計(jì)前向輸出和實(shí)際target的diff
// 支持的目標(biāo)函數(shù)類(lèi)型:交叉熵xent,mse和multitask
// 以xent為例:
xent.Eval(frm_weights, nnet_out, nnet_tgt, &obj_diff);
// 跑網(wǎng)絡(luò)的反向(如果不是做cv(交叉驗(yàn)證))
nnet.Backpropagate(obj_diff, NULL);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容