2017-04-08 57 views
0

什麼時候我們會選擇運行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_providerline 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.ymlkur data --assemble speech.yml打印出相同的輸出,沒有任何額外的輸出,因爲--assemble

  • 當我line 255spec.get_provider,我SpeechRecognitionSupplier對象有8個數據源,其中3個提取到datatranscript_length源不被提取。但是,merge_suppliersL268之後,似乎將所有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,也不能打印出來。

回答

0

kur

回答@ajsyp如果您不要使用--assemble,那麼你將只打印出Kurfile的train.data(特指的(可能是間接的)數據源或validate.data等。) 部分。

但是有部分培訓管道可能需要/創建其他數據源,而不僅僅是train.data(必要的變通)部分中的部分。例如,被廣泛用作序列學習(例如語音識別)中的軟對準損失函數的CTC損失函數需要知道每個地面真實筆錄的長度。現在數據部分中沒有提及任何有關轉錄長度,甚至輸入音頻源長度的信息。那麼他們從哪裏來?

庫爾創建這些「輔助」數據源,當CTC丟失功能構建。如果你指定--assemble,那麼Kur就會比單純看數據塊更進一步。相反,它會盡可能地做(盡力編譯/使用模型)以找出可能存在的其他輔助數據源。

因此,無論您是否使用--assemble,取決於您嘗試調試的數據管道的哪一部分。


從@ajsyp

--assemble進一步的解釋。現在,庫爾確實,實際上,創建這些額外的數據源,但只有如果--asemble如果指定。數據源只是沒有被添加到提供商,這就是爲什麼你沒有看到他們,當你做kur data --assemble。我打算在某個時候添加一些內容,以便您可以看到添加的內容。還沒有到它呢。

相關問題