2016-11-21 171 views
1

我训练一个类似于在tensorflow教程,为连续数据的RNN session.run Tensorflow ValueError异常。数据是[batch_size,step,dimension],标签是[batch_size,num_classes]。由于不同样本的序列长度不同,因此我想创建批次训练 - 每次抓取32个样本数据时,将它们填充到最长的序列大小,然后将它们送入rnn图形进行训练。上一批培训

的数据被定义为:

data = DataGenerator(data_path, label_path) 
train_data, train_label, train_seqlen, test_data, test_label = data.train_test_data(0.2)  
x = tf.placeholder(tf.float32, [batch_size, None, num_dim]) 
y = tf.placeholder(tf.float32, [batch_size, num_classes]) 
seqlen = tf.placeholder(tf.int32, [batch_size]) 
model = VariableSeqModel(x, y, seqlen) 

Train_data是[batch_size时,步骤,暗淡],train_label是[batch_size时,num_classes]。 Seqlen是[batch_size时,1]用于记录样品的实际序列长度中的每个批次。这是否正确,我将x定义为[batch_size,None,num_dim]用于变量序列长度?

限定RNN和数据结构,启动会话,因为这代码示例中后:

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    step = 1 
    while step*batch_size < 1000: 
     batch_xx, batch_y, batch_seqlen = data.next(batch_size, train_data, train_label, train_seqlen) 
     batch_x = data.batch_padding(batch_xx,batch_seqlen) 
     sess.run(model.optimize, feed_dict={x: batch_xx, y: batch_y, seqlen: batch_seqlen}) 

     step += 1 

我打于以下ValueError异常(下面堆栈跟踪):

dynamic_rnn.py in <module>() 
--> 129 sess.run(model.optimize, feed_dict={x: batch_xx, y: batch_y, seqlen: batch_seqlen}) 

tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata) 
    708 try: 
    709 result = self._run(None, fetches, feed_dict, options_ptr, 
--> 710 run_metadata_ptr) 
    711 if run_metadata: 
    712 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) 

tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata) 
    879 ' to a larger type (e.g. int64).') 
    880 
--> 881 np_val = np.asarray(subfeed_val, dtype=subfeed_dtype) 
    882 
    883 if not subfeed_t.get_shape().is_compatible_with(np_val.shape): 

numpy/core/numeric.pyc in asarray(a, dtype, order) 
    480 
    481 """ 
--> 482 return array(a, dtype, copy=False, order=order) 
    483 
    484 def asanyarray(a, dtype=None, order=None): 

ValueError: setting an array element with a sequence. 

我在难倒这点。任何帮助感谢!

回答

0

问题解决了。只需声明seqlen = tf.placeholder(tf.int32, [None]),它的效果很好。 “[无]”表示批量大小的动态张量类型,batch_size只是tf.int32。

0

我不是专家,但在我看来,这个问题是在这里

Seqlen为[batch_size时,1]

由于tensorflow教程提出,序列长度应该是

sequence_length:(可选)一个Int32/int64类型矢量大小[的batch_size]。

您可以通过相应填充您的seqlen阵列尝试。 希望这会有所帮助。