【发布时间】:2017-11-03 15:27:01
【问题描述】:
刚开始使用 TensorFlow 构建用于多类分类的 LSTM 网络
给定如下所示的结构:A RNN model 假设每个节点 A 代表 TensorFlow BasicLSTMcell。
根据网上一些流行的例子,训练的输入准备为[batch_size, timeStep_size, feature_size]
让我们假设 timeStep_size = 5, feature_size = 2, num_class= 4, 给定一个训练集:(虚拟数据)
t = t0 t1 t2 t3 t4
x = [ [1] [2] [2] [5] [2] ]
[ [2] [3] [3] [1] [2] ]
y = [ [0] [1] [1] [0] [0] ]
[ [1] [0] [0] [0] [0] ]
[ [0] [0] [0] [0] [1] ]
[ [0] [0] [0] [1] [0] ]
按流行用法:
...
# 1-layer LSTM with n_hidden units.
rnn_cell = rnn.BasicLSTMCell(n_hidden)
# generate prediction
outputs, states = rnn.static_rnn(rnn_cell, x, dtype=tf.float32)
return tf.matmul(outputs[-1], weights['out']) + biases['out']
在我看来,LSTM 单元的训练并没有利用 y 的所有五个输出(y 在 t0 - t3)。与 output[-1] 相比,只有时间 t4 的 y 用于计算损失。
问题1:是不是LSTM自己计算/逼近y_t0,然后馈入t1计算y_t1,以此类推……直到计算出y_t4?
如果是这样的话,
问题 2:如果 t-1 的 y 非常重要怎么办?
例子:
t = t-1 t0 t1 t2 t3 t4
x = [ [1] [2] [2] [2] [2] [2]]
[ [1] [2] [2] [2] [2] [2]]
y = [ [0] [1] [1] [1] [1] [1]]
[ [1] [0] [0] [0] [0] [0]]
[ [0] [0] [0] [0] [0] [0]]
[ [0] [0] [0] [0] [0] [0]]
VS:
t = t-1 t0 t1 t2 t3 t4
x = [ [3] [2] [2] [2] [2] [2]]
[ [3] [2] [2] [2] [2] [2]]
y = [ [0] [0] [0] [0] [0] [0]]
[ [0] [0] [0] [0] [0] [0]]
[ [1] [0] [0] [0] [0] [0]]
[ [0] [1] [1] [1] [1] [1]]
这意味着即使从 t0 到 t4 的输入特征相同, 输出 y 不同,因为之前的输出 (y_t-1) 不同。
那么这种情况应该怎么处理呢? TensorFlow在计算t0的输出时如何设置t-1的输出?
我想过增加timeStep_Size,但实际情况可能很大,所以我有点糊涂……
任何指针都非常感谢!
提前谢谢你。
==================更新============================= ==
回复:jdehesa,再次感谢。
一些额外的背景:我的目的是对一长串 x 进行分类,如下所示:
t = t0 t1 t2 t3 t4 t5 t6 t7 ...
x = [ [3] [2] [2] [2] [2] [2] [1] [2] [2] [2] [2] [2] ...]
[ [3] [2] [2] [2] [2] [2] [1] [2] [2] [2] [2] [2] ...]
y = [ c3 c2 c2 c2 c2 c2 c1 c4 c4 c4 c4 c4 ...]
Note: c1: class 1, c2: class2 c3: class 3, c4: class 4
这篇文章背后的主要困惑是手动分类有一些已知的规则。 以上面的虚拟数据为例,假设有规则
如果前面的特征 x 是第 3 类 ([3, 3]),那么所有后面的 [2, 2] 都将是第 2 类,直到它到达第 1 类。
如果前面的 x 是 1 类 ([1, 1]),那么后面的所有 [2, 2] 都将是 4 类,直到它到达 3 类。
在这种情况下,如果 LSTM 只看到与 t1 到 t4 相同的 [5 by 2] 特征向量 (x),则网络将完全迷失在分类为 2 类或 4 类。 所以我的意思是,不仅 5 个时间步的这些特征很重要,前一个时间步的输出/标签也很重要。
所以重述问题:如果现在训练集是 t1 到 t5,那么除了 x [batch_size, t1:t5, 2] 之外,如何在 t0 处也包含标签/类 y。
以下是我对您的回答的回复。
考虑我使用 GRU 而不是 LSTM,其中单元输出和单元状态都由“h”表示,如 understandign LSTM。
关于initial_state 参数:我刚刚发现dynamic_rnn 和static_rnn 采用了您指出的这个参数:D。如果我要解决刚才提到的问题,我可以在训练之前使用将之前的类/标签(t0 时的 y)分配给 initial_state 参数,而不是使用 zeros_state。
我突然觉得我完全迷失了 LSTM 记忆的时间跨度。我一直认为内存的时间跨度仅受 timeStep_size 的限制。如果 timeStep_size = 5,网络最多只能召回 4 步,因为每次训练我们只提供 x 特征向量的 [5 x 2]。如果我错了,请纠正我。
再次感谢你
【问题讨论】:
标签: tensorflow deep-learning lstm recurrent-neural-network gated-recurrent-unit