2016-11-21 4 views
1

テンソルフローチュートリアルと同様のRNNを逐次データ用にトレーニングしています。データは[batch_size、step、dimension]で、ラベルは[batch_size、num_classes]です。バッチトレーニングでsession.runのTensorflow ValueError

シーケンスの長さがサンプルによって異なるので、バッチトレーニングを作成したいと思います - 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、ステップ、DIM]、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 :(オプション)[batch_size]のサイズのint32/int64ベクトルです。

それに応じてseqlen配列を作成してみてください。 これが役立つことを願っています。

関連する問題