【发布时间】:2018-02-20 12:40:44
【问题描述】:
我正在尝试在 CNTK 中实现一个带有注意力的 Seq2Seq 模型,与CNTK Tutorial 204 非常相似。但是,几个小的差异会导致各种问题和错误消息,我不明白。这里有很多问题,可能是相互关联的,都源于我不明白的某件事。
注意(如果它很重要)。我的输入数据来自MinibatchSourceFromData,由适合 RAM 的 NumPy 数组创建,我不将其存储在 CTF 中。
ins = C.sequence.input_variable(input_dim, name="in", sequence_axis=inAxis)
y = C.sequence.input_variable(label_dim, name="y", sequence_axis=outAxis)
因此,形状为[#, *](input_dim) 和[#, *](label_dim)。
问题 1: 当我运行 CNTK 204 Tutorial 并使用 cntk.logging.plot 将其图形转储到 .dot 文件中时,我看到它的输入形状是 [#](-2,)。这怎么可能?
- 序列轴 (
*) 在哪里消失了? - 维度怎么可能是负数?
问题 2: 在同一个教程中,我们有 attention_axis = -3。我不明白这一点。在我的模型中,有 2 个动态轴和 1 个静态轴,因此“倒数第三个”轴将是 #,即批处理轴。但是绝对不应该在批处理轴上计算注意力。
我希望查看教程代码中的实际坐标轴可以帮助我理解这一点,但上面的[#](-2,) 问题让这更加令人困惑。
将attention_axis 设置为-2 会出现以下错误:
RuntimeError: Times: The left operand 'Placeholder('stab_result', [#, outAxis], [128])'
rank (1) must be >= #axes (2) being reduced over.
在创建训练时模型期间:
def train_model(m):
@C.Function
def model(ins: InputSequence[Tensor[input_dim]],
labels: OutputSequence[Tensor[label_dim]]):
past_labels = Delay(initial_state=C.Constant(seq_start_encoding))(labels)
return m(ins, past_labels) #<<<<<<<<<<<<<< HERE
return model
其中stab_result 是解码器中最后Dense 层之前的Stabilizer。我可以在点文件中看到,AttentionModel 实现的中间出现了大小为 1 的虚假尾随维度。
将attention_axis 设置为-1 会出现以下错误:
RuntimeError: Binary elementwise operation ElementTimes: Left operand 'Output('Block346442_Output_0', [#, outAxis], [64])'
shape '[64]' is not compatible with right operand
'Output('attention_weights', [#, outAxis], [200])' shape '[200]'.
其中 64 是我的 attention_dim,而 200 是我的 attention_span。据我了解,注意模型中的元素* 绝对不应该将这两者混为一谈,因此-1 绝对不是这里的正确轴。
问题3:我上面的理解正确吗?什么应该是右轴,为什么它会导致上述两个异常之一?
感谢您的解释!
【问题讨论】:
标签: python cntk sequence-to-sequence attention-model