LSTM-RNN:如何塑造多变量输入

时间:2017-06-15 23:27:24

标签: machine-learning tensorflow deep-learning lstm

大家好,我正在考虑使用tensorflow RNN实现:

问题:

我想训练一个RNN的LSTM实施来检测KDD99数据集中的恶意连接。它是一个具有41个特征的数据集,并且(在一些预处理之后)是一个大小为5的标签向量。

[ 
[x1, x2, x3, .....x40, x41],
... 
[x1, x2, x3, .....x40, x41]
]


[ 
[0, 1, 0, 0, 0],
...
[0, 0, 1, 0, 0]
]

作为一个基本的结构,我想实现以下内容:

cell = tf.nn.rnn_cell.LSTMCell(num_units=64, state_is_tuple=True)
cell = tf.nn.rnn_cell.DropoutWrapper(cell=cell, output_keep_prob=0.5)
cell = tf.nn.rnn_cell.MultiRNNCell(cells=[cell] * 3, state_is_tuple=True)

我的问题是:为了将其提供给模型,我将如何重塑输入要素?

我不仅需要重塑输入功能,还要构建滑动窗口序列吗?

我的意思是:

假设序列长度为10,则第一个序列将包含数据点0 - 9,第二个包含数据点1 - 10,2 - 11,依此类推。

谢谢!

1 个答案:

答案 0 :(得分:2)

我不知道数据集,但我认为你的问题如下:你有一个很长的序列,你想知道如何塑造这个序列,以便将其提供给网络。

'tf.contrib.rnn.static_rnn'具有以下签名:

tf.contrib.rnn.static_rnn(cell, inputs, initial_state=None, dtype=None, sequence_length=None, scope=None)

,其中

  

inputs:输入的长度为T的列表,每个都是形状张量[batch_size,input_size]或这些元素的嵌套元组。

因此需要将输入整形为列表,其中列表的每个元素都是每个时间步的输入序列的元素。

此列表的长度取决于您的问题和/或计算问题。

  • 例如,在自然语言处理中,此列表的长度可以是文档的最大句子长度,其中较短的句子填充到该长度。在这种情况下,在许多域中,序列的长度由问题
  • 驱动
  • 但是,您的问题中没有这样的证据,或者仍然有很长的序列。从计算的角度来看,长序列非常重。用于优化此模型的BPTT算法在具有共享参数的非常深的前馈网络中“展开”循环网络,并在其上反向传播。在这种情况下,将序列“切割”到固定长度仍然很方便。

在这里,我们到达你的问题,给定这个固定的长度,让我们说10,我如何塑造我的输入?

通常,做的是在非重叠窗口中剪切数据集(在你的例子中,我们将有1-9,10-19,20-29等。这里发生的是每次使用BPTT更新权重时,网络只查看序列的最后10个元素。

然而,由于序列已被任意切割,因此预测可能需要利用在当前窗口之外的序列中很久的证据。为此,我们使用参数<{p}}在窗口i的窗口i-1的最终状态初始化RNN的初始状态。

  

initial_state :(可选)RNN的初始状态。

最后,我将向您介绍两个来源,以了解更多细节:

  1. RNN Tutorial这是tensorflow的官方教程。它适用于语言建模任务。在代码的某一点,您将看到最终状态从一次运行到下一次运行到网络,以实现上述内容。

    feed_dict = {}
    for i, (c, h) in enumerate(model.initial_state):
      feed_dict[c] = state[i].c
      feed_dict[h] = state[i].h
    
  2. DevSummit 2017这是Tensorflow DevSummit 2017期间的演讲视频,在第一部分(阅读和批处理序列数据)中,解释了如何使用哪些功能你应该塑造你的序列输入。

  3. 希望这会有所帮助:)