Python 在CNTK中实施Seq2Seq时,Axis存在多个问题

Python 在CNTK中实施Seq2Seq时,Axis存在多个问题,python,cntk,sequence-to-sequence,attention-model,Python,Cntk,Sequence To Sequence,Attention Model,我试图在CNTK中实现一个关注的Seq2Seq模型,类似于。然而,一些小的差异导致了各种问题和错误消息,我不理解。这里有很多问题,它们可能是相互关联的,都来自于我不理解的某件事 注意(如果重要的话)。我的输入数据来自minibacksourcefromdata,它是从适合RAM的NumPy阵列创建的,我不将其存储在CTF中 ins = C.sequence.input_variable(input_dim, name="in", sequence_axis=inAxis) y = C.seque

我试图在CNTK中实现一个关注的Seq2Seq模型,类似于。然而,一些小的差异导致了各种问题和错误消息,我不理解。这里有很多问题,它们可能是相互关联的,都来自于我不理解的某件事

注意(如果重要的话)。我的输入数据来自
minibacksourcefromdata
,它是从适合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)
因此,形状是
[#,*](输入尺寸)
[#,*](标签尺寸)

问题1:当我运行并使用
cntk.logging.plot
将其图形转储到
.dot
文件时,我看到其输入形状是
[#](.2,)
。这怎么可能

  • 序列轴(
    *
    )在哪里消失
  • 维度怎么可能是负的
问题2:在同一教程中,我们有
注意\u axis=-3
。我不明白。在我的模型中,有两个动态轴和一个静态轴,因此“倒数第三个”轴将是批处理轴。但注意力绝对不应在批次轴上计算。
我希望通过查看教程代码中的实际轴可以帮助我理解这一点,但是上面的
[#](-2,)
问题使这一点更加混乱

attention\u axis
设置为
-2
会产生以下错误:

RuntimeError: Times: The left operand 'Placeholder('stab_result', [#, outAxis], [128])'
              rank (1) must be >= #axes (2) being reduced over.
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是我的
注意\u dim
,200是我的
注意\u span
。据我所知,注意力模型中的元素级
*
绝对不应该将这两个元素混为一谈,因此
-1
绝对不是这里的右轴

问题3:我的上述理解正确吗?什么是右轴?为什么它会导致上述两个异常之一


谢谢你的解释

首先,有一些好消息:在最新的master中,AttentionModel中有几个问题已经解决了(CNTK 2.2将在几天内普遍提供):

  • 您不需要指定
    注意span
    注意span轴
    。如果不指定它们并保持它们的默认值,则会计算整个序列的注意力。事实上,这些论点已经被否决了
  • 如果执行上述操作,204笔记本的运行速度将提高2倍,因此204笔记本不再使用这些参数
  • AttentionModel中的一个bug已经修复,现在它忠实地实现了Bahdanau等人的论文
关于你的问题:

维度不是负的。我们在不同的地方使用某些负数来表示某些事情:-1是一个维度,将根据第一个小批量推断一次,-2是我认为占位符的形状,-3是一个维度,将根据每个小批量推断(例如,当您向卷积提供可变大小的图像时)。我认为如果你在第一个小批量之后打印图形,你应该看到所有的形状都是具体的

attention\u axis
是一个应该隐藏的实现细节。基本上,
attention\u axis=-3
将创建(1,1200)的形状,
attention\u axis=-4
将创建(1,1,1200)的形状,依此类推。一般来说,任何大于-3的东西都不能保证有效,而小于-3的东西只会增加更多的1,没有任何明显的好处。当然,好消息是,你可以在最新的硕士论文中忽略这个论点

TL;DR:如果您在master(或几天后开始使用CNTK 2.2),请将注意力模型(注意维度,注意跨度=200,注意轴=-3)替换为
注意模式(注意尺寸)
。它速度更快,并且不包含令人困惑的参数。从CNTK 2.2开始,不推荐使用原始API

谢谢你的澄清,尼科斯!快速问题:如果我现在就想尝试这个方法,并且我还不想从源代码构建CNTK,那么复制
AttentionModel
的新Python实现就足够了,还是还需要在本机代码中进行一些最近的修复?本机代码中有一些错误修复。复制新的实现是不够的。
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]'.