【问题标题】:Why is CNTK using the embedding dimension for the decoder?为什么 CNTK 使用解码器的嵌入维度?
【发布时间】:2017-02-08 21:48:58
【问题描述】:

我已经训练了一个很好的序列到序列模型,我已经在本地机器上进行了测试,但现在我正在尝试评估很多查询。不过,我看到了这个错误:

02/08/2017 00:50:54: EXCEPTION occurred: Node 'decoderInput._' (If operation): Input dimensions [100] and [57408 x 3] are not compatible.

57408 是词汇量。我猜 100 来自嵌入维度的数量,它设置为 100。

我很困惑为什么这不起作用,因为输入和输出是“稀疏”的事实是在“cntkReaderInputDef”中设置的。

cntkReaderInputDef = { rawInput = { alias = "S0" ; dim = $inputVocabSize$ ; format = "sparse" } ; rawLabels = { alias = "S1" ;  dim = $labelVocabSize$ ;  format = "sparse" } }

【问题讨论】:

    标签: cntk


    【解决方案1】:

    William Darling 发表:

    因为您使用的是嵌入,所以您需要使用 CNTK.core.bs 文件的修改版本。在第 1515 行,目前有:

    decoderFeedback = /*EmbedLabels*/ (tokens.word) # [embeddingDim x Dnew]
    

    下一行是错误的来源:

    delayedDecoderFeedback = Boolean.If (Loop.IsFirst (labelSentenceStartEmbeddedScattered), labelSentenceStartEmbeddedScattered, Loop.Previous (decoderFeedback))
    

    decoderFeedback 的形状为 [W x Dnew],但 labelSentenceStartEmbeddedScattered 的形状为 [E],其中 E 是嵌入维度。在 BrainScript 中,没有很好的方法来传入模型定义中使用的嵌入宏,因此您需要显式地写出来。因此,将第 1515 行更改为:

    decoderFeedback = TransposeTimes(modelAsTrained.Einput, tokens.word)
    

    这会将您的解码器反馈表示转换为与嵌入形状兼容的内容。

    顺便说一句,阅读器定义的 format = sparse 仅与您格式化 CTF 输入文件的方式有关。使用稀疏格式意味着你有像 7:1 这样的东西,这意味着在位置 7 有一个 1 的单热向量,而不必写出一大堆零(你会使用密集格式)。

    【讨论】:

    • 天哪,谢谢你。我对 CTF 阅读器错误大发雷霆,因为我有 is_sparse=true 用于打印出零的 1-hot 向量。呜!!现在可以了。
    【解决方案2】:

    Chris Basoglu 说:

    实际上,您应该能够将 CNTK.core.bs 文件复制到您自己的配置文件旁边。它应该首先查看该文件夹。

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多