2016-11-21 3 views
1

Я тренирую RNN, подобный тому, который используется в обучающем курсе tensorflow, для последовательных данных. Данные: [batch_size, step, dimension], а метки - [batch_size, num_classes].Tensorflow ValueError на session.run с пакетным обучением

Поскольку длина последовательности различна для разных образцов, я хотел бы создать пакетное обучение - каждый раз я собираю 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] для переменной длины последовательности?

После определения структуры РНН и данных, запуск сеанса, как в этом примере кода:

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 (StackTrace ниже):

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 соответствующим образом. Надеюсь, это поможет.

Смежные вопросы