2016-12-19 10 views
1

文字(つまり文字レベルのLSTM)を予測するためにPTBデータセットを学習しています。
トレーニングバッチの次元は[len(dataset)x vocabulary_size]です。ここでは、vocabulary_size = 27(26 + 1 [unkトークンとスペースまたは完全ストップの場合])。
これは、バッチ入力(arrX)とラベル(arrY)の両方に対してone_hotに変換するためのコードです。
tflearnのLSTMのDimensionでエラーが発生しました

arrX = np.zeros((len(train_data), vocabulary_size), dtype=np.float32) 
arrY = np.zeros((len(train_data)-1, vocabulary_size), dtype=np.float32) 
for i, x in enumerate(train_data): 
    arrX[i, x] = 1 
arrY = arrX[1, :] 

それはLSTM.Followingをtflearnに渡すグラフで入力(X)とラベル(Y)のプレースホルダを作っていグラフとセッションのためのコードです。 SO

batch_size = 256 
with tf.Graph().as_default(): 
    X = tf.placeholder(shape=(None, vocabulary_size), dtype=tf.float32)  
    Y = tf.placeholder(shape=(None, vocabulary_size), dtype=tf.float32)  
    print (utils.get_incoming_shape(tf.concat(0, Y))) 
    print (utils.get_incoming_shape(X)) 
    net = tflearn.lstm(X, 512, return_seq=True) 
    print (utils.get_incoming_shape(net)) 
    net = tflearn.dropout(net, 0.5) 
    print (utils.get_incoming_shape(net)) 
    net = tflearn.lstm(net, 256) 
    net = tflearn.fully_connected(net, vocabulary_size, activation='softmax') 
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(net, Y)) 
    optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    offset=0 
    avg_cost = 0 
    total_batch = (train_length-1)/256 
    print ("No. of batches:", '%d' %total_batch) 
    for i in range(total_batch) : 
     batch_xs, batch_ys = trainX[offset : batch_size + offset], trainY[offset : batch_size + offset] 
     sess.run(optimizer, feed_dict={X: batch_xs, Y: batch_ys}) 
     cost = sess.run(loss, feed_dict={X: batch_xs, Y: batch_ys}) 
     avg_cost += cost/total_batch 
     if i % 20 == 0: 
      print("Step:", '%03d' % i, "Loss:", str(cost)) 
     offset += batch_size  

、私はassert ndim >= 3, "Input dim should be at least 3." AssertionError: Input dim should be at least 3.

どのようにresolve this errorすることができ、次のエラーを取得しますか?代替ソリューションはありますか? 別のLSTM定義を記述する必要がありますか?

答えて

0

私はこれらの種類のデータセットには慣れていませんが、tflearn.input_data(shape)をtflearn.embeddingレイヤーで使用しようとしましたか?埋め込みを使用する場合、3次元でデータを再形成する必要はないと思います。

0

lstmレイヤーは、形状3次元テンソル[サンプル、タイムステップ、入力淡色]の入力を受け取ります。入力データを3Dに変形することができます。あなたの問題の形でtrainX[len(dataset) x vocabulary_size]です。 trainX = trainX.reshape(trainX.shape+ (1,))の形状を使用すると、[len(dataset), vocabulary_size, 1]に変更されます。このデータは、入力プレースホルダXの単純な変更によってlstmに渡すことができます。プレースホルダにもう1つディメンションをX = tf.placeholder(shape=(None, vocabulary_size, 1), dtype=tf.float32)で追加します。

関連する問題