Python 堆叠LSTM单元的所有输出之和-Tensorflow
在这里,您可以看到TensorFlow中几个堆叠LSTM单元的标准实现Python 堆叠LSTM单元的所有输出之和-Tensorflow,python,tensorflow,deep-learning,lstm,recurrent-neural-network,Python,Tensorflow,Deep Learning,Lstm,Recurrent Neural Network,在这里,您可以看到TensorFlow中几个堆叠LSTM单元的标准实现 with tf.name_scope("RNN_layers"): def lstm_cell(): lstm = tf.contrib.rnn.LayerNormBasicLSTMCell(lstm_size) return lstm cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(num_laye
with tf.name_scope("RNN_layers"):
def lstm_cell():
lstm = tf.contrib.rnn.LayerNormBasicLSTMCell(lstm_size)
return lstm
cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(num_layers)])
with tf.name_scope("RNN_init_state"):
initial_state = cell.zero_state(batch_size, tf.float32)
with tf.name_scope("RNN_forward"):
outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)
这对于许多任务都非常有效。然而,在其他情况下,一些专家建议将堆中所有单元格的输出总和作为最终输出,沿num_层
方向,而不仅仅是最后一个单元格的输出
在下图中,要求是y\u t=h\u t^1+h\u t^2+h\u t^3
在TensorFlow中实现这一点最聪明的方法是什么?您从中获得的
输出是所有单元格的输出列表。如果要计算它们的总和,只需调用输出
:
n_步数=2
n_输入=3
n_神经元=5
X=tf.placeholder(dtype=tf.float32,shape=[无,n个步骤,n个输入])
基本细胞=tf.nn.rnn细胞.基本细胞(数量单位=n个神经元)
输出,状态=tf.nn.dynamic(基本单元,X,数据类型=tf.float32)
#输出=[?,n_步数,n_神经元],例如来自所有细胞的输出
总和=tf。减少总和(输出,轴=1)
#总和=[?,n_神经元]
对于MultiRNNCell
,它将是最后一层输出的总和,这也是您通常想要的
更新:
由于tensorflowMultiRNNCell
对每个单元格的输出重复使用相同的张量,因此隐藏层从RNN中永远不会暴露出来,因此汇总隐藏层的张量将更加困难
最简单的解决方案是编写自己的代码,对每一层的输出进行汇总,而不是只记住最后一层。以下是如何做到这一点:
来自tensorflow.python.util导入嵌套
类MyMultirNcell(tf.nn.rnn\u cell.MultirNcell):
def调用(自身、输入、状态):
当前状态位置=0
cur_inp=输入
新的州=[]
新的_输出=[]
对于i,枚举中的单元格(self.\u单元格):
使用tf.variable\u作用域(“单元格%d”%i):
如果self.\u state\u是\u元组:
如果不是nest.is_序列(状态):
raise VALUERROR(“预期状态为长度为%d的元组,但收到:%s”%
(透镜(自身状态尺寸),状态)
cur_state=状态[i]
其他:
cur\u state=tf.slice(状态,[0,cur\u state\u pos],-1,cell.state\u size])
cur_state_pos+=cell.state_大小
电流输入,新状态=单元(电流输入,电流状态)
新增状态。追加(新增状态)
新增输出。追加(当前输入)
new_states=(tuple(new_states)如果self._state_是tuple else
concat工作队(纽约州,1))
新的_输出_和=tf。减少_和(新的_输出,轴=0)
返回新的\u输出\u和,新的\u状态
恐怕我的问题不够清楚,我会马上编辑它。总和应沿着num\u层
方向,而不是沿着n\u步
1。我将添加一张图片above@Jjm哦,我明白了。我要再次检查,但我认为需要重写tf.nn.dynamic\u rnn
。。。你确定这个总数有意义吗?我从(网络结构的最后一个技巧)中读到了这个想法。我真的不知道这是否有意义,但我想尝试一下…@Jim请查看更新,我想我有办法做到这一点