大家好,我正在考虑使用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,依此类推。
谢谢!
答案 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]或这些元素的嵌套元组。
因此需要将输入整形为列表,其中列表的每个元素都是每个时间步的输入序列的元素。
此列表的长度取决于您的问题和/或计算问题。
在这里,我们到达你的问题,给定这个固定的长度,让我们说10,我如何塑造我的输入?
通常,做的是在非重叠窗口中剪切数据集(在你的例子中,我们将有1-9,10-19,20-29等。这里发生的是每次使用BPTT更新权重时,网络只查看序列的最后10个元素。
然而,由于序列已被任意切割,因此预测可能需要利用在当前窗口之外的序列中很久的证据。为此,我们使用参数<{p}}在窗口i
的窗口i-1
的最终状态初始化RNN的初始状态。
initial_state
:(可选)RNN的初始状态。
最后,我将向您介绍两个来源,以了解更多细节:
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
DevSummit 2017这是Tensorflow DevSummit 2017期间的演讲视频,在第一部分(阅读和批处理序列数据)中,解释了如何使用哪些功能你应该塑造你的序列输入。
希望这会有所帮助:)