如何在CNTK中实现序列分类LSTM网络?

时间:2016-07-27 13:23:44

标签: machine-learning neural-network recurrent-neural-network lstm cntk

我正致力于实施LSTM神经网络以进行序列分类。我想用以下参数设计一个网络:

  1. 输入一系列n单热矢量。
  2. 网络拓扑:双层LSTM网络。
  3. 输出:给定序列属于某一类(二进制分类)的概率。我想只考虑第二个LSTM层的最后一个输出。
  4. 我需要在CNTK中实现它,但我很难,因为它的文档编写得不是很好。有人可以帮我吗?

4 个答案:

答案 0 :(得分:6)

有一个sequence classification example完全符合您的要求。

唯一的区别是它只使​​用一个LSTM层。您可以通过更改以下内容轻松更改此网络以使用多个图层:

LSTM_function = LSTMP_component_with_self_stabilization(
    embedding_function.output, LSTM_dim, cell_dim)[0]

为:

num_layers = 2 # for example
encoder_output = embedding_function.output
for i in range(0, num_layers):
    encoder_output = LSTMP_component_with_self_stabilization(encoder_output.output, LSTM_dim, cell_dim)

但是,使用新的图层库可以更好地满足您的需求。然后你可以这样做:

encoder_output = Stabilizer()(input_sequence)
for i in range(0, num_layers):
    encoder_output = Recurrence(LSTM(hidden_dim)) (encoder_output.output)

然后,为了得到你输入密集输出层的最终输出,你可以先做:

final_output = sequence.last(encoder_output)

然后

z = Dense(vocab_dim) (final_output)

答案 1 :(得分:2)

here您可以找到一种简单的方法,只需添加其他图层,如:

Sequential([
        Recurrence(LSTM(hidden_dim), go_backwards=False),
        Recurrence(LSTM(hidden_dim), go_backwards=False),
        Dense(label_dim, activation=sigmoid)
    ])

训练,测试并应用它......

答案 2 :(得分:2)

CNTK发表hands-on tutorial语言理解有端到端的方法:

  

这个动手实验展示了如何实现循环网络来处理文本,用于插槽标记的Air Travel Information Services(ATIS)任务(将单个单词标记到各自的类,其中类作为标签提供)训练数据集)。我们将从单词的直接嵌入开始,然后是经常性的LSTM。然后,这将扩展为包括相邻单词并双向运行。最后,我们将把这个系统变成一个意图分类器。

答案 3 :(得分:1)

我不熟悉CNTK。但由于这个问题长期以来一直没有得到答复,我或许可以建议一些建议来帮助你实施? 我不确定你对这些架构有多么有经验;但在转移到CNTK(看似社区不太活跃)之前,我建议看看其他流行的知识库(如Theano,张量流等)。

例如,theano中的类似任务在此处给出:kyunghyuncho tutorials。只需为定义寻找“def lstm_layer”。 火炬示例可以在Karpathy's very popular tutorials

中找到

希望这有点帮助..