2017-07-03 2 views
1

J'ai créé un programme TensorFlow simple qui essaie de prédire le caractère suivant en utilisant les 3 caractères précédents dans un corps de texte.Séquence de sortie dans TensorFlow RNN

Une seule entrée pourrait ressembler à ceci:

np.array(['t','h','i']) 

avec l'objectif d'être

np.array(['s']) 

Je suis en train d'étendre cette option pour sortir le caractère suivant par exemple 4 plutôt que la prochaine personnage. Pour ce faire, j'ai essayé de l'alimentation dans un tableau plus à y

np.array(['s','','i']) 

En plus de changer l'y à

y = tf.placeholder(dtype=tf.int32, shape=[None, n_steps]) 

cependant, cela donne l'erreur:

Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2).

est complet ici code

embedding_size=40 
n_neurons = 200 
n_output = vocab_size 
learning_rate = 0.001 

with tf.Graph().as_default(): 
    x = tf.placeholder(dtype=tf.int32, shape=[None, n_steps]) 
    y = tf.placeholder(dtype=tf.int32, shape=[None]) 
    seq_length = tf.placeholder(tf.int32, [None]) 

    # Let's set up the embedding converting words to vectors 
    embeddings = tf.Variable(tf.random_uniform(shape=[vocab_size, embedding_size], minval=-1, maxval=1)) 
    train_input = tf.nn.embedding_lookup(embeddings, x) 

    basic_cell = tf.nn.rnn_cell.GRUCell(num_units=n_neurons) 
    outputs, states = tf.nn.dynamic_rnn(basic_cell, train_input, sequence_length=seq_length, dtype=tf.float32) 

    logits = tf.layers.dense(states, units=vocab_size, activation=None) 
    predictions = tf.nn.softmax(logits) 
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
     labels=y, 
     logits=logits) 
    loss = tf.reduce_mean(xentropy) 
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) 
    training_op = optimizer.minimize(loss) 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 
     for r in range(1000): 
      x_batch, y_batch, seq_length_batch = input_fn() 
      feed_dict = {x: x_batch, y: y_batch, seq_length: seq_length_batch} 
      _, loss_out = sess.run([training_op, loss], feed_dict=feed_dict) 
      if r % 1000 == 0: 
       print("loss_out", loss_out) 

     sample_text = "for th" 
     sample_text_ids = np.expand_dims(np.array([w_to_id[c] for c in sample_text]+[0, 0], dtype=np.int32), 0) 
     prediction_out = sess.run(predictions, feed_dict={x: sample_text_ids, seq_length: np.array([len(sample_text)])}) 
     print("Result:", id_to_w[np.argmax(prediction_out)])  

Répondre

0

Dans le cas de plusieurs RNN, vous devez utiliser tf.contrib.seq2seq.sequence_loss pour calculer la perte de pas par pas de temps. Votre code devrait ressembler à ceci:

... 
logits = tf.layers.dense(states, units=vocab_size, activation=None) 
weights = tf.sequence_mask(seq_length, n_steps) 
xentropy = tf.contrib.seq2seq.sequence_loss(logits, y, weights) 
... 

Voir here pour plus de détails sur tf.contrib.seq2seq.sequence_loss.