Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow/LSTM机制:如何指定LSTM单元第一时间步的先前输出_Tensorflow_Deep Learning_Lstm_Recurrent Neural Network_Gated Recurrent Unit - Fatal编程技术网

Tensorflow/LSTM机制:如何指定LSTM单元第一时间步的先前输出

Tensorflow/LSTM机制:如何指定LSTM单元第一时间步的先前输出,tensorflow,deep-learning,lstm,recurrent-neural-network,gated-recurrent-unit,Tensorflow,Deep Learning,Lstm,Recurrent Neural Network,Gated Recurrent Unit,刚刚开始使用TensorFlow构建用于多类分类的LSTM网络 鉴于结构如下所示: 假设每个节点A代表TensorFlow BasicLSTMcell 根据在网上找到的一些流行示例,培训输入准备为[批次大小、时间步长大小、特征大小] 假设timeStep\u size=5,feature\u size=2,num\u class=4, 给定一个训练集:虚拟数据 t = t0 t1 t2 t3 t4 x = [ [1] [2] [2] [5] [2] ] [ [2

刚刚开始使用TensorFlow构建用于多类分类的LSTM网络

鉴于结构如下所示: 假设每个节点A代表TensorFlow BasicLSTMcell

根据在网上找到的一些流行示例,培训输入准备为[批次大小、时间步长大小、特征大小]

假设timeStep\u size=5,feature\u size=2,num\u 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单元的训练并没有利用t0-t3时y的所有五个输出。与输出[-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:

这意味着即使t0到t4的输入特征相同, 由于先前的输出y_t-1不同,因此输出y不同

那么如何应对这种情况呢? 当计算t0处的输出时,TensorFlow如何设置t-1的输出

我曾考虑过增加时间步长,但实际情况可能非常大,所以我有点困惑

非常感谢您的指点

先谢谢你

======================更新===============================

回复: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×2]特征向量x,则无论分类为类别2还是类别4,网络都将完全丢失。 所以我的意思是,不仅这5个时间步的特性很重要,前一个时间步的输出/标签也很重要

因此,重申这个问题:如果现在的训练集是t1到t5,那么除了x[批次大小,t1:t5,2],如何在t0处涉及标签/类别y

下面是我对你答案的回答

假设我使用GRU而不是LSTM,其中单元输出和单元状态都用h表示,如中所示

关于初始状态参数:我刚刚发现动态和静态参数采用了您指出的这个参数:D。如果我要解决刚才提到的问题,我可以在训练之前使用将t0处的前一个类/标签y分配给初始状态参数to,而不是使用零状态

我突然觉得我完全迷失了LSTM记忆的时间跨度。我一直认为内存的时间跨度只受时间步长大小的限制。如果timeStep_size=5,网络最多只能回调4步,因为每次训练我们只反馈[5 x 2]个x特征向量。如果我错了,请纠正我


再次感谢您

LSTM单元或RNN单元的内部状态在每次处理步骤后都会更新。显然,你不能无限地回到过去,所以你必须从某个点开始。一般惯例是从充满零的单元状态开始;事实上,TensorFlow中的RNN单元有一个零状态方法,该方法为每个特定单元类型和大小返回这种状态。例如,如果您对该起点不满意,因为您已经处理了半个序列,而现在您希望处理另一半序列,并在相同的状态下拾取,那么您可以将初始_状态参数传递给

关于培训,我不确定LSTM单元最流行的用法是什么,但这完全取决于您。我处理的问题是,每个时间样本都有一个标签,因此我的输出与输入大小相同。但是,在许多情况下,您只需要整个序列的标签,例如,这个句子是肯定/否定的,因此您只需查看最后的输出。所有之前的输入当然也很重要,因为它们定义了最后一个单元格状态,与最后一个输入结合使用以确定最终输出。例如,如果你把一个很酷的句子,一个字一个字地处理,最后一个字man可能不会告诉你它本身是一个肯定的句子还是一个否定的句子,但在这一点上,细胞处于一种非常确定它是一个肯定的句子的状态,这将需要一个明确的负输入之后,使其产生负输出

我不知道你说的t-1是什么意思。。 . 我的意思是,如果你的输入从t0开始,而你从来没有看到过t-1,你对此无能为力。例如,如果你只得到了真正喜欢这种食物的输入,但结果原来的整个句子并不真正喜欢这种食物,你就会完全错了。然而,如果你有输入,网络将学会考虑它,如果它真的很重要。LSTM单元的全部意义在于,它们能够记住过去很远的事情,即内部状态中输入的影响可以达到很长的时间跨度

更新:

关于你的补充意见

当然,您可以使用任何您想要的作为输入状态。但是,即使使用GRU,内部状态通常也与输出标签不匹配。通常,在循环单元之后使用sigmoid或softmax激活,这将产生与标签相当的输出

关于时间跨度。正确的做法是,使用时间步长很小的输入将限制经常性单元学习长期依赖性以发现更长序列中的模式的能力。正如我所提到的,如果在下一次运行中将重复单元的最后一个状态作为初始状态提供,则可以模拟更长的时间步长。但是,不管你是否这样做,LSTM单元不记得过去的事情并不确切。即使您以5的时间步长进行训练,如果您随后以100大小的序列运行网络,最后一个输入的输出也可能会受到之前所有99个输入的影响;你根本不知道它们有多大影响,因为这是你在训练中没有遇到过的情况


非常感谢你的回答。有关我的详细信息,请参考我的以下回答response@ntuty对不起,我忘了更新这个答案。。。我补充了一些评论。
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