在`kur data --assemble mnist.yml`中使用`--assemble`有什么用?

时间:2017-04-08 02:29:00

标签: python deep-learning

我们什么时候选择运行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.ymlkur 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个数据源:

  • kur.supplier.speechrec.RawUtterance对象位于0x1160d2198&gt;, kur.supplier.speechrec.UtteranceLength对象位于0x1160670b8&gt;, kur.supplier.speechrec.Utterance对象位于0x116067198&gt;, kur.supplier.speechrec.RawTranscript对象位于0x10c8e3c18&gt;, kur.supplier.speechrec.TranscriptLength对象位于0x10c09b208&gt;, kur.sources.vanilla.VanillaSource对象位于0x116067048&gt;,
    kur.supplier.speechrec.Transcript对象位于0x10bf6e4e0&gt;,
    kur.sources.vanilla.VanillaSource对象位于0x116067128&gt;

--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实例中,也不能打印出来。

1 个答案:

答案 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时您没有看到它们的原因。我计划在某些时候添加它,这样你实际上可以看到添加的内容。哈文已经开始接触它了。