CNTK 中的 Seq2Seq : 运行 Time Error Function Only supports 2 dynamic axis

Seq2Seq in CNTK : Run Time Error Function Only supports 2 dynamic axis

我正在尝试实现一个基本翻译模型,其中输入和输出是 CNTK 中不同语言的句子,使用 LSTM

为了实现这一点,我创建了如下模型:

def create_model(x):
    with c.layers.default_options():
        m = c.layers.Recurrence(c.layers.LSTM(input_vocab_size))(x)
        m = sequence.last(m)
        y = c.layers.Recurrence(c.layers.LSTM(label_vocab_size))(m)
        return m

batch_axis = Axis.default_batch_axis()
input_seq_axis = Axis('inputAxis')
input_dynamic_axes = [batch_axis, input_seq_axis]
raw_input = input_variable(shape = (input_vocab_dim), dynamic_axes = input_dynamic_axes, name = 'raw_input')
z= create_model(raw_input)

但我收到以下错误:

RuntimeError: Currently PastValue/FutureValue Function only supports input operand with 2 dynamic axis (1 sequence-axis and 1 batch-axis)

据我了解,动态轴基本上是那些在数据加载后决定的轴,在这种情况下是批量大小和输入句子的长度。我不认为我在任何地方改变输入的动态轴。

非常感谢任何帮助。

这可能是:

input_dynamic_axes= [Axis.default_batch_axis(), Axis.default_dynamic_axis()] 

第一个是你的 minibatch 中的样本数,第二个是 CNTK 自动推断的序列长度

last() 操作剥离了动态轴,因为它将输入序列减少为单个值(思维向量)。

思想向量应该成为第二次循环的初始状态。所以它不应该作为数据参数传递给第二次重复。

在当前版本中,Recurrence() 的 initial_state 参数不能依赖于数据。这很快就会成为可能,它已经在代码审查中,很快就会合并到 master 中。

在那之前,有一种更复杂的方法来传递 data-dependent 初始状态,您可以手动构造递归(没有 Recurrence() 层),并在递归中手动添加初始隐藏状态。它在 sequence-2-sequence 示例中进行了说明。