(使用python)
我对Tensorflow LSTM-Implementation有疑问。目前在TF中有几种实现,但我使用:
cell = tf.contrib.rnn.BasicLSTMCell(n_units)
然后我打电话给我的输出:
rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell, x,
initial_state=initial_state, time_major=False)
time_major=False
)x
的形状为(batch_size, time_steps, input_length)
batch_size
是我的batch_size time_steps
是我的RNN将经历的时间步数input_length
是我的一个输入向量的长度(在一个特定批次的一个特定时间步进入网络的向量)我希望rnn_outputs的形状为(batch_size, time_steps, n_units, input_length)
,因为我没有指定另一个输出大小。
nn.dynamic_rnn
的文档告诉我输出的形状为(batch_size, input_length, cell.output_size)
。
tf.contrib.rnn.BasicLSTMCell
的文档确实有一个属性output_size
,默认为n_units(我使用的LSTM单元格数量)。
每个LSTM-Cell是否只为每个给定的时间步输出一个标量?我希望它输出一个输入向量长度的向量。从我现在的理解情况来看,情况似乎并非如此,所以我很困惑。你能告诉我是否是这种情况或者我如何改变它以输出每个单个lstm-cell的输入矢量大小的矢量?
答案 0 :(得分:4)
我认为主要的困惑在于LSTM细胞论证的术语:num_units
。不幸的是,顾名思义,它并不意味着" no。 LSTM细胞"这应该等于你的时间步数。它们实际上对应于隐藏状态(单元状态+隐藏状态向量)中的维数。
对dynamic_rnn()
的调用会返回一个形状的张量:[batch_size, time_steps, output_size]
其中,
(请注意这一点)output_size = num_units;如果(num_proj = None)在lstm单元格中
其中,output_size = num_proj;如果它被定义。
现在,通常,您将提取最后一次time_step的结果,并使用手动mat-mul + biases
操作将其投影到输出维度的大小,或者使用LSTM单元格中的num_proj参数。
我经历了同样的困惑,不得不看起来非常深入,以清除它。希望这个答案可以解决其中的一些问题。