我正在尝试在CNTK中引起注意的SEQ2SEQ模型,这与CNTK教程非常相似。但是,几个小的差异导致了各种问题和错误消息,我对此我不'理解。这里有很多问题,可能是相互联系的,所有这些都源于我不了解的一件事情。
注意(如果很重要)。我的输入数据来自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教程并使用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
,在解码器中最终的Dense
层之前,stab_result
是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:我上述理解正确吗?什么应该是正确的轴,为什么会导致上面的两个例外之一?
感谢您的解释!
首先,一些好消息:最新主人的注意力模型中的几件事已固定在几天之内使用CNTK 2.2):
- 您无需指定
attention_span
或attention_axis
。如果您不指定它们并将其留下默认值,则注意力是通过整个顺序计算的。实际上,这些论点已被弃用。 - 如果您执行上述204笔记本电脑的运行速度快2倍,因此204笔记本不再使用这些参数
- 注意力模型中已经固定了一个错误,现在它忠实地实现了Bahdanau等。al。纸。
关于您的问题:
维度不是负面的。我们在各个地方使用某些负数来表示某些事情:-1是根据第一个Minibatch推断的维度,-2是我认为占位符的形状,-3是一个将被推断的维度使用每个Minibatch(例如,当您将变量大小的图像馈送到卷积时)。我认为,如果您在第一个Minibatch之后打印图形,则应该看到所有形状都是具体的。
attention_axis
是应该隐藏的实现细节。基本上attention_axis=-3
将创建(1、1、200)的形状,attention_axis=-4
将创建(1、1、1、200)的形状,等等。总的来说,任何超过-3的东西都不能保证工作,而少于-3的任何东西只会增加1秒,而没有任何明显的好处。当然,好消息是,您可以在最新的大师中忽略这一论点。
tl; dr:如果您在Master中(或几天内用CNTK 2.2开始)将AttentionModel(attention_dim, attention_span=200, attention_axis=-3)
替换为 AttentionModel(attention_dim)
。它更快,不包含令人困惑的论点。从CNTK 2.2开始,原始API被弃用。