2016-12-19 2 views
1

J'entraîne l'ensemble de données PTB pour prédire les caractères (c'est-à-dire LSTM au niveau du caractère).
La dimension pour l'apprentissage des lots est [len (dataset) x vocabulary_size]. Ici, vocabulary_size = 27 (26 + 1 [pour les jetons et espaces unk ou fullstops.]).
Il s'agit du code de conversion en one_hot pour les deux entrées de lot (arrX) et les étiquettes (arrY).
Erreur dans la dimension pour LSTM dans tflearn

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, :] 

je fais dans un espace réservé graphique d'entrée (X) et les étiquettes (Y) pour passer à tflearn LSTM.Following est le code pour le graphique et session.

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  

SO, je reçois l'erreur suivante assert ndim >= 3, "Input dim should be at least 3." AssertionError: Input dim should be at least 3.

Comment puis-je resolve this error? Y a-t-il une autre solution? Dois-je écrire une définition LSTM séparée?

Répondre

0

Je ne suis pas habitué à ce type de jeu de données mais avez-vous essayé d'utiliser tflearn.input_data (shape) avec le calque tflearn.embedding? Si vous utilisez l'intégration je suppose que vous n'aurez pas à remodeler vos données en 3 dimensions. La couche lstm prend l'entrée de la forme Tenseur 3-D [échantillons, timesteps, dim d'entrée]

0

Vous pouvez remodeler vos données d'entrée en 3D. Dans votre forme de problème de trainX est [len(dataset) x vocabulary_size]. En utilisant trainX = trainX.reshape(trainX.shape+ (1,)) forme sera changé en [len(dataset), vocabulary_size, 1]. Ces données peuvent être transmises à lstm par simple modification de l'espace réservé d'entrée X. Ajouter une dimension supplémentaire à l'espace réservé par X = tf.placeholder(shape=(None, vocabulary_size, 1), dtype=tf.float32).