# Kaldi nnet3 更改架構 簡述Kaldi nnet3 的實踐方法 --- Kaldi本身設計了一種Computation graph 的系統,讓使用者藉由寫Xconfig 去編譯成init.config, ref.config 然後再由kaldi/src/nnet3 下面的程式來對各個組件進行操作。詳細的nnet3的定義可以參考[楊超的介紹頁](http://placebokkk.github.io/kaldi-nnet3/2020/03/14/asr-kaldi-nnet3-basic.html),本文不再詳述。 由於許多人開始有設計NN架構的變形的需求,比如: [Get Value of nnet3 output layer](https://groups.google.com/forum/#!topic/kaldi-help/TVc4cFsKynE) 想知道怎麼取nnet3中間的output [nnet3: multi-task learning](https://groups.google.com/forum/#!topic/kaldi-help/guj3gIe7rCg) 各種Multitask會需要換output的應用 由於Kaldi nnet3的computation graph定義的方式如下圖: ![](https://i.imgur.com/vpAR3QB.png) 一個NN架構是由很多個組件(tdnn:relu)加上很多不同的Descriptors(那些箭頭)拼湊而成,NN在訓練的時候每個組件的class都會存下backward gradient的值,才能夠更新參數的(詳情可以看$dir/log/progress.*.log),因為對於nnet3來說都是組件跟Descriptors的關係,因此我們可以隨時抽換整個computation graph的內容,這種時候會建議使用以下的方式 ``` nnet3-copy --edits_config=XXX <nnet-in> <nnet-out> e.g. nnet3-copy --edits_config='echo remove-output-nodes name=output|' final.raw final_deoutput.raw ``` 其中--edits_config可以使用的指令可以參考nnet3/nnet-utils.h裡面定義在ReadEditConfig()裡的文字 Examples --- - [Book example](/s/book-example) - [Slide example](/s/slide-example) - [YAML metadata](/s/yaml-metadata) - [Features](/s/features) Themes --- - [Dark theme](/theme-dark?both) - [Vertical alignment](/theme-vertical-writing?both) ###### tags: `Templates` `Book`