我试图在CNTK中实现一个注意力集中的Seq2Seq模型,这与CNTK Tutorial 204非常相似。然而,一些小的差异导致了各种问题和错误信息,我不明白。这里有很多问题,这些问题可能是相互关联的,都来自我不理解的单一事物。在CNTK中执行Seq2Seq时出现多个轴问题
注意(万一它很重要)。我的输入数据来自MinibatchSourceFromData
,由适合内存的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并抛售其图形转换为.dot
文件中使用cntk.logging.plot
,我看到它的输入形状是[#](-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:我上面的理解是否正确?什么应该是正确的轴,为什么会导致上述两个例外之一?
感谢您的解释!
感谢您的澄清,Nikos!快速提问:如果我现在想试试这个,并且我不想从源代码构建CNTK,那么复制新的AttentionModel Python实现就足够了,还是需要在本机中最近修复一些码? – Skiminok
本机代码中存在一些错误修复。这不足以复制新的实现。 –