---
# System prepended metadata

title: Kaldi nnet3 更改架構
tags: [Book, Templates]

---

# 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`
