我们什么时候选择运行kur data --assemble mnist.yml
,我浏览了与--assemble
相关的代码,每一步都是有道理的,但我并不是为了它的目的而全面了解。
你能解释为什么你设计这个功能,我们什么时候应该使用它?
由于
反馈@ajsyp以下答案
你提到了:
但是,培训管道的某些部分可能需要/创建其他数据源,而不仅仅是train.data(mutatis mutandis)部分中的数据源。例如,广泛用作序列学习(例如,语音识别)中的软对齐损失函数的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]]
但是,当我在line 255处运行prepare_data
的行L151和spec.get_provider
内的行时:
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寻求的其他来源是什么?
一旦Kur确定了其他来源,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
来源。但是,在L268 merge_suppliers
之后,似乎所有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个数据源:
--assemble
确实使用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
实例中,也不能打印出来。
答案 0 :(得分:0)
来自kur
的@ajsyp回答如果您不使用--assemble
,那么您只会打印出Kurfile的train.data(或validate.data等)部分中指定的数据源(可能是间接的) 。
但是,培训管道的某些部分可能需要/创建其他数据源,而不仅仅是train.data(mutatis mutandis)部分中的数据源。例如,广泛用作序列学习(例如,语音识别)中的软对齐损失函数的CTC损失函数需要知道每个地面实况转录本的长度。现在,数据部分中没有任何内容提及有关转录长度,甚至输入音频源长度的任何内容。那他们来自哪里?
Kur创造了这些&#34;辅助&#34;构造CTC损失函数时的数据源。如果你指定--assemble,那么Kur将比仅仅查看你的数据块更进一步。相反,它将尝试尽可能多地(实际编译/使用模型)以确定可能存在的其他辅助数据源。
因此,您是否使用--assemble取决于您尝试调试的数据管道的哪个部分。
来自@ajsyp的进一步解释
--assemble
。现在,Kur 确实,实际上是创建这些额外的数据源,但只有--asemble
指定时才。数据源只是没有添加到提供商,这就是为什么当您执行kur data --assemble
时您没有看到它们的原因。我计划在某些时候添加它,这样你实际上可以看到添加的内容。哈文已经开始接触它了。