Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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
Python 堆叠LSTM单元的所有输出之和-Tensorflow_Python_Tensorflow_Deep Learning_Lstm_Recurrent Neural Network - Fatal编程技术网

Python 堆叠LSTM单元的所有输出之和-Tensorflow

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

在这里,您可以看到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_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
,它将是最后一层输出的总和,这也是您通常想要的


更新:

由于tensorflow
MultiRNNCell
对每个单元格的输出重复使用相同的张量,因此隐藏层从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请查看更新,我想我有办法做到这一点