什麼時候我們會選擇運行kur data --assemble mnist.yml
,我走遍了與--assemble
有關的代碼,每一步都有意義,但是我並沒有爲它的目的得到全部圖片。在```kur data --assemble mnist.yml`中`--assemble`有什麼用?
你能解釋爲什麼你設計這個功能,我們應該什麼時候使用它?
感謝
反饋給@ajsyp回答以下
你提到:
但也有訓練的管道可能需要/創建其他數據源的部分,不僅僅是train.data(必要的變通)部分。例如,被廣泛用作序列學習(例如語音識別)中的軟對準損失函數的CTC損失函數需要知道每個地面真實筆錄的長度。現在數據部分中沒有提及任何有關轉錄長度,甚至輸入音頻源長度的信息。
如果是這樣,那麼Kur應該在line 156之後開始獲得額外的來源,如轉錄長度。見成績單長度一批單個樣品中作爲kur data --assemble -n 1 speech.yml
結果:
Entry 1/16:
audio_source: /Users/Natsume/kur/lsdc-train/audio/67290d16-4254-4db3-93cf-a9c26cc6e19b
duration: 1.445
transcript: [26 6 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
transcript_length: [3]
transcript_raw: [26, 6, 20]
utterance: [[ 1.05875487 0.77517924 0.15939959 ..., 0.44732655 0.52782439
-0.44943174]
[-0.37000188 1.01170798 0.53420591 ..., 0.73733297 0.42373239
-1.09549656]
[ 0.637711 0.91922504 0.68830267 ..., 0.55688627 -0.62501853
0.52738557]
...,
[ 0. 0. 0. ..., 0. 0. 0. ]
[ 0. 0. 0. ..., 0. 0. 0. ]
[ 0. 0. 0. ..., 0. 0. 0. ]]
utterance_length: [143]
utterance_raw: [[ 1.05875487 0.77517924 0.15939959 ..., 0.44732655 0.52782439
-0.44943174]
[-0.37000188 1.01170798 0.53420591 ..., 0.73733297 0.42373239
-1.09549656]
[ 0.637711 0.91922504 0.68830267 ..., 0.55688627 -0.62501853
0.52738557]
...,
[ 0.96143945 0.76925231 0.58252107 ..., 0.39418582 0.46883116
0.05069899]
[ 0.54131455 0.61457148 0.45849029 ..., -2.30826005 0.54976478
0.87326668]
[-0.57543387 0.94335625 0.510369 ..., 1.44453525 -1.6265138
0.45963185]]
然而,當我跑的線路prepare_data
L151和內部spec.get_provider
在line 255:
providers = spec.get_provider(# L151 of prepare_data
args.target,
accept_many=args.target == 'test'
)
suppliers[k] = [ # L255 of get_provider
Supplier.from_specification(entry, kurfile=self)
for entry in v
]
我沒有得到所有8個數據源,包括轉錄本長度,在L156之後無需運行代碼:請參閱下面的轉錄本長度源
(Pdb) pprint(suppliers['default'][0].__dict__['sources'])
{'audio_source': <kur.sources.vanilla.VanillaSource object at 0x10ad0a3c8>,
'duration': <kur.sources.vanilla.VanillaSource object at 0x10ad0a320>,
'transcript': <kur.supplier.speechrec.Transcript object at 0x10ad0ab38>,
'transcript_length': <kur.supplier.speechrec.TranscriptLength object at 0x10ad0a0f0>,
'transcript_raw': <kur.supplier.speechrec.RawTranscript object at 0x100ab14e0>,
'utterance': <kur.supplier.speechrec.Utterance object at 0x10ad0a2b0>,
'utterance_length': <kur.supplier.speechrec.UtteranceLength object at 0x10ad0a160>,
'utterance_raw': <kur.supplier.speechrec.RawUtterance object at 0x10a933898>}
它是否表示transcript_length
不是其他來源?如果是這樣,那麼在prepare_data
的L156行之後庫爾尋求的額外資源是什麼?
一旦Kur確定了額外的來源,庫爾將存儲額外的來源到BatchProvider
進行處理,對吧?那麼哪個函數可以將其他的源代碼精確地獲取到Line174的同一個BatchProvider中?
更多的發現:
kur data speech.yml
和kur data --assemble speech.yml
打印出相同的輸出,沒有任何額外的輸出,因爲--assemble
當我line 255跑
spec.get_provider
,我SpeechRecognitionSupplier
對象有8個數據源,其中3個提取到data
。transcript_length
源不被提取。但是,merge_suppliers
在L268之後,似乎將所有8個數據源提取到新創建的BatchProvider
實例中。這就是爲什麼沒有--assemble
,我仍然打印出所有8個數據源。- 在
kur data mnist.yml
的情況下,不同於
speech.yml
案件,供應商對象沒有額外sources
,僅有2的數據源;當提供者對象被初始化時,共有2個數據源;而speech.yml
的情況下,其供應商對象總共有8個數據源,並且僅提取3個數據,在提供商初始化之後,其提供商有8個數據源準備在每批中提供,而不使用--assemble
。似乎從一開始就有額外的數據源。
kur data --assemble speech.yml
打印出8個數據源如下:在0x1160d2198
- kur.supplier.speechrec.RawUtterance對象>,在0x1160670b8 kur.supplier.speechrec.UtteranceLength對象>, kur.supplier在0x116067198 .speechrec.Utterance對象>在0x10c8e3c18, kur.supplier.speechrec.RawTranscript對象>在0x10c09b208, kur.supplier.speechrec.TranscriptLength對象>在0x116067048, kur.sources.vanilla.VanillaSource對象>,
kur.supplier.speechrec.Transcript對象在0x10bf6e4e0>,
在0x116067128>
--assemble
kur.sources.vanilla.VanillaSource對象並引入使用target.compile(assemble_only=True)
這個新的數據源沒一個看似新的數據源,但「噸得到打印出來,也沒有發現裏面BatchProvider
[」源]:
(Pdb) pprint(target.model.__dict__['additional_sources'])
{'ctc_scaled_utterance_length': <kur.loss.ctc.ScaledSource object at 0x117479f60>}
所以,到了這一點,似乎--assemble
可以在新的數據源帶來的,但這種新的數據源,似乎不存儲在BatchProvider
inst ance,也不能打印出來。