CNTK中的Seq2Seq:运行时错误功能仅支持2个动态轴

时间:2017-02-04 15:02:39

标签: deep-learning lstm cntk

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

enter image description here

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

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)

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

在当前版本中,Recurrence()的initial_state参数不能与数据相关。这很快就会实现,它已经在代码审查之下,很快就会合并为主人。

在此之前,有一种更复杂的方法可以传递与数据相关的初始状态,您可以手动构建重复(不使用Recurrence()图层),并在重复中手动添加初始隐藏状态。它在序列2-序列样本中进行了说明。

答案 1 :(得分:0)

这可能是:

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

第一个将是您的小批量中的样本数量,第二个将是CNTK自动推断的序列长度