【问题标题】:Seq2Seq in CNTK : Run Time Error Function Only supports 2 dynamic axisCNTK 中的 Seq2Seq :运行时错误函数仅支持 2 个动态轴
【发布时间】:2017-06-21 20:43:02
【问题描述】:

我正在尝试使用 LSTMs 实现 基本翻译模型,其中输入和输出是 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)

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

非常感谢任何帮助。

【问题讨论】:

    标签: deep-learning lstm cntk


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。我正在阅读相同的 Seq2Seq 教程,并希望避免使用复杂的函数 LSTM_Layer。我对该功能有很多疑问。我可能会将它们作为单独的问题发布。
    • "在当前版本中,Recurrence() 的 initial_state 参数不能依赖数据。"现在支持吗?这有什么更新吗?
    【解决方案2】:

    这可能是:

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      相关资源
      最近更新 更多