我正在尝试实施基本翻译模型,其中输入和输出是使用 LSTM 在 CNTK 中使用不同语言的句子。
为实现这一点,我正在创建模型如下:
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)
据我了解,动态轴基本上是在加载数据后得到决定的轴,在这种情况下是批量大小和输入句子的长度。我不认为我正在改变任何地方的动态输入轴。
非常感谢任何帮助。
答案 0 :(得分:1)
last()
操作剥离动态轴,因为它将输入序列减少为单个值(思想向量)。
然后思维向量应成为第二次重现的初始状态。所以它不应该作为数据参数传递给第二次重复。
在当前版本中,Recurrence()的initial_state参数不能与数据相关。这很快就会实现,它已经在代码审查之下,很快就会合并为主人。
在此之前,有一种更复杂的方法可以传递与数据相关的初始状态,您可以手动构建重复(不使用Recurrence()图层),并在重复中手动添加初始隐藏状态。它在序列2-序列样本中进行了说明。
答案 1 :(得分:0)
这可能是:
input_dynamic_axes= [Axis.default_batch_axis(), Axis.default_dynamic_axis()]
第一个将是您的小批量中的样本数量,第二个将是CNTK自动推断的序列长度