Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 Tensorflow 1.1 MultiRNNCell形状错误(初始状态相关)_Python_Tensorflow - Fatal编程技术网

Python Tensorflow 1.1 MultiRNNCell形状错误(初始状态相关)

Python Tensorflow 1.1 MultiRNNCell形状错误(初始状态相关),python,tensorflow,Python,Tensorflow,更新:我坚信错误与创建的init_状态有关,并作为参数输入tf.nn.dynamic_rnn(…)。所以问题变成了,堆叠RNN初始状态的正确形状或构造方式是什么 我正在尝试在TensorFlow 1.1中使用MultiRNNCell定义 图形定义,以及定义GRU单元的辅助函数,如下所示。其基本思想是将占位符x定义为一长串数字数据样本。该数据将通过整形分解为等长的帧,并在每个时间步显示一帧。然后我想通过两个(目前)GRU单元的堆栈来处理这个问题 def gru_cell(state_size):

更新:我坚信错误与创建的init_状态有关,并作为参数输入tf.nn.dynamic_rnn(…)。所以问题变成了,堆叠RNN初始状态的正确形状或构造方式是什么

我正在尝试在TensorFlow 1.1中使用MultiRNNCell定义

图形定义,以及定义GRU单元的辅助函数,如下所示。其基本思想是将占位符x定义为一长串数字数据样本。该数据将通过整形分解为等长的帧,并在每个时间步显示一帧。然后我想通过两个(目前)GRU单元的堆栈来处理这个问题

def gru_cell(state_size):
     cell = tf.contrib.rnn.GRUCell(state_size)
     return cell

graph = tf.Graph()
with graph.as_default():

     x = tf.placeholder(tf.float32, [batch_size, num_samples], name="Input_Placeholder")
     y = tf.placeholder(tf.int32, [batch_size, num_frames], name="Labels_Placeholder")

     init_state = tf.zeros([batch_size, state_size], name="Initial_State_Placeholder")

     rnn_inputs = tf.reshape(x, (batch_size, num_frames, frame_length))
     cell = tf.contrib.rnn.MultiRNNCell([gru_cell(state_size) for _ in range(2)], state_is_tuple=False)
     rnn_outputs, final_state = tf.nn.dynamic_rnn(cell, rnn_inputs, initial_state=init_state) 
图的定义从这里开始,包括损失函数、优化器等,但这就是它出现以下冗长错误的地方

在错误的最后一部分,批处理大小是10,帧长度和状态大小都是80,这将变得相关

ValueError                                Traceback (most recent call last)
<ipython-input-30-4c48b596e055> in <module>()
     14     print(rnn_inputs)
     15     cell = tf.contrib.rnn.MultiRNNCell([gru_cell(state_size) for _ in range(2)], state_is_tuple=False)
---> 16     rnn_outputs, final_state = tf.nn.dynamic_rnn(cell, rnn_inputs, initial_state=init_state)
     17 
     18     with tf.variable_scope('softmax'):

/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in dynamic_rnn(cell, inputs, sequence_length, initial_state, dtype, parallel_iterations, swap_memory, time_major, scope)
    551         swap_memory=swap_memory,
    552         sequence_length=sequence_length,
--> 553         dtype=dtype)
    554 
    555     # Outputs of _dynamic_rnn_loop are always shaped [time, batch, depth].

/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in _dynamic_rnn_loop(cell, inputs, initial_state, parallel_iterations, swap_memory, sequence_length, dtype)
    718       loop_vars=(time, output_ta, state),
    719       parallel_iterations=parallel_iterations,
--> 720       swap_memory=swap_memory)
    721 
    722   # Unpack final output if not using output tuples.

/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in while_loop(cond, body, loop_vars, shape_invariants, parallel_iterations, back_prop, swap_memory, name)
   2621     context = WhileContext(parallel_iterations, back_prop, swap_memory, name)
   2622     ops.add_to_collection(ops.GraphKeys.WHILE_CONTEXT, context)
-> 2623     result = context.BuildLoop(cond, body, loop_vars, shape_invariants)
   2624     return result
   2625 

/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in BuildLoop(self, pred, body, loop_vars, shape_invariants)
   2454       self.Enter()
   2455       original_body_result, exit_vars = self._BuildLoop(
-> 2456           pred, body, original_loop_vars, loop_vars, shape_invariants)
   2457     finally:
   2458       self.Exit()

/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in _BuildLoop(self, pred, body, original_loop_vars, loop_vars, shape_invariants)
   2435     for m_var, n_var in zip(merge_vars, next_vars):
   2436       if isinstance(m_var, ops.Tensor):
-> 2437         _EnforceShapeInvariant(m_var, n_var)
   2438 
   2439     # Exit the loop.

/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control_flow_ops.pyc in _EnforceShapeInvariant(merge_var, next_var)
    565           "Provide shape invariants using either the `shape_invariants` "
    566           "argument of tf.while_loop or set_shape() on the loop variables."
--> 567           % (merge_var.name, m_shape, n_shape))
    568   else:
    569     if not isinstance(var, (ops.IndexedSlices, sparse_tensor.SparseTensor)):

ValueError: The shape for rnn/while/Merge_2:0 is not an invariant for the loop. It enters the loop with shape (10, 80), but has shape (10, 160) after one iteration. Provide shape invariants using either the `shape_invariants` argument of tf.while_loop or set_shape() on the loop variables.
ValueError回溯(最近一次调用)
在()
14打印(rnn_输入)
15单元格=tf.contrib.rnn.multirncell([gru\u单元格(状态大小)用于范围(2)],状态为\u元组=False)
--->16个rnn_输出,最终_状态=tf.nn.dynamic_rnn(单元,rnn_输入,初始_状态=初始_状态)
17
18带有tf.变量_范围(“softmax”):
/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc,动态(单元格、输入、序列长度、初始状态、数据类型、并行迭代、交换内存、时间、范围)
551交换内存=交换内存,
552序列长度=序列长度,
-->553数据类型=数据类型)
554
555#动态循环的输出总是成形的[时间、批次、深度]。
/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/rnn.pyc in\u dynamic\u rnn\u循环(单元、输入、初始状态、并行迭代、交换内存、序列长度、数据类型)
718循环变量=(时间、输出、状态),
719并行迭代=并行迭代,
-->720交换内存=交换内存)
721
722#如果不使用输出元组,则解压缩最终输出。
/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control\u flow\u ops.pyc在while\u循环中(cond、body、loop\u vars、shape\u不变量、并行迭代、back\u prop、swap\u memory、name)
2621 context=WhileContext(并行迭代、备份、交换内存、名称)
2622操作。将_添加到_集合(ops.GraphKeys.WHILE_上下文,CONTEXT)
->2623 result=context.BuildLoop(条件、主体、循环变量、形状不变量)
2624返回结果
2625
/BuildLoop中的home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control\u flow\u ops.pyc(self、pred、body、loop\u vars、shape\u不变量)
2454 self.Enter()
2455原始\u body\u结果,退出\u vars=self.\u BuildLoop(
->2456 pred,主体,原始循环变量,循环变量,形状不变量)
2457最后:
2458 self.Exit()
/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control\u flow\u ops.pyc in\u BuildLoop(self、pred、body、original\u loop\u vars、loop\u vars、shape\u不变量)
2435对于zip中的m_变量、n_变量(合并变量、下一个变量):
2436如果存在(m_变量,运算张量):
->2437强制形状变量(m变量,n变量)
2438
2439#退出循环。
/home/novak/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/control\u flow\u ops.pyc in\u EnforceShapeInvariant(merge\u var,next\u var)
565“使用'shape\u invariants'提供形状不变量”
566“tf.while_loop的参数或在循环变量上设置_shape()
-->567%(合并变量名称、m_形状、n_形状))
568其他:
569如果不存在(var,(操作指数、稀疏张量、稀疏传感器)):
ValueError:rnn/while/Merge_2:0的形状不是循环的不变量。它以形状(10,80)进入循环,但在一次迭代后具有形状(10,160)。使用tf.while\u loop的'shape\u invariants'参数提供形状不变量,或者在循环变量上设置\u shape()。

这看起来就像网络从两层80开始,然后以某种方式转换成一层160。有人帮我修这个吗?我是否误解了MultiRNNCell的使用?

根据Allen Lavoie的上述评论,更正的代码是:

def gru_cell(state_size):
     cell = tf.contrib.rnn.GRUCell(state_size)
     return cell

num_layers = 2  # <---------
graph = tf.Graph()
with graph.as_default():

     x = tf.placeholder(tf.float32, [batch_size, num_samples], name="Input_Placeholder")
     y = tf.placeholder(tf.int32, [batch_size, num_frames], name="Labels_Placeholder")

     init_state = tf.zeros([batch_size, num_layer * state_size], name="Initial_State_Placeholder") # <---------

     rnn_inputs = tf.reshape(x, (batch_size, num_frames, frame_length))
     cell = tf.contrib.rnn.MultiRNNCell([gru_cell(state_size) for _ in range(num_layer)], state_is_tuple=False) # <---------
     rnn_outputs, final_state = tf.nn.dynamic_rnn(cell, rnn_inputs, initial_state=init_state) 
def gru单元(状态大小):
单元格=tf.contrib.rnn.GRUCell(状态大小)
返回单元

num_layers=2#这不应该是
init_state=tf.zero([batch_size,2*state_size]…